声明:
本文只是在技术上分析如何来通过sniffer来劫持winnt/2k的hash,对此文可能造成的危害不负任何责任。
引言:
近来SMB会话劫持的讨论占据了个大技术论坛不少的位置,吸引了不少人的目光,同时绿盟月刊37期、Phrack杂志60期和安全焦点峰会也刊登出了相关的文章,使得SMB会话劫持成为一个热点。由于是window设计上的缺陷,这是一种无法察觉又非常可怕的***方法。本文试图从SMB数据包分析的角度来说明如何截获winnt/2k的hash,具体的实现就不公布了,请读者牢记前面的声明。
说明:
为了使文章有针对性,关于SMB协议以及SMB会话过程就不谈了,用到的时候会一带而过,感兴趣的朋友请自行查询附录中的参考文档。文中提到的数据包如果没有特别说明都是通过Sniffer pro截获到的,并且为了分析方便,去掉了物理帧头、IP头和TCP头,只留下NETB和SMB部分。
正文:
假设两台机器,一台为Client A,一台为SMBServer B。
一、session的建立:
设法让A去访问B的特定资源,产生一个NETBIOS会话。A发送Session request,其中包括经过编码的NETBIOS名字。B在139端口监听连接,收到A的request后,B发送Session confirm,其中没有任何内容。这样就建立了一个有效的session。其中Session request数据包的NETB Type为0x81,Session confirm数据包的NETB Type为0x82,可以在程序中通过判断这两个标志来确定是否产生一个有效的session,然后就可以想办法截获SMB包了。
二、Challenge的获得:
当有效的session建立后,就开始进行连接的确认工作了,从这一步中可以得到B发送给A的由B随机产生的Challenge。
过程如下:A向B发送一个身份认证的请求,B随机产生一个8字节的Challenge发送给A,这个Challenge就包含在B发回给A的Server Response数据包中。用Sniffer pro截获这个包后,去掉物理帧头、IP头和TCP头,再去掉4个字节的NETB头,剩下的就是SMB包的内容,再去掉33个字节长的SMB Reponse header,然后向后做36个字节的偏移,下面的就是长度为8个字节的Challenge。这样就得到了我们需要的服务器随机产生的Challenge。
(由于本文的目的在于散列截获的实现,所以数据包内个字节内容的具体含义不做任何解释,只说明位置,下文也遵循这个原则。想深入了解的朋友请参阅附录的参考文档)
三、LM&NT HASH的获得:
A得到B发回的用于加密口令的Challenge后,向B发送建立空连接的请求,B返回Server Response包,此时IPC空连接成功建立。A然后发送LM&NT HASH给B,请求访问特定的资源,等待B的允许。我们需要做的就是截获A发送的这个SMB包。下面来看怎么拆解出HASH,还是去掉物理帧头、IP头和TCP头,再去掉4个字节的NETB头,剩下的就是SMB包的内容,再去掉33个字节长的SMB Reponse header,然后向后做28个字节的偏移,下面的24个字节的内容就是LM HASH,紧接着的24个字节就是NT HASH。现在我们就获得了A主机的LM HASH和NT HASH。
四、HASH的破解
前面已经获得了Challenge、LM HASH和NT HASH,现在我们做成lc文件格式,下面就是导入lc4来暴力破解了。lc的文件格式如下:
192.168.0.244 ADMINIST-7Z6A4E\Administrator:"":"":89E5E3F54A998398DC36E89DDD37334C801201CA39C9A5D3:8457623684F27A5EFA5FE7B647E87C36D78616F80594123C:E3A96FF4507B9EDF
后面的三列数字分别为LM HASH、NT HASH、Challenge。
五、总结
本文旨在于讨论winnt/2k下SMB会话劫持的实现,相关问题请查阅参考文档。因为***方法复杂,并且需要一定的基础,所以,掌握的人并不多。我已经尽量写地简单,只要按照以上的步骤去做就能实现,具体的代码实现就不写了,有兴趣的朋友自己去研究吧。