2022CISCN初赛-ez_usb-复盘WriteUp
2022CISCN初赛 ez_usb 复盘WriteUp
前言
本篇首发于看雪社区
发现看雪社区对带有图片markdown非常友好,开始有点想把我博客迁过去了
本篇所有图片都挂载在看雪社区的图床下
前期准备
USB协议规范
1 | l USB UART |
最上面这个就是标准的串口实现,可以通过USB连接STM32或ESP8266这些MCU
中间这个可以做BadUSB(实现键盘模拟输入)
最下面这个应该是访问U盘
每一种USB设备,尤其是人机交互设备和存储设备,都有一串特殊的数字,这串数字被称为厂商ID和产品ID。这两个数字一般是成对出现的。厂商ID用于标明该产品是由哪一个制造商所生产的,而产品ID是产品的标识符。
有关协议的详细说明:USB初学(一)—USB-HID的初步认识【转】
HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括三个HID设备类特定的描述符:HID描述符、报告描述符、实体描述符。
除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:
- 设备描述符中:bDeviceClass, bDeviceSubClass, bDeviceProtocol三个值必须为0
- 接口描述符中:bInterfaceClass的值必须时0x03, bInterfaceSubClass的值为0或1, 为1表示HID设备是一个启动设备(Boot Device, 一般对PC机有意义,意思是BIOS启动时能识别您使用的HID设备,切只有标准鼠标或者键盘才能称为Boot Device),为0表示HID设备是操作系统启动厚才能识别使用的设备。bInterfaceProtocol的取值含义如下:
bInterfaceProtocol的取值(十进制) | 含义 |
---|---|
0 | None |
1 | 键盘 |
2 | 鼠标 |
3-255 | 保留 |
buu的一道赛题
当时做到时候由于不熟悉usb流量分析,网上资料也看的云里物理,找了篇题解进行分析
buu usb 1分题
首先,修复rar的文件头
里面有一张233.png
233.png通过stegsolver可以提取出一张二维码出来
用草料二维码可以提取出一段字
ci{v3erf_0tygidv2_fc0}
另外还有一个fkm文件,发现503B这个zip文件头,另存为zip然后解压
提到了可以用tshark把指令提取出来
1 | tshark -r key.pcap -T fields -e usb.capdata > usbdata.txt |
但我实际用UsbKeyboardDataHacker出结果
维吉尼亚密码,密码为xinan
fa{i3eei_0llgvgn2_sc0}
离flag很近,具备栅栏密码的特征
还真是
切入正题
根据标识符,找到设备的情况:
2.4.0 未知设备
2.8.0 keyboard
2.10.0 logitech
2.3.0 Lite-on Technology
2.4.0 Intel Bluetooth
用usb.addr作为过滤条件筛出数据,然后分组导出
1 | usb.addr== "2.8.1" |
2.8.1 里藏了一个压缩包,有着rar文件头的标记
把
tips:010editior的hex粘贴需要从Edit进入
2.10.1 里藏了密码35c535765e50074a,应该是鼠标信号
解压即可得到flag
当时走过的弯路
当时十分莽撞的直接拿现成脚本去试,结果什么都没有
照猫画虎x2,用提取不少帖子用tshark提取capdata
1 | tshark -r ez_usb.pcapng -T fields -e usb.capdata > usbdata.txt |
然后很不幸的得到了一个空的txt
看了hid部分以后,想了一下抓的应该是usbhid.data
1 | tshark -r ez_usb.pcapng -T fields -e usbhid.data > usbdata.txt |
有结果了
找到一个处理冒号和空格的脚本(忘记从哪里找来的)
1 | #!/usr/bin/env python |
数据整理完成,开始转换
1 | //tran.py |
然后得到同样一个带有rar文件头的数据包
当时为了修复这个包,花了不少力气。但事后来看,只要所有数据混到一块就全部木大。
运气好的话,没准可以用binwalk分离出来。
尾声
这类题目的套路就是把数据藏到capdata,然后找脚本读取就OK。本次CISCN的题目还不涉及加密算法,某些程度上来说比Buu上那道还简单。
当时在场上有把zip包从USB中提取出来,但是没把2.8.1的信息单独分离出来,即使修复文件头依然无法解压文件。只能说准备确实还不够充分,留下了遗憾。
补充
用过的exp
https://github.com/WangYihang/UsbKeyboardDataHacker/blob/master/UsbKeyboardDataHacker.py
参考过的资料
当时现场做不出来,使足力气Bing+Google,赛后发现自己没少看资料,就整理了出来