流量分析 - USB流量(手搓+一把梭)
流量分析 - USB流量(手搓+一把梭)
原创 xiaoliao1
2025年04月23日 18:38 湖南
usb.pcapng
第一种方法:手搓
直接打开流量包
随便选一个看到data位置是8位的
知识补充:
键盘流量
基本知识
USB协议数据部分在Leftover Capture Data域中,数据长度为八个字节。
标准8字节键盘数据格式
| 字节位置 | 名称 | 描述 |
| :———: | :—————–: | :———————————————————-: |
| 字节1 | 修饰键(Modifiers) | 表示功能键(Ctrl、Shift、Alt等)的按下状态,每个二进制位对应一个按键。 |
| 字节2 | 保留字段 | 通常为 0x00
,部分设备可能用于扩展功能(如多媒体键)。 |
| 字节3-8 | 普通按键码 | 最多6个同时按下的普通按键的键码(每个按键占1字节)。 |
字节1:Modifier Keys(功能键位掩码)
| 位(Bit) | 对应按键 | HID Usage ID | 描述 |
| :——-: | :————: | :———-: | :————–: |
| Bit 0 | 左Ctrl | 0xE0 | 按下时值为 1
。 |
| Bit 1 | 左Shift | 0xE1 | |
| Bit 2 | 左Alt | 0xE2 | |
| Bit 3 | 左GUI(Win键) | 0xE3 | |
| Bit 4 | 右Ctrl | 0xE4 | |
| Bit 5 | 右Shift | 0xE5 | |
| Bit 6 | 右Alt | 0xE6 | |
| Bit 7 | 右GUI(Win键) | 0xE7 | |
字节3-8:普通按键码(HID Usage ID)
| HID键码(Hex) | 对应按键 | 字符/功能 |
| :————: | :——-: | :——–: |
| 0x00 | 无按键 | - |
| 0x04 | A | A/a |
| 0x05 | B | B/b |
| 0x06 | C | C/c |
| 0x07 | D | D/d |
| 0x08 | E | E/e |
| 0x09 | F | F/f |
| 0x0A | G | G/g |
| 0x0B | H | H/h |
| 0x0C | I | I/i |
| 0x0D | J | J/j |
| 0x0E | K | K/k |
| 0x0F | L | L/l |
| 0x10 | M | M/m |
| 0x11 | N | N/n |
| 0x12 | O | O/o |
| 0x13 | P | P/p |
| 0x14 | Q | Q/q |
| 0x15 | R | R/r |
| 0x16 | S | S/s |
| 0x17 | T | T/t |
| 0x18 | U | U/u |
| 0x19 | V | V/v |
| 0x1A | W | W/w |
| 0x1B | X | X/x |
| 0x1C | Y | Y/y |
| 0x1D | Z | Z/z |
| 0x1E | 1 | 1/! |
| 0x1F | 2 | 2/@ |
| 0x20 | 3 | 3/# |
| 0x21 | 4 | 4/$ |
| 0x22 | 5 | 5/% |
| 0x23 | 6 | 6/^ |
| 0x24 | 7 | 7/& |
| 0x25 | 8 | 8/ |
| 0x26 | 9 | 9/( |
| 0x27 | 0 | 0/) |
| 0x28 | Enter | 回车键 |
| 0x29 | Esc | Esc键 |
| 0x2A | Backspace | 退格键 |
| 0x2B | Tab | Tab键 |
| 0x2C | Space | 空格键 |
| 0x2D | - | -/_ |
| 0x2E | = | =/+ |
| 0x2F | [ | [/{ |
| 0x30 | ] | ]/} |
| 0x31 | \ | /\| |
| 0x33 | ; | ;/: |
| 0x34 | ' | '/” |
| 0x35 | |
/~ |
| 0x36 | , | ,/< |
| 0x37 | . | ./> |
| 0x38 | / | /? |
| 0x39 | Caps Lock | 大写锁定键 |
| 0x3A | F1 | F1功能键 |
| 0x3B | F2 | F2功能键 |
| … | … | … |
| 0x52 | ↑ | 方向键上 |
| 0x51 | ↓ | 方向键下 |
| 0x50 | ← | 方向键左 |
| 0x4F* | → | 方向键右 |
直接用data字段进行比对
这里是00.00.10.00.00.00.00.00 前面两个00.00对应的是修饰
我们从第3位10去对于上面的字符表
所以第一位就是m
知道上面这些,就可以构造脚本把所有data内容提取出来直接梭哈
# 导入所需库
import os
import subprocess
import json
# 定义tshark命令:从usb.pcapng文件中提取特定USB设备(2.2.1)的HID数据,输出为JSON格式
command = 'tshark -r usb.pcapng -Y usb.addr=="2.2.1" -T json -e usbhid.data > 1.json'
# 使用subprocess执行命令
proc = subprocess.Popen(command, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 等待命令执行完成
proc.communicate()
# 加载生成的JSON文件
with open("1.json","r") as f:
data=json.load(f) # data现在包含所有匹配的USB数据包
a2=[]
for i in data:
try:
# 提取每个数据包的usbhid.data字段
a1=i['_source']['layers']['usbhid.data'][0] # [0]取第一个出现的数据
a2.append(a1)
except:
continue # 跳过没有usbhid.data字段的数据包
# 定义键盘映射表
normalKeys = {
"04":"a", "05":"b", "06":"c", "07":"d", "08":"e",
# ... 其他常规按键映射 ...
"39":"<CAP>" # 大写锁定键
}
shiftKeys = {
"04":"A", "05":"B", "06":"C", "07":"D", "08":"E",
# ... 其他Shift组合键映射 ...
"39":"<CAP>" # 大写锁定键(实际应保持相同)
}
nums = []
for line in a2:
if len(line)!=16:
continue # 过滤长度不符合要求的HID数据
# 组合前两位(修饰键)和5-6位(实际按键代码)
nums.append(line[0:2]+line[4:6])
output = []
for n in nums:
if n[2:4] == "00" : # 00表示没有按键动作
continue
if n[2:4] in normalKeys:
if n[0:2]=="02": # 02表示Shift键按下
output.append(shiftKeys[n[2:4]])
else :
output.append(normalKeys[n[2:4]])
else:
output += '[unknown]' # 未识别的键值
print(output) # 输出原始解析结果
flag = 0 # 大写锁定状态标志
# 退格键处理
for i in range(len(output)):
try:
a = output.index('<DEL>') # 查找退格键位置
del output[a] # 删除DEL本身
del output[a - 1] # 删除前一个字符
except:
pass # 没有DEL时跳过
# 大写锁定处理
for i in range(len(output)):
try:
if output[i] == "<CAP>":
flag += 1
output.pop(i) # 移除CAP标记
if flag == 2: # 两次CAP恢复小写
flag = 0
if flag != 0:
output[i] = output[i].upper() # 转换为大写
except:
pass # 处理索引越界等情况
# 最终输出
print("".join(output))
写完执行一下
moectf{Learned_a6ou7_USB_tr@ffic}
第二种方法:自动化工具一把梭
打开一把梭工具
把文件导入,执行一下
秒了
moectf{Learned_a6ou7_USB_tr@ffic}