USB 資料包分析
參考文章
https://github.com/AngelKitty/UsbKeyboardDataHacker
https://www.anquanke.com/post/id/85218
https://ludovicrousseau.blogspot.com/2014/10/ccid-usb-spy-using-wireshark.html
環境
Tshark
檔案下載地址
http://shaobaobaoer.cn/cdn/USB-learning.zip
USB 通訊協議簡介
USB是一種協議匯流排,即主機與裝置之間的通訊需要遵循一系列約定。USB介面是目前最為通用的外設介面之一,通過監聽該介面的流量,可以得到很多有意思的東西,例如鍵盤擊鍵,滑鼠移動與點選,儲存裝置的明文傳輸通訊、USB無線網絡卡網路傳輸內容。關於USB協議,可以參考usb.org。文後也有 usb 協議的PDF檔案,內容相當複雜。從USB的製作規範到通訊協議無所不全。在此只是管中窺豹。玩一玩 USB 流量分析
利用 wireshark 可以監聽USB流量。當然也可以使用 wireshark 的命令列工具 Tshark
準備工作
載入 usbmon 核心
sudo modprobe usbmon
tshark 檢視所有可以抓取流量的埠
root@shaobao-Precision-3510:/root# tshark -D Running as user "root" and group "root". This could be dangerous. 1. wlp2s0 2. vmnet1 3. vmnet8 4. any 5. lo (Loopback) 6. enp0s31f6 7. nflog 8. nfqueue 9. usbmon1 10. usbmon2 11. cisco (Cisco remote capture) 12. randpkt (Random packet generator) 13. ssh (SSH remote capture)
檢視USB埠情況
root@shaobao-Precision-3510:/root# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 005: ID 1a2c:0c21 China Resource Semico Co., Ltd # 這個是我的鍵盤 其USB 地址為 1.5.1 Bus 001 Device 003: ID 1bcf:2b91 Sunplus Innovation Technology Inc. Bus 001 Device 006: ID 1c4f:0034 SiGma Micro # 這個是我的滑鼠 其USB 地址為 1.6.1 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
監聽USB流量
tshark -i usbmon1 -w trace1.pcap
之後會在螢幕上發現有數字在跳,按下ctrl-c捕獲結束
我錄製了兩個流量包,分別是
- trace2.pcap
- 滑鼠 流量
- trace3.pcap
- 鍵盤 流量
分析 USB 鍵盤流量
trace3.pcap
利用過濾器 , 可以找到所有我們鍵盤發出的流量。
usb.src == "1.5.1"
Leftover Capture Data
在USB協議的pdf 文件中搜索 keyboard。不難發現這個表(P53頁),實際上這就定義了ABCD等的相關輸入標準。和ASCII碼並不太一樣。
tshark -r trace3.pcap -T fields -e usb.capdata > trace3data.txt
利用該命令提取出那些資料。並儲存。根據協議的內容,我們將該檔案進行二次解碼
mappings = { 0x04:"A",0x05:"B",0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G",0x0B:"H", 0x0C:"I",0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O",0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"n", 0x2a:"[DEL]",0X2B:"", 0x2C:" ",0x2D:"-", 0x2E:"=", 0x2F:"[",0x30:"]",0x31:"\\", 0x32:"~", 0x33:";",0x34:"'", 0x36:",",0x37:"." } nums = [] keys = open('usbdata.txt') for line in keys: if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0': continue nums.append(int(line[6:8],16)) keys.close() output = "" for n in nums: if n == 0 : continue if n in mappings: output += mappings[n] else: output += '[unknown]' print 'output :n' + output
最後,執行指令碼,可以得到內容如下
sudo python trace3_decode.py output :n[DEL]MKDIR SHAOBAOBAOER.SH[unknown][unknown][unknown][unknown][unknown][unknown]VIM n[unknown]SQLMAP -U 'HTTP[DEL][unknown][unknown]SHAOBAOBAOER.CN[unknown]ADMIN[unknown] -P ACCOUNT --THREAD 9 --RISK 3 --LEVEL 3 --DBS [unknown]WQnEXITn
好吧,這是我輸入的,用SQLMAP注入我wordpress部落格後臺的小指令碼,這裡 shaobaobaoer.sh 後面的[uk]的內容應該是我按住del鍵沒有放下。可能這個沒有寫在上面的小腳本里面。VIM 後那個 UK應該是 insert鍵。還有幾個應該是 反斜 也沒有識別出來。
後來我嘗試了下github上的那個小工具,結果並不是很理想,再次就不多說了。
真題分析
檔案下載地址
ofollow,noindex" target="_blank">kaizen-ctf 2018-Forensics-Capture_of_all_interfaces拿到流量包,定位到USB流量
usb.addr == "2.6.1" and usb.dst == "host"
將當前流量匯出為 extract.pcapng,利用tshark提取
$ tshark -r extract.pcapng -T fields -e usb.capdata > extract.data
用上面的小指令碼跑一下,即可拿到鍵盤輸入資料
$ python exp.py output :nHHEERREEIISSYYOOUURRFFLLAAGGEEAATTTTHHAATTFFRROOGG
分析 USB 滑鼠流量
MouseTrace.pacp
USB 的滑鼠流量和鍵盤流量有所不同,我大概看了下每個USB資料請求包的時間差,相差大概在 0.008 S 以下。
實際上USB文章中規定
通常初始化滑鼠以產生特定速率的移動包。如果移動滑鼠,預設速率為每秒100個數據包。如果按下或釋放按鈕,滑鼠也會生成資料包。如果滑鼠沒有移動且沒有單擊按鈕,則滑鼠不會生成任何自動資料包。
滑鼠的位置是離散的,但是將這些時間戳加起來就看似是個直線了。
>>> 3.752525 - 3.744619 0.007905999999999747 >>> 3.760502 - 3.752525 0.0079769999999999
備註,這個流量包錄製得太
普通了
我後來又重新錄製了一個,請忽視這個source
和鍵盤的流量不太一樣,滑鼠的請求內容只有 4 個位元組
Leftover Capture Data: 00 fd f5 00
具體規則如下所示:
- 第一個位元組為按鍵,末位中,1代表左鍵,2代表右鍵。前面幾位是標誌位,當發生溢位或者其他狀況的時候,這個位元組的前幾位。
- 第二個位元組為左右偏移,是一個有符號數,正的時候代表水平左移多少畫素,負的時候代表水平右移多少畫素
- 第三個位元組未上下偏移,是一個有符號數,正的時候代表上移多少畫素,負的時候代表下移多少畫素
- 第四個位元組是擴充套件位元組,當滑鼠有滾輪的時候才會被啟用,wikipedia告訴我它是這麼定義的。
- 0 - 沒有滾輪運動
- 1 - 垂直向上滾動一下
- 0xFF - 垂直向下滾動一下
- 2 - 水平滾動右鍵一次
- 0xFE - 水平滾動左鍵單擊一下
對此,利用下述指令碼,將收集好的資料放到 MouseTrackExtract.txt
中
nums = [] keys = open('MouseTrace.txt','r') posx = 0 posy = 0 for line in keys: if len(line) != 12 : continue x = int(line[3:5],16) y = int(line[6:8],16) if x > 127 : x -= 256 if y > 127 : y -= 256 posx += x posy += y btn_flag = int(line[0:2],16)# 1 for left , 2 for right , 0 for nothing; 這裡抓取了為1的資料 if btn_flag == 1 : print posx , posy keys.close()
最後,利用gnuplot把它畫出來。當然,也可以用MATLAB
$ gnuplot $ >>plot "MouseTraceInput.txt"
我摁住滑鼠左鍵寫個SH,不過效果好像並不是很好。
分析 USB 檔案交換流量
FileTrace
很遺憾,我並沒有找到能夠從USB流量角度來分析USB協議的好文章。我只能通過一些例項來找出如何提取USB流量的。
我準備了一張圖片來完成演示 USB 檔案交換。如圖所示,其實USB的檔案交換似乎是不加密的,也就讓我能夠很方便的找到檔案的位置。但是這個協議是如何運作的,那些固定位元組的包又是在做什麼,目前我還解釋不來。
直接將上述內容提取,就可以找到我傳輸的檔案。這樣的道理還可以用在其他傳輸內容中。將檔案匯出位元組流,就是原檔案。但是檔案的名稱在哪裡?我通過過濾器找了很多次都沒有找到。如果有比較好的文章推薦的話還請在文後給我評論。
實戰分析 AlexCTF2017-USBprobing
利用如下過濾器,找到檔案交換流量
usb.addr == "host" and usb.dst == "3.3.2" and usb.data_len > 100
挨個兒資料包看過去,不難發現有一個PNG的圖片,將它直接右擊匯出
就是FLAG