TCP安全测试指南-魔兽3找联机0day
lxj616 · 2016/05/03 10:54
在安全測(cè)試的過程中,我們通常使用應(yīng)用層工具直接測(cè)試待測(cè)目標(biāo),比如一個(gè)HTTP網(wǎng)站應(yīng)用程序,我們可以直接發(fā)送HTTP請(qǐng)求來對(duì)其進(jìn)行模糊測(cè)試,而對(duì)于HTTPS,也可以建立SSL連接后直接發(fā)送HTTP請(qǐng)求對(duì)其進(jìn)行模糊測(cè)試
然而在某些黑盒測(cè)試中,由于信息不對(duì)稱,我們無法獲悉應(yīng)用層協(xié)議的具體格式,因此難以直接在應(yīng)用層進(jìn)行安全測(cè)試,這時(shí)我們需要對(duì)應(yīng)用層協(xié)議本身進(jìn)行FUZZ,這就需要使用更底層協(xié)議來進(jìn)行安全測(cè)試
本文以著名的RTS游戲魔獸爭(zhēng)霸3為例,介紹在網(wǎng)絡(luò)層對(duì)TCP連接進(jìn)行安全測(cè)試的基本工具、方法、以及漏洞挖掘思路
0x00 概述
我想測(cè)試魔獸爭(zhēng)霸3聯(lián)機(jī)游戲的安全問題
然而魔獸爭(zhēng)霸3并沒有使用HTTP協(xié)議來進(jìn)行通信,因此我既不能用burp來proxy攔截,也不能直接用curl等常用工具來進(jìn)行FUZZ
魔獸爭(zhēng)霸3聯(lián)機(jī)對(duì)戰(zhàn)使用了TCP連接,自己定義了一套數(shù)據(jù)包格式(已經(jīng)有人分析過了,但在本文中我們假設(shè)數(shù)據(jù)包格式未知)
所以我要在傳輸層對(duì)魔獸爭(zhēng)霸3的TCP連接進(jìn)行安全測(cè)試,重點(diǎn)測(cè)試以下內(nèi)容:
0x01 斷線測(cè)試
由于魔獸爭(zhēng)霸3并沒有斷線重連機(jī)制,所以TCP連接斷開后會(huì)直接導(dǎo)致游戲斷開,而在許多第三方對(duì)戰(zhàn)平臺(tái)上,玩家的離線等同于戰(zhàn)敗,因此也誕生了許多游戲“踢人”外掛
下面使用WooyunWifi路由器上的dsniff工具包中的tcpkill工具為例進(jìn)行測(cè)試:
[email?protected]:~# tcpkill -i br-lan port 6112 tcpkill: listening on br-lan [port 6112] 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503812:2875503812(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504063:2875504063(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504565:2875504565(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503812:2875503812(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504063:2875504063(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504565:2875504565(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970133:2041970133(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970389:2041970389(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970901:2041970901(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503818:2875503818(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504069:2875504069(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504571:2875504571(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970133:2041970133(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970389:2041970389(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970901:2041970901(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503824:2875503824(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504075:2875504075(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504577:2875504577(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970142:2041970142(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970398:2041970398(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970910:2041970910(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503824:2875503824(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504075:2875504075(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504577:2875504577(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970151:2041970151(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970407:2041970407(0) win 0 192.168.1.163:6112 > 192.168.1.143:59892: R 2041970919:2041970919(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503830:2875503830(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504081:2875504081(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875504583:2875504583(0) win 0 192.168.1.143:59892 > 192.168.1.163:6112: R 2875503830:2875503830(0) win 0 復(fù)制代碼這里演示的是全局切斷,在實(shí)際應(yīng)用場(chǎng)景中也可以使用包過濾表達(dá)式切斷特定IP的連接
0x02 網(wǎng)絡(luò)的延遲與丟包
由于魔獸爭(zhēng)霸3是一個(gè)實(shí)時(shí)對(duì)戰(zhàn)的游戲,因此網(wǎng)絡(luò)狀態(tài)也會(huì)影響游戲的進(jìn)行,魔獸爭(zhēng)霸3本身對(duì)于實(shí)時(shí)操作的要求并不高,但是形如DOTA之類的自定義游戲模式對(duì)網(wǎng)絡(luò)的延遲極為敏感,如果玩家在DOTA游戲中有很大延遲,可能會(huì)直接導(dǎo)致團(tuán)滅并且游戲失敗
下面使用WooyunWifi路由器上的tc工具中的netem內(nèi)核模塊為例進(jìn)行測(cè)試:
tc qdisc add dev wlan0 root netem delay 1s 復(fù)制代碼由于網(wǎng)絡(luò)延遲,玩家控制的英雄在延時(shí)時(shí)間內(nèi)無法響應(yīng)玩家的操作
當(dāng)然,您也可以用包過濾表達(dá)式指定任意ip的延時(shí)規(guī)則,包括隨機(jī)浮動(dòng)的延時(shí)時(shí)間
0x03 TCP原始數(shù)據(jù)的嗅探/修改
如何嗅探TCP數(shù)據(jù)包已經(jīng)是婦孺皆知的常識(shí)了,用wireshark或者tcpdump之類的都可以
至于如何修改TCP數(shù)據(jù)包,我推薦使用TCP透明代理模式來進(jìn)行操作,原理其實(shí)和HTTP透明代理相似
至于工具我測(cè)試了3款,各有千秋:netsed簡(jiǎn)單實(shí)用少依賴,mitmproxy無比強(qiáng)大有擴(kuò)展,bettercap則是替代ettercap的ruby工具
首先,我們?cè)?1對(duì)戰(zhàn)平臺(tái)上新建一個(gè)房間,然后打開wireshark,抓取war3的服務(wù)器端口(11對(duì)戰(zhàn)平臺(tái)使用的是服務(wù)器建主策略,并不是玩家建立主機(jī),而是在服務(wù)器上有一個(gè)proxy專門用來與各個(gè)客戶端通信)
我們可以看到建主服務(wù)器ip為119.188.39.137,端口為2012,而聊天數(shù)據(jù)以及最開始交換用戶名的數(shù)據(jù)都是明文的,而且后來測(cè)試發(fā)現(xiàn)也沒有數(shù)據(jù)完整性驗(yàn)證
下面使用WooyunWifi路由器上的netsed工具為例進(jìn)行測(cè)試:
iptables -t nat -A PREROUTING -p tcp --dport 2012 -j REDIRECT --to 10101netsed tcp 10101 119.188.39.137 2012 s/lxj616/wooyunnetsed 1.2 by Julien VdG <[email?protected]>based on 0.01c from Michal Zalewski <[email?protected]> [*] Parsing rule s/lxj616/wooyun... [+] Loaded 1 rule... [+] Using fixed forwarding to 119.188.39.137,2012. [+] Listening on port 10101/tcp. [+] Got incoming connection from 192.168.1.163,53956 to 119.188.39.137,2012 [*] Forwarding connection to 119.188.39.137,2012 [+] Got incoming connection from 192.168.1.143,50527 to 119.188.39.137,2012 [*] Forwarding connection to 119.188.39.137,2012 [+] Caught client -> server packet. [*] Forwarding untouched packet of size 771. [+] Caught client -> server packet. [*] Forwarding untouched packet of size 791. [+] Caught server -> client packet. [*] Forwarding untouched packet of size 24. [+] Caught server -> client packet. [*] Forwarding untouched packet of size 24. [+] Caught client -> server packet. 復(fù)制代碼于是整局游戲里lxj616都在其他用戶眼里變成了wooyun,包括聊天和玩家列表
當(dāng)然,netsed只有簡(jiǎn)單的替換功能,下面介紹一些更靈活的解決方案(不再以war3為例)
mitmproxy的官方示例介紹了如何修改TCP數(shù)據(jù)
https://github.com/mitmproxy/mitmproxy/blob/master/examples/tcp_message.py 復(fù)制代碼下面使用Woobuntu系統(tǒng)上的mitmproxy工具為例進(jìn)行測(cè)試:
bettercap的官方示例介紹了如何修改TCP數(shù)據(jù):
https://www.bettercap.org/docs/proxying/tcp.html#sample-module 復(fù)制代碼下面使用Woobuntu系統(tǒng)上的bettercap工具為例進(jìn)行測(cè)試:
注:tcp-proxy剛開始時(shí)顯示未啟動(dòng),后面在輸出信息中后續(xù)啟動(dòng)的tcp-proxy
0x04 TCP連接的重放與交互式測(cè)試
如果只是想要重放TCP的數(shù)據(jù)包本身而非TCP連接,使用tcpreplay工具直接重放即可,這種方式確實(shí)可以把之前抓取的pcap數(shù)據(jù)包全部重放到指定的interface上,這在測(cè)試一些IDS設(shè)備或者有抓包業(yè)務(wù)邏輯的應(yīng)用時(shí)能起到預(yù)期的效果
下面使用Woobuntu系統(tǒng)上的tcpreplay工具為例進(jìn)行測(cè)試:
tcpreplay -i enp0s3 test.pcap 復(fù)制代碼然而僅僅重放抓取的數(shù)據(jù)包并不能建立有效的tcp連接,因此也不會(huì)被服務(wù)端正確的響應(yīng),這樣就起不到FUZZ服務(wù)端應(yīng)用的作用了,我們?nèi)绻胍头?wù)端模擬一次真正的TCP會(huì)話,就必須在建立新連接后重新填寫數(shù)據(jù)包對(duì)應(yīng)的TCP序列號(hào)。形象的比喻一下就是你在重放HTTP請(qǐng)求時(shí)要修改你自己cookie里面的session-id
如果要重放tcp連接,可以使用tcpreplay系列工具中的tcpliveplay工具:
http://tcpreplay.appneta.com/wiki/tcpliveplay.html 復(fù)制代碼不過我必須說這工具兼容性太差了,必須要按照官方文檔中的Fresh Install Guide來配置特殊依賴,而且內(nèi)核不可以用新版本,因此在Woobuntu 16.04上根本無法正常運(yùn)行該工具
不過使用tcpliveplay并不是最好的辦法,因?yàn)樗脑硎墙馕霾⑿薷膖cp協(xié)議包,而實(shí)際上我們的目標(biāo)并不是解析并修改傳輸層的tcp協(xié)議包,我們只是要FUZZ上層應(yīng)用,因此我們直接新建一個(gè)tcp連接,然后重放tcp承載的數(shù)據(jù)就可以了
下面以基于Ubuntu的Woobuntu系統(tǒng)為例進(jìn)行測(cè)試,首先安裝所需的tcptrace,以及可能需要的tcpslice
apt install tcptrace tcpslice 復(fù)制代碼之后我們抓取我們想要重放的tcp數(shù)據(jù)包,這里我們用wireshark進(jìn)行抓取,抓取的是玩家lxj616加入房間然后在聊天欄里面說了兩句話整個(gè)過程
您也可以在WooyunWifi路由器上通過tcpdump工具進(jìn)行抓包
tcpdump -i br-lan dst port 6112 -C 100 -z "gzip" -w lxj616.pcap 復(fù)制代碼抓完的包可能會(huì)很大,而路由器存儲(chǔ)空間較小,所以設(shè)置了文件分段,分段的文件形如:
lxj616.pcap
lxj616.pcap1.gz
lxj616.pcap2.gz
(可選)我們可以把他們通過以下命令合在一起:
tcpslice -w full.pcap lxj616.pcap* 復(fù)制代碼在抓到足夠的數(shù)據(jù)包后,我們從中解析出各條tcp連接的數(shù)據(jù):
tcptrace -e lxj616.pcap1 arg remaining, starting with 'lxj616.pcap' Ostermann's tcptrace -- version 6.6.7 -- Thu Nov 4, 200418 packets seen, 18 TCP packets traced elapsed wallclock time: 0:00:00.027297, 659 pkts/sec analyzed trace file elapsed time: 0:00:10.018743 TCP connection info:1: FullMatelErLuLu.lan:51416 - alkaid-PC.lan:6112 (a2b) 10> 8<Warning : some extracted files are incomplete!Please see -l output for more detail. 復(fù)制代碼這個(gè)警告是發(fā)現(xiàn)了不完整的TCP數(shù)據(jù)流,因?yàn)槲覝y(cè)試時(shí)沒點(diǎn)退出游戲就關(guān)閉抓包了
然后在當(dāng)前目錄下會(huì)生成形如a2b_contents.dat或者b2a_contents.dat的文件,找到哪一個(gè)是我們需要重放的流數(shù)據(jù)(同時(shí)注意數(shù)據(jù)方向)
最后我們來重放TCP連接請(qǐng)求測(cè)試:
cat a2b_contents.dat | nc 192.168.1.163 6112 復(fù)制代碼而對(duì)于游戲主機(jī)來說,確實(shí)看起來有玩家跑進(jìn)來說了兩句話
0x05 總結(jié)
雖然在本文中對(duì)魔獸爭(zhēng)霸3測(cè)試時(shí)發(fā)現(xiàn)了一些潛在問題,但都只是程序邏輯的小問題,而非安全性bug,因此在不會(huì)影響游戲平衡性的條件下,不需要把它們當(dāng)做漏洞進(jìn)行報(bào)送(雖然對(duì)于11對(duì)戰(zhàn)平臺(tái)而言,用戶名是不可以修改的,但是你改了又能怎樣,并沒有用),寫出本文來分享思路,供同道中人一起學(xué)習(xí)討論
總結(jié)
以上是生活随笔為你收集整理的TCP安全测试指南-魔兽3找联机0day的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm导出依赖包_使用pycha
- 下一篇: 线性拟合函数