简介
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