CTF Web安全

USB流量解析

Posted on 2020-01-15,5 min read

简介

USB接口是目前最为通用的外设接口之一,通过监听该接口的流量,可以得到很多有意思的东西,例如键盘击键,鼠标移动与点击,存储设备的明文传输通信、USB无线网卡网络传输内容等。本文将通过两个CTF题,讲解如何捕获USB接口的数据,以及键盘鼠标USB协议的具体解析方式。相关下载链接:http://pan.baidu.com/s/1i57b33B
<!-- more -->

键盘流量解析
USB协议的数据部分在Leftover Capture Data中。也就是窗口的最底下
右键将其应用为列。

键盘数据包数据长度为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 -- 这六个为普通按键

按键信息在第3字节

按键与数字的对应关系如下:

现在我们利用工具和脚本。将第三字节取出来。然后根据对应表转换为明文

tshark -r usb1.pcap -T fields -e usb.capdata > usbdata.txt

通过tshark过滤工具。-r指定文件。-T指定输出格式为字段。-e指定字段
将usb.capdata字段的值都导出来了

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':
    #全为0。表示没按键。就跳过
         continue
    nums.append(int(line[6:8],16))
    #否则表示按键。将6-8(第三个字节)。转换为10进制。放入列表
keys.close()
output = ""
for n in nums:
    if n == 0 :
    #判断第三个字节是否按了。前面只是匹配了所有字节。现在具体匹配第三个字节
        continue
    if n in mappings:   q
        output += mappings[n]
        #根据对应表,查找明文。加入output
    else:
        output += '[unknown]'
print output
#输出明文

得到明文

鼠标流量
鼠标流量和键盘流量不一样。鼠标移动是连续的。而键盘是离散的
和之前一样。用tshark工具将data过滤出来

鼠标流量还是4个字节。
第一个字节代表按键:0x00时。代表没有按鼠标/0x01。代表按左键/0x02时。代表按右键
第二个字节代表左右。最高位为符号为。值为正时。代表鼠标右移。值为负。代表鼠标左移
第三个字节代表上下。与左右差不多
我们过滤出来的数据有点参差不齐。而我们只需要4字节的数据

nums=[]
keys=open('usbdata2.txt')
posx=0
posy=0
for line in keys:
    if len(line)!=12:
    #判断长度是否为12。8字节+4个冒号
        continue
    x=int(line[3:5],16)
    #左右。存入X
    y=int(line[6:8],16)
    #上下。存入Y
    if x>127:
        x-=256
    #判断正负。如果最高为是1.代表负数。那么就需要-256
    if y>127:
        y-=256
    posx+=x
    posy+=y
    flag=int(line[0:2],16)
    #判断鼠标按键
    if flag==2:
    #按了右键就打印X,Y坐标
        print posx,posy
keys.close()

将输出结果放入1.txt,用gnuplot绘图

有点flag的样子。但好像字符是反着的。再保存。放到画图中。反转一下

得到flag

下一篇: [CISCN2019 华北赛区 Day1 Web1]Dropbox(phar)→