声明
本文属于Pigeon作者投稿原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
0x00 USB流量介绍
USB流量指的是USB设备接口的流量,攻击者能够通过监听usb接口流量获取键盘敲击键、鼠标移动与点击、存储设备的铭文传输通信、USB无线网卡网络传输内容等等。
在CTF中,USB流量分析主要以键盘和鼠标流量为主。我们重点分析USB协议的数据部分,其中包含了USB的信息,数据主要分布在USB协议中的Leftover Capture Data域,对于不同类型的流量,其数据长度会有区别。
USB协议的完整内容可以参考wireshark的wiki:
https://wiki.wireshark.org/USB
接下来我们以2022CISCN的一道USB流量题为例,介绍一下USB流量中键盘流量和鼠标流量的解析方法。
• 先用 wireshark 对 ez_usb.pcapng 文件进行流量分析,根据字节长度可知有两个键盘流量来源 2.8.1 和 2.10.1 以及一个鼠标流量来源 2.4.1:
• 用 usb.src == "2.8.1" 过滤其他地址并单独导出,其他地址同理:
• 根据键盘映射关系,编写脚本 sniff.py ,可以提取Leftover Capture Data域中的键盘输入信息,将src == 2.8.1和src==2.10.1两个键盘流量包的数据导出,解析成按键(sniff1-->2.8.1,sniff2-->2.10.1),结果如下:
• 可以看到src==2.8.1的键入值是以“52 61 72 21 1A 07 00”开头,说明是 RAR 压缩文件,其中代表大写锁定,代表回删,所以我们删掉和以及前面的 c 之后,导入十六进制编辑器并导出为 RAR 文件并解压,解压密码为35c535765e50074a(src==2.10.1的键盘输入)
0x02 键盘流量解析思路
• 首先我们需要借助wireshark的命令行工具tshark,提取USB协议中Leftover Capture Data域数据信息,通过usb.capdata即可获取,完整指令如下:
tshark -r ez_usb-2.8.1.pcapng -T fields -e usb.capdata > usbdata1.txt
• 需要注意:
wireshark 高版本默认支持 USB HID 协议,将不会显示 Leftover Capture Data 而是 HID Data,可以将原指令中的 usbcap.data 改为 usbhid.data,或者通过“分析-->启用的协议”,将 USB HID 协议禁用即可:
若不禁用,可以在 kali 中用另一种方式用指令过滤(会比分开手动导出方便一点)(上面脚本中os调用的指令,windows命令行是可以直接执行的)
tshark -r ez_usb.pcapng -T fields -e usbhid.data -Y "usb.device_address == 8"> 281.txt
• 由于键盘流量的击键信息集中在第三个字节,我们可以胡烈其他字节的信息。
提取后根据Usb Keyboard的映射表即可进行转换,比如十六进制 22 表示 “5”,39 表示<CAP>即 Caps Lock,2a 表示<DEL> 即 Delete 或 Backspace,完整映射表见这里:hut1_3_0.pdf (usb.org)(89~94页)。
• 有关tshark命令的详细使用参考wireshark官方文档:
https://www.wireshark.org/docs/man-pages/tshark.html
•脚本如下(获取完整脚本请在公众号回复03):
sniff.py:
import os
os.system("tshark -r ez_usb-2.8.1.pcapng -T fields -e usb.capdata > usbdata1.txt")
因脚本太长放不下,请在公众号回复03获取键盘流量解密完整脚本,可直接复制
0x03 鼠标流量解析思路
• 在本题中,通过键盘流量就已经可以拿到flag了,不过借用该题中src==2.4.1的部分,谈一谈鼠标流量的解析思路。
• 通常情况下,USB协议鼠标数据部分在Leftover Capture Data域中,数据长度为四个字节。
其中第一个字节代表按键,当取0x00时,代表没有按键、为0x01时,代表按左键,为0x02时,代表当前按键为右键。
第二个字节代表鼠标水平移动的像素值,取值为正代表向右平移,取值为负代表向左平移。
第三个字节代表鼠标垂直移动的像素值,取值为正代表向上平移,取值为负代表向下平移。
• 下图中00002000表示鼠标垂直向上移动20像素。
• 由于鼠标协议的标准较多,其数据部分的长度不是4字节的情况也有,也有可能是6字节、7字节、8字节等,需要查询相关协议剔除无用字节。
例如本题中的鼠标流量是部分6字节及部分7字节,需要根据实际实际情况修改相关字节。
Windows系统下的解析思路
• 首先将数据导出(方法同2.8.1和2.10.1的数据,用sniff.py脚本先导出 Leftover Capture Data域的数据到 usbdata3.txt):
• 由于鼠标流量长度不一致(6字节+7字节),常见鼠标流量为4字节,我们删去了末尾无用的0字节进行调整:
• 使用脚本 add_colon.py 给 usbdata4.txt 中的数据添加冒号得到 out.txt,再使用脚本 xy.py 将 out.txt 中的十六进制信息转换为鼠标坐标,得到xy.txt(注意脚本里的 btn_flag 需要设成0):
• 再将xy.txt复制到 gnuplot.exe (在其官网下载到 window 得到)的目录下,使用指令plot "xy.txt"解析并绘制得到图像(也可以调用python的PIL库绘制图形):
•脚本如下(获取完整脚本请在公众号回复03):
add_colon.py:
f=open('usbdata4.txt','r')
fi=open('out.txt','w')
请在公众号回复03获取鼠标流量解密完整脚本(Windows系统),可直接复制
Linux系统下的解析
• 使用脚本 usbMiceDataHacker.py 梭哈,由于此脚本适用于4字节和8字节的鼠标流量,此处6字节和7字节的流量需要经过数据处理才能使用。
同上述方法,导出鼠标流量 usbdata3.txt,修改字节长度为4,保存到 usbdata4.txt,随后将文件重命名为 usb.dat,注释掉脚本中43行到46行的代码,并将此数据文件和usbMiceDataHacker.py置于同一目录下:
• 用指令 python3 usbMiceDataHacker.py usb2.4.1.pcapng ALL 处理得图像: