从CTF中学USB流量捕获与解析

安全
USB接口是目前最为通用的外设接口之一,通过监听该接口的流量,可以得到很多有意思的东西,例如键盘击键,鼠标移动与点击,存储设备的明文传输通信、USB无线网卡网络传输内容等。本文将通过两个CTF题,讲解如何捕获USB接口的数据,以及键盘鼠标USB协议的具体解析方式。

一、简介

USB接口是目前最为通用的外设接口之一,通过监听该接口的流量,可以得到很多有意思的东西,例如键盘击键,鼠标移动与点击,存储设备的明文传输通信、USB无线网卡网络传输内容等。本文将通过两个CTF题,讲解如何捕获USB接口的数据,以及键盘鼠标USB协议的具体解析方式。相关下载链接:http://pan.baidu.com/s/1i57b33B

[[180570]]

二、 USB capture

USB流量的捕获可以使用wireshark或者usbpcap来进行,最新版本的wireshark已经支持USB接口的捕获,且在安装时会提示usbpcap的安装,当前网上已有相关中文资料对wireshark抓取usb数据包的方法进行讲解,感兴趣的读者可阅读参考链接,在此我们使用一种相对简单的方式,即直接采用usbpcap捕获USB流量。该软件的下载地址为http://desowin.org/usbpcap/,可支持32位以及64位的winxp至win10操作系统,安装完成后须重启机器或者按照提示选择重启所有USB设备。

安装完成后,直接双击USBPcapCMD.exe,按照提示信息选择filter,输入文件名,便可愉快地等产生的信息被捕获了,程序运行界面如下图:

USB capture

三、键盘流量解析

以今年xnuca misc 专场的old years 题为例,该题目给出一个pcap包,使用wireshark打开,看到Protocol 为USB协议。

USB协议的数据部分在Leftover Capture Data域之中,右键leftover capture data –> 应用为列,可以将该域的值在主面板上显示,键盘数据包的数据长度为8个字节,击键信息集中在第3个字节,每次key stroke都会产生一个keyboard event usb packet ,如下图:

keyboard event usb packet

网上查找USB协议的文档,可以找到这个值与具体键位的对应关系,http://www.usb.org/developers/hidpage/Hut1_12v2.pdf

第53页有一个usb keyboard/keypad映射表:

usb keyboard/keypad映射表

使用wireshark自带的tshark命令行工具,可以将 leftover capture data单独提取出来,具体命令为:

  1. tshark.exe -r usb1.pcap -T fields -e usb.capdata > usbdata.txt 

然后我们需要编写脚本从得出的userdata.txt文件中过滤出键盘击键相关的流量,并根据上述映射表,将键盘按键按照对应关系输出出来,这里附上简要的脚本:

  1. 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:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",  0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]",  0X2B:"    ", 0x2C:" ",  0x2D:"-", 0x2E:"=", 0x2F:"[",  0x30:"]",  0x31:"\\", 0x32:"~", 0x33:";",  0x34:"'", 0x36:",",  0x37:"." } 
  2. nums = [] 
  3. keys = open('usbdata.txt') 
  4. for line in keys: 
  5.     if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0': 
  6.          continue 
  7.     nums.append(int(line[6:8],16)) 
  8. keys.close() 
  9. output = "" 
  10. for n in nums: 
  11.     if n == 0 : 
  12.         continue 
  13.     if n in mappings: 
  14.         output += mappings[n] 
  15.     else: 
  16.         output += '[unknown]' 
  17. print 'output :\n' + output 

运行该脚本,便可得到输出结果如下:

http://p0.qhimg.com/t01aff4e155bc971b3b.png

这里还有最后一个小弯,由提示中的“不使用拼音 ”等信息推测出上文的特殊编码可能是某种拼音之外的古老的输入法,例如五笔,毕竟这也是做keylogger的人需要考虑而且头疼的一个地方。尝试对照着输入,可以得出如下文字:

[[180572]]

最后得出flag . xnuca{wojiushifulagehaha}

四、鼠标流量解析

这是xnuca第二道usb流量的题,首先可以直接使用上述的解决方案试一下,得到这样一话:

[[180573]]

解决本题需要把鼠标流量还原出来,然而鼠标与键盘不同,鼠标移动时表现为连续性,与键盘击键的离散性不一样,不过实际上鼠标动作所产生的数据包也是离散的,毕竟计算机表现的连续性信息都是由大量离散信息构成的。

首先同样使用tshark 命令将cap data提取出来:

1tshark.exe -r usb2.pcap -T fields -e usb.capdata > usbdata.txt

http://p0.qhimg.com/t015861d1cf458019d2.png

每一个数据包的数据区有四个字节,第一个字节代表按键,当取0x00时,代表没有按键、为0x01时,代表按左键,为0x02时,代表当前按键为右键。第二个字节可以看成是一个signed byte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。第三个字节与第二字节类似,代表垂直上下移动的偏移。

了解协议相关约定之后,可编写脚本将数据包的内容变成一系列点的集合,为了区分左右按键,可以特意对第一个字节的内容作一下判断。相关脚本如下:

  1. nums = [] 
  2. keys = open('data.txt','r') 
  3. posx = 0 
  4. posy = 0 
  5. for line in keys: 
  6.     if len(line) != 12 : 
  7.          continue 
  8.     x = int(line[3:5],16) 
  9.     y = int(line[6:8],16) 
  10.     if x > 127 : 
  11.         x -256 
  12.     if y > 127 : 
  13.         y -256 
  14.     posx += x 
  15.     posy += y 
  16.     btn_flag = int(line[0:2],16)  # 1 for left , 2 for right , 0 for nothing 
  17.     if btn_flag == 1 : 
  18.         print posx , posy 
  19. keys.close() 

本题的flag藏在右键信息中,当btn_flag 取2时,运行脚本可以得到一系列坐标点:

http://p3.qhimg.com/t0110b31c35de1bb2b7.png

得到这些点之后,需要将他们画出来,因而需要辅以gnuplot 或者其他的绘图工具,gnuplot的命令为"plot inputfile",运行如下:

gnuplot的命令为\"plot inputfile\"

最后得到本题的flag: XNUCA{USBPCAPGETEVERYTHING}

 XNUCA{USBPCAPGETEVERYTHING}

责任编辑:赵宁宁 来源: 安全客
相关推荐

2020-04-16 09:24:18

USB流量数据安全

2016-02-17 15:15:01

2013-08-19 12:46:27

2009-03-26 09:16:34

微软裁员职位

2021-03-09 09:55:02

Vuejs前端代码

2022-07-20 09:07:03

Linuxtcpdump网络工具

2011-06-13 16:20:25

网站信息架构收录流量

2019-01-02 13:45:19

2019-11-28 09:04:32

DDoS网络攻击网络安全

2021-10-11 09:55:58

Facebook业务中断网络安全

2018-08-14 05:34:19

2023-11-24 13:24:14

CIOOptus

2009-12-31 10:49:36

VPN配置实例

2010-02-26 10:14:25

WCF全局错误捕获

2020-05-19 13:46:33

勒索软件信息安全攻击

2020-11-04 07:13:57

数据工程代码编程

2023-11-24 12:31:41

DiscordGolang

2023-11-29 07:29:28

ReactSolid

2016-01-18 10:06:05

编程

2010-10-12 11:06:07

招聘
点赞
收藏

51CTO技术栈公众号