一、USB流量分析
USB协议的数据部分在 Leftover Capture Data 域之中,可以用tshark命令将leftover capture data 数据单独提取出来,利用命令如下:
tshark -r 1.pcapng -T fields -e usb.capdata > usbdata.txt
tshark -r 1.pcapng -T fields -e usbhid.data > usbdata.txt
二、鼠标流量分析
在CTF中对鼠标流量一般是需要还原鼠标的经过轨迹,关键信息就在还原轨迹之中。由于不同鼠标使用的鼠标协议是不同的,每个数据包的数据区可能是4字节、6字节或者8字节。
数据报的数据区若是4字节时的含义如表9-3所示。
第一字节:按键。0x00为没有按键, 0x01为左键,0x02为右键。
第二字节:水平位移。为正(小于127)是向右移动多少像素,为负(负数补码,大于127小于255)是向左移动多少像素。
第三字节:垂直位置。为正(小于127)是向上移动多少像素,为负(负数补码,大于127小于255)是向下移动多少像素。
第四字节:滚轮数据。0,没有滚轮运动;1,垂直向上滚动一下;2,水平滚动右键一次;0xFE,水平滚动左键单击一下;0xFF,垂直向下滚动一下。
当数据区是6个字节时,第一个字节表示按键指示左右键, 第二个字节表示水平位移,第三个字节表示垂直位移。
数据区若是8个字节时,第一个字节表示按键指示左右键,第三个字节表示水平位移,第五个字节表示垂直位移。
可以利用Tshark命令将Leftover Capture Data 提取保存到 usbdata.txt 文件中:
tshark -r 1.pcapng -T fileds -e usb.capdata > usbdata.txt
tshark -r 1.pcapng -T fields -e usbhid.data > usbdata.txt
对提取出来的键盘数据,我们可以写一个键盘数据转换坐标脚本convert.py
:
nums = []
keys = open('usbdata.txt','r')
result = open ('1.txt','w')
posx = 0
posy = 0
for line in keys:
line = line.strip()
#处理类似“0000120000000000”内容
if len(line) == 16:
x = int(line[4:6],16)
y = int(line[8:10],16)
#处理类似“00:00:12:00:00:00:00:00”内容
elif len(line) == 24:
x = int(line[6:8],16)
y = int(line[12:14],16)
else:
continue
if x>127: x -= 256
if y>127: y -= 256
posx += x
posy += y
#1 for left(左键),2 for right(右键),0 for noting(无按键)
btn_flag = int(line[0:2],16)
if btn_flag == 1:
result.write(str(posx)+''+str(-posy)+'\n')
keys.close()
result.close()
然后我们用UsbMiceDataHacker的工具,把坐标数据作画来还原鼠标活动轨迹。
三、实战: 【DASBOOK】9.4.2键盘流量分析
键盘数据包的数据长度为8个字节, 击键信息在第3个字节。每次击键都会产生一个数据包。 如果我们拿到的流量包是USB协议,即数据报中Capture Data 的信息都是8个字节,几乎只有第3个字节不为00,下图很明显能看出来:
当拿到atta.pcapng
流量包后,放到kali里面通过tshark
命令将Leftover Capture Data提取保存到usbdata.txt文件中,命令如下:
tshark -r atta.pcapng -T fields -e usb.capdata>usbdata.txt
然后编写一个键盘映射脚本Keyboard.py
,针对提取出的usbdata.txt
代码如下:
#-*-coding:utf-8-*-
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:"!",0x1f:"@",0x20:"#",0x21:"$",0x22:"%",0x23:"^",0x24:"&",0x25:"*",0x26:"(",0x27:")",0x28:"<RET>",0x29:"<ESC>",0x2a:"<DEL>",0x2b:"\t",0x2c:"<SPACE>",0x2d:"_",0x2e:"+",0x2f:"{",0x30:"}",0x31:"|",0x32:"<NON>",0x33:"\"",0x34:":",0x35:"<GA>",0x36:"<",0x37:">",0x38:"?",0x39:"<CAP>",0x3a:"<F1>",0x3b:"<F2>",0x3c:"<F3>",0x3d:"<F4>",0x3e:"<F5>",0x3f:"<F6>",0x40:"<F7",0x41:"<F8>",0x42:"<F9>",0x43:"<F10>",0x44:"<F11>",0x45:"<F12>"}
result = ''
with open('usbdata.txt','r') as f:
for line in f.readlines():
line = line.strip()
#处理形如“0000120000000000”的内容
if len(line) == 16:
s = int(line[4:6],16)
#处理形如“00:00:12:00:00:00:00”
elif len(line) ==24:
s = int(line[6:8],16)
else:
continue
if s!=0:
result += mappings[s]
print(result)
得到结果:
然后自己手动转换成 flag{helloworld!}
四、实战:[NISACTF 2022] 破损的flag
下载后的附件,无扩展名。
在kali中通过file
命令可得出是pcap流量包数据:
键盘数据包的数据长度为8个字节, 击键信息在第3个字节。
然后我们用前一个实战案例中的tshark
命令提取出usbdata.txt
,如下图:
我们可以用前文的 键盘映射脚本进行提取,得到信息:
推测出来是键盘密码,在键盘密码中寻找被包围起来的字母,如下所示:
UJKO:i
POK::l
QWSZ:a
QASE:w
IKLP:O
RDCVG:f
NJK<:m
RDCVG:f
TFVBH:g
WSDR:e
NJK:m
UHNMK:j
TFVBH:g
RDCVG:f
UJKO:i
POK::l
WSDR:e
BHJM:n
YHJI:u
POK:l
WAZXD:s
XDFV:c
RFGY:t
YHJI:u
把这段代码解密后就是:
imgulfflagiswelcometfjnu
因为要补全单词:
得到flag{welcome_to_fjnu}