本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
相关文章
相关工具
tshark -r tmp.pcap -T fields -e usb.capdata > usbdata.txt
# -r: 设置 tshark 分析的输入文件
# -T: 设置解码结果输出的格式,包括 fileds,text,ps,psml 和 pdml,默认为 text# 如果提取出来的数据有空行,可以将命令改为如下形式:
tshark -r tmp.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
提取出来的数据可能会带冒号,也可能不带,但是一般键盘映射的脚本都会按照有冒号的数据来识别,有冒号时提取数据的 [6:8],无冒号时数据在 [4:6],可以用如下脚本来加上冒号
# -*- coding: UTF-8 -*-
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:a=f.readline().strip()if a:if len(a)==16: # 键盘流量的话 len 改为 16, 鼠标流量改为 8out=''for i in range(0,len(a),2):if i+2 != len(a):out+=a[i]+a[i+1]+":"else:out+=a[i]+a[i+1]fi.write(out)fi.write('\n')else:breakfi.close()
CTF writup
USB 使用的三种方式
USB 协议版本有 USB1.0, USB1.1, USB2.0, USB3.1 等, 目前 USB2.0 比较常用。
每一个 USB 设备(尤其是 HID 或者 Memory )都有一个供应商 ID(Vendor ID) 和产品识别码(Product Id) 。 Vendor ID 是用来标记哪个厂商生产了这个 USB 设备。 Product ID 则用来标记不同的产品.
lsusb 命令用于显示本机的USB设备列表,以及USB设备的详细信息。
USB 流量的捕获可以使用 wireshark 或 usbpcap 来进行,在 ctf 中通常会给出已经捕获好的流量包,而我们需要做的便是从流量包中还原捕获的数据。
用 wireshark 打开流量包, USB 协议的数据部分在 Leftover Capture Data 块中
在蓝色部分可以看到这个区域,右键→应用为列,即可在上面显示出来这一列
键盘流量的数据长度为 8 个字节, 鼠标流量的数据长度为 4 个字节
键盘数据包的数据长度为 8 个字节,击键信息集中在第 3 个字节,每次击键都会产生一个数据包。所以如果看到给出的数据包中的信息都是 8 个字节,并且只有第 3 个字节不为 0000,那么几乎可以肯定是一个键盘流量了。
字节下标
BYTE1
BYTE2 - 暂不清楚,有的地方说是保留位
BYTE3-BYTE8 - 这六个为普通按键
例如: 键盘发送 02 00 0e 00 00 00 00 00,表示同时按下了 Left Shift + 'k',即大写 K。
具体键位对应 Universal Serial Bus HID Usage Tables - USB-IF 53页~59页
还原 tshark 提取数据到键盘映射的脚本
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('out.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':continuenums.append(int(line[6:8],16))# 00:00:xx:....keys.close()
output = ""
for n in nums:if n == 0 :continueif n in mappings:output += mappings[n]else:output += '[unknown]'
print('output :n' + output)
相关工具
鼠标移动时表现为连续性,与键盘击键的离散性不一样,不过实际上鼠标动作所产生的数据包也是离散的
鼠标数据包的数据长度为4个字节
0x00
时,代表没有按键、为 0x01
时,代表按左键,为 0x02
时,代表当前按键为右键。例如: 鼠标发送 00 01 fc 00,表示鼠标右移 01 像素,垂直向下移动 124 像素.
还原 tshark 提取数据到鼠标偏移的脚本
nums = []
keys = open('out.txt','r')
f = open('xy.txt','w')
posx = 0
posy = 0
for line in keys:if len(line) != 12 :continuex = int(line[3:5],16)y = int(line[6:8],16)if x > 127 :x -= 256if y > 127 :y -= 256posx += xposy += ybtn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothingif btn_flag == 1 : # 1 代表左键f.write(str(posx))f.write(' ')f.write(str(posy))f.write('\n')f.close()
配合 gnuplot 将坐标轴转换为图像
相关工具
点击关注,共同学习!安全狗的自我修养
github haidragon
https://github.com/haidragon