usb流量分析

TLSN發表於2024-05-14

常見的usb流量分析分為滑鼠協議和鍵盤協議

USB流量的介紹

  • USB UART : 這種方式下,裝置只是簡單的將 USB 用於接受和發射資料,除此之外就再沒有, 其他通訊功能了。
  • USB HID : 這一類通訊適用於互動式,有這種功能的裝置有:鍵盤,滑鼠,遊戲手柄和數字顯示裝置。
  • USB Memory : 資料傳輸儲存

滑鼠協議相關知識

USB協議的資料部分在Leftover Capture Data域之中,如下圖

mouse

每一個資料包的資料區有四個位元組

  1. 第一個位元組代表按鍵,當取 0x00 時,代表沒有按鍵,為 0x01 時,代表按左鍵,為 0x02 時,代表當前按鍵為右鍵。
  2. 第二個位元組可以看成是一個 signed byte 型別,其最高位為符號位,當這個值為正時,代表滑鼠水平右移多少畫素,為負時,代表水平左移多少畫素。
  3. 第三個位元組與第二位元組類似,代表垂直上下移動的偏移。

鍵盤協議相關知識

keyboard

鍵盤資料包的資料長度為 8 個位元組

  1. 第一個位元組代表特殊按鍵

    |--bit0:  Left Control是否按下,按下為1 
    |--bit1:  Left Shift 是否按下,按下為1 
    |--bit2:  Left Alt  是否按下,按下為1 
    |--bit3:  Left GUI(Windows鍵) 是否按下,按下為1 
    |--bit4:  Right Control是否按下,按下為1  
    |--bit5:  Right Shift 是否按下,按下為1 
    |--bit6:  Right Alt  是否按下,按下為1 
    |--bit7:  Right GUI  是否按下,按下為1 
    

    當第一個位元組為00時,代表沒有按鍵,第一個位元組為02或者20時統一當shift鍵)

  2. 第二個位元組是保留位

  3. 第三個位元組~第8個位元組是普通按鍵(主要看第三個位元組)

    第四到第八個位元組好像是處理多鍵同時按下的

    data 值與具體鍵位的對應關係:keyboard_pro

分析一個流量包

以ISCC2024 的時間刺客為例

USB 協議的資料部分在 Leftover Capture Data 域之中

Linux 下可以用 tshark 命令可以將 leftover capture data 單獨提取出來:

tshark -r example.pcap -T fields -e usb.capdata //如果想匯入usbdata.txt檔案中,後面加上引數:>usbdata.txt

而在Windows我沒可以透過wireshark自帶的工具提取出來:

在 wireshark 的安裝環境下,在 wireshark目錄下有個 tshark.exe,輸入命令:

tshark.exe -r example.pcap -T fields -e usb.capdata //如果想匯入usbdata.txt檔案中,後面加上引數:>usbdata.txt

檢視 usbdata.txt 發現資料包長度為八個位元組

image-20240510191821845

發現資料包長度為八個位元組,說明是鍵盤usb,也就是說只關心第三個位元組即可

給出轉化指令碼:

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 i in keys:
    i = i.strip()
    line = ""
    for j in range(0,len(i),2):
        line += i[j:j+2] + ":"
    line = line[:len(line)-1]
    # print(line)
    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 : ' + output)

得到: FLAGPR3550NWARDSA2FEE6E0

另附上 滑鼠轉化指令碼:

nums = []
keys = open('usbdata.txt','r')
f = open('xy.txt','w')
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
    if btn_flag == 1 : # 1 代表左鍵
        f.write(str(posx))
        f.write(' ')
        f.write(str(posy))
        f.write('\n')

f.close()

配合 gnuplot 將座標軸轉換為影像

參考: https://github.com/jas502n/sangfor/blob/master/1earn/Security/BlueTeam/筆記/USB取證.md

相關文章