Chybeta

Hackit2017-USB ducker-writeup

Hackit2017-USB ducker-writeup
usb keyboard pcap

Task

1
2
3
4
Description: This file was captured from one of the computers at the Internet cafe. We think that the hacker was using this computer at that time. Try to get his secret documents. ( flag format is flag{...} )
Attachment: (none)
Webpage: https://mega.nz/#!NVJ1kZCR!mDxd7V0rHtMStePa-tUEHPW-SyAxQ6f1zRDCTxX8y3M
Hint: (none)

Solution

题目提供了pcap文件。

可以知道对应的设备为apple的keyboard。

对于keyborad的数据传输,在数据包的Leftover Capture Data中,根据这篇文章: USB鼠标、键盘数据格式 HID Keyboard report descriptor。键盘发送给PC的数据每次8个字节,假设收到的数据为:

1
02:00:04:00:00:00:00:00

第一个字节是modifier keys,对应的规则如下:

1
2
3
4
5
6
7
8
|--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

一个字节是8位,这里是02,即对应着0000 0010,即可解码为Left Shift,也就是说按下了键盘左边的Shift键。假若数据为00,则表示啥都不做。

第二个字节是padding,默认为00。可略过不提。

第三个字节起到第八个字节为普通按键,解码规则可以根据 Universal Serial Bus (USB)中第53页的规则来解码。

比如说我们收到了数据为:

1
04:00:00:00:00:00

根据解码规则,以及第一字节shift被按下,可知为大写字母A

接下去开始针对题目提供的数据包进行分析。
根据 https://www.wireshark.org/docs/dfref/u/usb.html 可以知道 Leftover Capture Data 所对应的Field name为 usb.capdata,我们可以把值为00:00:00:00:00:00:00:00的数据过滤掉,因为它表示啥都不输入。

而我们的目标是keyboard的数据,从pcap包中看它对应的设备Device address为3,所对应的Field name为usb.device_address

我们可以使用tshark命令提取对应的数据,并将其保存到usbdata.txt中。

1
tshark -r task.pcap -Y "usb.capdata != 0 and usb.device_address==3" -T fields -e usb.capdata > usbdata.txt

提取出来的数据差不多这样:

(好吧,至于为什么还有00:00:00:00:00:00:00:00,哪位解释下)

由于还有一些零行,可以用下面命令再过滤一遍:

1
cat usbdata.txt | grep -v "00:00:00:00:00:00:00:00" > usbdata_filter.txt

然后根据解码规则进行解码。脚本如下:

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
75
76
77
78
79
# -*- coding: utf-8 -*-
KEYCODE = {
0x04:['a', 'A'],
0x05:['b', 'B'],
0x06:['c', 'C'],
0x07:['d', 'D'],
0x08:['e', 'E'],
0x09:['f', 'F'],
0x0A:['g', 'G'],
0x0B:['h', 'H'],
0x0C:['i', 'I'],
0x0D:['j', 'J'],
0x0E:['k', 'K'],
0x0F:['l', 'L'],
0x10:['m', 'M'],
0x11:['n', 'N'],
0x12:['o', 'O'],
0x13:['p', 'P'],
0x14:['q', 'Q'],
0x15:['r', 'R'],
0x16:['s', 'S'],
0x17:['t', 'T'],
0x18:['u', 'U'],
0x19:['v', 'V'],
0x1A:['w', 'W'],
0x1B:['x', 'X'],
0x1C:['y', 'Y'],
0x1D:['z', 'Z'],
0x1E:['1', '!'],
0x1F:['2', '@'],
0x20:['3', '#'],
0x21:['4', '$'],
0x22:['5', '%'],
0x23:['6', '^'],
0x24:['7', '&'],
0x25:['8', '*'],
0x26:['9', '('],
0x27:['0', ')'],
0x28:['\n','\n'],
0x2C:[' ', ' '],
0x2D:['-', '_'],
0x2E:['=', '+'],
0x2F:['[', '{'],
0x30:[']', '}'],
0x32:['#','~'],
0x33:[';', ':'],
0x34:['\'', '"'],
0x36:[',', '<'],
0x37:['.', '>'],
0x38:['/', '?'],
0x2b:['\t','\t'],
0x4f:[u'→',u'→'],
0x50:[u'←',u'←'],
0x51:[u'↓',u'↓'],
0x52:[u'↑',u'↑']
}
NA_KEYCODE = {0,1,2,3}
file = open("usbdata_filter.txt","rb")
result = ""
while 1:
data = file.readline()
if not data:
break
data = data[:-1].split(":")
normalcode = int(data[2],16)
if normalcode in NA_KEYCODE:
continue
if data[0] == '02':
shiftcode = 1
else:
shiftcode = 0
# print(normalcode, shiftcode)
result += KEYCODE[normalcode][shiftcode]
file.close()
print(result)

解出来为:

1
2
3
4
5
w
k
f
b
3'↑[↑l↑#↑{w$↓>b↓ag↓[e↓ci.[↑[f↑{k↑n$↑ju}↓:↓3↓u↓%=↑~↑y↑6↑,'↓p↓b↓7↓%&↑d↑0↑j↑pt↓i↓a↓[↓k(↑=↑r↑m↑]=↓0↓d↓>↓lc↑*↑_↑{↑j%↓u↓s↓(↓*2↑0↑n↑'↑;9↓h↓4↓]↓y4↑'↑k↑;↑+p↓f↓e↓$↓!}↑1↑_↑k↑s&↓s↓2↓c↓%q↑$↑.↑!↑#,↓s↓0↓c↓z3↑e↑}↑-↑i

打出来:

1
2
3
4
5
w{w$ju},'pt]=j%;9+ps&#,
k#>bn$:6pjim0{u'h;fks!s-
flag{k3yb0ard_sn4ke_2.0}
b[[e[fu~7d[=>*(0]'$1c$ce
3'ci.[%=%&k(lc*2y4!}%qz3

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:Hackit2017-USB ducker-writeup

文章作者:chybeta

发布时间:2017年08月30日 - 19:08

最后更新:2017年08月30日 - 20:08

原始链接:http://chybeta.github.io/2017/08/30/Hackit2017-USB-ducker-writeup/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。