記一次CTF的USB流量分析

usb鼠標流量

最近在研究鼠標流量,找到如下的文章:
https://www.cnblogs.com/hackxf/p/10670844.html
根據這個師傅的說法,不同的鼠標抓到的流量不一樣,一般的鼠標流量是四個字節,第一個字節表示按鍵指示左鍵右鍵,第二個字節表示水平位移,爲正(小於127)是向右移動,爲負(補碼負數,大於127小於255)是向左移動。第三個字節表示垂直位移,爲正(小於127)是向上移動,爲負(補碼負數,大於127小於255)是向下移動。事實上,起作用的只是三個相鄰的字節。
然而,有些鼠標的流量似乎不那麼標準,比如上面那個師傅,他抓出來的流量是8字節的,於是他就取了1、2、3字節來進行分析。而我抓到的流量是6字節的。
如下圖:
在這裏插入圖片描述

經過分析,我對應的起作用的字節是2、3、4字節,稍微修改了下師傅的腳本。

#sniffer.py
nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
    if len(line) != 18 :#忽略空行
         continue
    x = int(line[6:8],16)
    y = int(line[9:11],16)
    if x > 127 :
        x -= 256
    if y >127 :
        y -=256
    posx += x
    posy += y
    btn_flag = int(line[3:5],16)  # 1 for left , 2 for right , 0 for nothing
    if btn_flag == 1 :
        result.write(str(posx)+' '+str(posy)+'\n')
keys.close()
result.close()

同時在控制檯裏面運行以下命令出來了結果。

tshark -r test2.pcapng -T fields -e usb.capdata > usbdata.txt
python3 sniffer.py
gnuplot.exe -e "plot 'result.txt'" -p

但是這樣的圖像出來是反的。
在這裏插入圖片描述

於是我又加了個負號。

#sniffer.py
nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
    if len(line) != 18 :#忽略空行
         continue
    x = int(line[6:8],16)
    y = int(line[9:11],16)
    if x > 127 :
        x -= 256
    if y >127 :
        y -=256
    posx += x
    posy += y
    btn_flag = int(line[3:5],16)  # 1 for left , 2 for right , 0 for nothing
    if btn_flag == 1 :
        result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()
result.close()

圖像正了,但還是有傾斜,又反覆試了多次,和畫圖的結果還是不太一樣。
在這裏插入圖片描述
在這裏插入圖片描述
經過對比,稍微調整了參數,具體的參數作用註釋裏面有說明

#sniffer.py
nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
    if len(line) != 18 :#忽略空行
         continue
    x = int(line[6:8],16)
    y = int(line[9:11],16)
    if x > 127 :
        x -= 256
    if y >120 :#這個參數控制單個字符的高度,如果高度過大導致字符過瘦,請調大
        y -=264#這個參數控制字符串的傾斜程度,如果向下傾斜就調高,如果向上傾斜就調低
    posx += x
    posy += y
    btn_flag = int(line[3:5],16)  # 1 for left , 2 for right , 0 for nothing
    if btn_flag == 1 :
        result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()
result.close()

這下結果就比較接近了。
在這裏插入圖片描述
流量詳見附件:
https://download.csdn.net/download/fjh1997/12373386

2. USB鍵盤流量

usb鍵盤流量就容易的多,主要起作用的是七個字節(1、3~8)。鍵盤流量只記錄按下的按鍵。釋放按鍵不進行記錄。

BYTE1 --
       |--bit0:   Left Control是否按下,按下爲1 
       |--bit1:   Left Shift  是否按下,按下爲1 
       |--bit2:   Left Alt    是否按下,按下爲1 
       |--bit3:   Left GUI    是否按下,按下爲1 
       |--bit4:   Right Control是否按下,按下爲1  
       |--bit5:   Right Shift 是否按下,按下爲1 
       |--bit6:   Right Alt   是否按下,按下爲1 
       |--bit7:   Right GUI   是否按下,按下爲1 
BYTE2 -- 暫不清楚,有的地方說是保留位
BYTE3--BYTE8 -- 這六個爲普通按鍵

詳細的對照表可以去這裏看:
https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
但是在抓包的時候也需要注意一些點同時在抓流量的時候也會遇到一些問題,比如8個字節都是0的USB流量太多以及其他USB設備的流量的干擾,需要用filter“usb.capdata != 00:00:00:00:00:00:00:00 and usb.src == “96.1.1””進行過濾,如下圖。
在這裏插入圖片描述
再比如同樣一個s沒加shift是0000160000000000,加了shift之後是0200160000000000
在這裏插入圖片描述

在這裏插入圖片描述
有些時候也會遇到多個按鍵一起按的情況,這個時候3~8字節可能會被利用起來。
在這裏插入圖片描述
這裏我做了一個實驗,輸入”hello I’m good“之後查看抓到的流量是什麼:

import os
os.system("tshark -r test.pcapng -T fields -e usb.capdata > usbdata.txt")
normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}

shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}


nums = []
keys = open('usbdata.txt')
for line in keys:
    if len(line)!=17: #首先過濾掉鼠標等其他設備的USB流量
         continue
    nums.append(line[0:2]+line[4:6]) #取一、三字節
keys.close()
output = ""
for n in nums:
    if n[2:4] == "00" :
        continue

    if n[2:4] in normalKeys:
        if n[0:2]=="02": #表示按下了shift
            output += shiftKeys [n[2:4]]
        else :
            output += normalKeys [n[2:4]]
    else:
        output += '[unknown]'
print('output :n' + output)

得到如下結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章