BugKu-MISC-USB流量截取

BugKu-MISC-USB流量截取

Mel0ny Lv5

BugKu-MISC-USB流量截取

题目

Question
Question

思路

可以先参考一下资料

大致看了一下数据的Leftover Capture Data,全是八个字节的,可以确认是键盘usb数据无疑了,使用tshark命令提取数据

1
tshark -r usb.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt

注:-r为输入文件 -T是输出指定格式,-e是输出指定字段,usb.capdata就是usb流量数据,sed是流编辑器,后面是一段正则表达式,作用是把空行都删掉,只保留真正有数据的包。

Question

拿ai跑个脚本把流量变成键盘符号

注:这在比赛中是不允许的,但是这个是刷题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# usb_hid_parser.py
# 用法: python usb_hid_parser.py usbdata.txt

import sys

# USB HID Usage ID -> 字符映射(只列出常用键)
HID_KEYBOARD = {
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', 0x2C: ' ', 0x2D: '-', 0x2E: '=', 0x2F: '[',
0x30: ']', 0x31: '\\', 0x33: ';', 0x34: "'", 0x36: ',',
0x37: '.', 0x38: '/',
}

SHIFTED_KEYS = {
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: '!', 0x1F: '@', 0x20: '#', 0x21: '$', 0x22: '%',
0x23: '^', 0x24: '&', 0x25: '*', 0x26: '(', 0x27: ')',
0x2D: '_', 0x2E: '+', 0x2F: '{', 0x30: '}', 0x31: '|',
0x33: ':', 0x34: '"', 0x36: '<', 0x37: '>', 0x38: '?',
}

def parse_hid_line(line):
"""解析一行 HID 报告"""
line = line.strip().replace(' ', '')
if len(line) < 2:
return None

# 转成字节列表
data = [int(line[i:i+2], 16) for i in range(0, len(line), 2)]
if len(data) < 3:
return None

modifier = data[0] # Shift / Ctrl / Alt 等
keycode = data[2] # 主键值

if keycode == 0:
return None

# 判断是否按下 Shift
shift = modifier & 0x22 # 左右 Shift 对应 bit1 和 bit5
if shift:
return SHIFTED_KEYS.get(keycode, '')
else:
return HID_KEYBOARD.get(keycode, '')

def parse_usbdata_file(filename):
with open(filename, 'r') as f:
result = ''
for line in f:
char = parse_hid_line(line)
if char:
result += char
return result

if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python usb_hid_parser.py usbdata.txt")
sys.exit(1)

output = parse_usbdata_file(sys.argv[1])
print("解析结果:")
print(output)

跑完之后得到flag

Question

Flag

1
flag{pr355_0nwards_a2fee6e0}

扩展

如果是鼠标流量一般不会是八个字节的Leftover Capture Data,一般是四个字节的
感觉这篇资料里绘制鼠标轨迹的方式比较简洁

  • 标题: BugKu-MISC-USB流量截取
  • 作者: Mel0ny
  • 创建于 : 2025-09-04 21:00:51
  • 更新于 : 2025-09-04 21:49:38
  • 链接: https://mel0nyrame.github.io/2025/09/04/BugKu-MISC-USB流量截取/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
BugKu-MISC-USB流量截取