USB
简介
USB详述: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
鼠标协议
鼠标移动时表现为连续性,与键盘击键的离散性不一样,不过实际上鼠标动作所产生的数据包也是离散的,毕竟计算机表现的连续性信息都是由大量离散信息构成的

每一个数据包的数据区有四个字节,第一个字节代表按键,当取0x00时,代表没有按键、为0x01时,代表按左键,为0x02时,代表当前按键为右键。第二个字节可以看成是一个signed byte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。第三个字节与第二字节类似,代表垂直上下移动的偏移。
得到这些点的信息后,即可恢复出鼠标移动轨迹
Tools
键盘协议
键盘数据包的数据长度为8个字节,击键信息集中在第3个字节

根据data值与具体键位的对应关系

可从数据包恢复出键盘的案件信息
参考
https://www.anquanke.com/post/id/85218
例题
Xman三期夏令营排位赛练习题:AutoKeyWP:https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html
问题描述:

这道题是我参加 Xman 三期夏令营选拔赛出的一道题,我们如何对其进行分析?
流量包是如何捕获的?
首先我们从上面的数据包分析可以知道,这是个 USB 的流量包,我们可以先尝试分析一下 USB 的数据包是如何捕获的。
在开始前,我们先介绍一些 USB 的基础知识。 USB 有不同的规格,以下是使用 USB 的三种方式:
UART 或者 Universal Asynchronous Receiver/Transmitter 。这种方式下,设备只是简单的将 USB 用于接受和发射数据,除此之外就再没有其他通讯功能了。
HID 是人性化的接口。这一类通讯适用于交互式,有这种功能的设备有:键盘,鼠标,游戏手柄和数字显示设备。
最后是 USB Memory ,或者说是数据存储。 External HDD , thumb drive/flash drive 等都是这一类的。
其中使用的最广的不是 USB HID 就是 USB Memory 了。
每一个 USB 设备(尤其是 HID 或者 Memory )都有一个供应商 ID(Vendor ID) 和产品识别码(Product Id) 。 Vendor ID 是用来标记哪个厂商生产了这个 USB 设备。 Product ID 用来标记不同的产品,他并不是一个特殊的数字,当然最好不同。如下图:

上图是我在虚拟机环境下连接在我电脑上的 USB 设备列表,通过 lsusb 查看命令。
例如说,我在 VMware 下有一个无线鼠标。它是属于 HID 设备。这个设备正常的运行,并且通过lsusb 这个命令查看所有 USB 设备,现在大家能找出哪一条是这个鼠标吗??没有错,就是第四个,就是下面这条:
其中,ID 0e0f:0003 就是 Vendor-Product ID 对, Vendor ID 的值是 0e0f ,并且 Product ID 的值是 0003 。 Bus 002 Device 002 代表 usb 设备正常连接,这点需要记下来。
我们用 root 权限运行 Wireshark 捕获 USB 数据流。但是通常来说我们不建议这么做。我们需要给用户足够的权限来获取 Linux 中的 usb 数据流。我们可以用 udev 来达到我们的目的。我们需要创建一个用户组 usbmon ,然后把我们的账户添加到这个组中。
接下来,我们需要 usbmon 内核模块。如果该模块没有被加载,我们可以通过以下命令加载该模块:
打开 wireshark ,你会看到 usbmonX 其中 X 代表数字。下图是我们本次的结果(我使用的是root ):

如果接口处于活跃状态或者有数据流经过的时候, wireshark 的界面就会把它以波形图的方式显示出来。那么,我们该选那个呢?没有错,就是我刚刚让大家记下来的,这个X的数字就是对应这 USB Bus 。在本文中是 usbmon0 。打开他就可以观察数据包了。

通过这些,我们可以了解到 usb 设备与主机之间的通信过程和工作原理,我们可以来对流量包进行分析了。
如何去分析一个USB流量包?
根据前面的知识铺垫,我们大致对 USB 流量包的抓取有了一个轮廓了,下面我们介绍一下如何分析一个 USB 流量包。
USB 协议的细节方面参考 wireshark 的 wiki :https://wiki.wireshark.org/USB
我们先拿 GitHub 上一个简单的例子开始讲起:

我们分析可以知道, USB 协议的数据部分在 Leftover Capture Data 域之中,在 Mac 和 Linux 下可以用 tshark 命令可以将 leftover capture data 单独提取出来,命令如下:
Windows 下装了 wireshark 的环境下,在 wireshark目录下有个 tshark.exe ,比如我的在 D:\Program Files\Wireshark\tshark.exe

调用 cmd ,定位到当前目录下,输入如下命令即可:
有关 tshark 命令的详细使用参考 wireshark 官方文档:https://www.wireshark.org/docs/man-pages/tshark.html
运行命令并查看 usbdata.txt 发现数据包长度为八个字节

关于 USB 的特点应用我找了一张图,很清楚的反应了这个问题:

这里我们只关注 USB 流量中的键盘流量和鼠标流量。
键盘数据包的数据长度为 8 个字节,击键信息集中在第 3 个字节,每次 key stroke 都会产生一个 keyboard event usb packet 。
鼠标数据包的数据长度为 4 个字节,第一个字节代表按键,当取 0x00 时,代表没有按键、为0x01时,代表按左键,为 0x02 时,代表当前按键为右键。第二个字节可以看成是一个 signed byte 类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。第三个字节与第二字节类似,代表垂直上下移动的偏移。
我翻阅了大量的 USB 协议的文档,在这里我们可以找到这个值与具体键位的对应关系:https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
usb keyboard 的映射表 根据这个映射表将第三个字节取出来,对应对照表得到解码:

我们写出如下脚本:
结果如下:

我们把前面的整合成脚本,得:
效果如下:

另外贴上一份鼠标流量数据包转换脚本:
键盘流量数据包转换脚本如下:
那么对于 xman 三期夏令营排位赛的这道题,我们可以模仿尝试如上这个例子:
首先我们通过 tshark 将 usb.capdata 全部导出:
结果如下:

我们用上面的 python 脚本将第三个字节取出来,对应对照表得到解码:
运行结果如下:

我们可以看出这是自动密匙解码,现在的问题是在我们不知道密钥的情况下应该如何解码呢?
我找到了如下这篇关于如何爆破密匙:http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-autokey-cipher/
爆破脚本如下:
跑出来的结果如下:

我们看到了 flag 的字样,整理可得如下:
我们把字段进行分割看:
最后的 flag 就是 flag{JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF}
参考文献
https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html
https://blog.csdn.net/songze_lee/article/details/77658094
https://wiki.wireshark.org/USB
https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
https://www.wireshark.org/docs/man-pages/tshark.html
http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-autokey-cipher/
https://hackfun.org/2017/02/22/CTF%E4%B8%AD%E9%82%A3%E4%BA%9B%E8%84%91%E6%B4%9E%E5%A4%A7%E5%BC%80%E7%9A%84%E7%BC%96%E7%A0%81%E5%92%8C%E5%8A%A0%E5%AF%86/
Last updated