当前位置: 首页 > 科技观察

USB流量取证分析

时间:2023-03-12 11:41:41 科技观察

USB是通用串行总线(UniversalSerialBus)的缩写,是一种外部总线标准,用于规范计算机与外部设备(如键盘、鼠标、打印机、磁盘)之间的连接和通信或网络适配器等。等待。通过监控该接口的流量,我们可以获得键盘的击键记录、鼠标移动轨迹、磁盘传输内容等一系列信息。在Linux中可以使用lsusb命令,如图:这里主要演示USB鼠标流量和键盘流量。Linux下已经有很多分析了,下面的环境都是在Windows下进行的。一、鼠标流量1.1特征分析USB鼠标流量的规律如下:1.2使用Wireshark抓包分析如果要使用Wireshark抓包,需要在安装时勾选usbpcap工具选项,这样会有一个usb接口在你的Wireshark选项中,点击抓包。下图是我点击鼠标左键在屏幕上画圈的流量:有些鼠标可能协议不规范,会导致解析失败。Wireshark抓取的USB流量集中在LeftoverCaptureData模块中,我们可以使用tshark工具提取出来。在Windows安装tshark.exe的目录中输入:tshark.exe-rb.pcap-Tfields-eusb.capdata>b.txt//这里的b.pcap是我抓取的数据包的名字,b.txt就是将提取出来的数据输入到b.txt中,查看b.txt的内容。你会发现有很多空行是因为有些数据包没用。在进行下一步之前,我们需要删除空行。去除空行后,根据鼠标流量的规则绘制像素坐标,最后使用绘图工具(如matlab的matplotlib或python绘制图像)。了解原理后,为了方便,可以直接使用王一航的工具进行提取,输入:pythonUsbMiceDataHacker.pyb.pcapLEFT//其中b.pcap是我抓取的数据包名称,运行后可以看到画面:需要注意的是这个工具必须在python2环境下,同时保证安装了matplotlib和numpy。2.键盘流量2.1特征分析键盘数据包的数据长度为8字节,击键信息集中在第三个字节,每次击键都会产生一个数据包。所以如果你看到给定的数据包中的信息都是8个字节,只有第三个字节不是0000,那么几乎可以肯定是键盘流量。在USB协议的文档中搜索键盘。可以在数据包中找到击键信息和16进制数据对照表:2.2使用Wireshark抓包分析抓包步骤同上。下面是XCTF高校疫情竞赛中的一道例题(ez_mem&usb)。最后一步,我们得到一个压缩包,用密码解压后,得到一个键盘流量的文本文件:根据键盘流量的特点,我们可以很容易地判断出来。使用代码根据解码表提取它,并在此处发布代码:#coding:utf-8importsysimportosusb_codes={0x04:"aA",0x05:"bB",0x06:"cC",0x07:"dD",0x08:"eE",0x09:"fF",0x0A:"gG",0x0B:"hH",0x0C:"iI",0x0D:"jJ",0x0E:"kK",0x0F:"lL",0x10:"mM",0x11:"nN",0x12:"oO",0x13:"pP",0x14:"qQ",0x15:"rR",0x16:"sS",0x17:"tT",0x18:"uU",0x19:"vV",0x1A:"wW",0x1B:"xX",0x1C:"yY",0x1D:"zZ",0x1E:"1!",0x1F:"2@",0x20:"3#",0x21:"4$",0x22:"5%",0x23:"6^",0x24:"7&",0x25:"8*",0x26:"9(",0x27:"0)",0x2C:"",0x2D:"-_",0x2E:"=+",0x2F:"[{",0x30:"]}",0x32:"#~",0x33:";:",0x34:"'\"",0x36:",<",0x37:".>",0x4f:">",0x50:"<"}defcode2chr(filepath):lines=[]pos=0forxinopen(filepath,"r").readlines():代码=int(x[6:8],16)#第三个字节ifcode==0:continue#newlineordownarrow-movedownifcode==0x51orcode==0x28:pos+=1continue#uparrow-moveupifcode==0x52:pos-=1continue#selectthecharacterbasedontheShiftkeywhilelen(行)<=pos:lines.append("")ifcodeinrange(4,81):ifint(x[0:2],16)==2:lines[pos]+=usb_codes[code][1]else:lines[pos]+=usb_codes[code][0]forxinlines:print(x)if__name__=="__main__":code2chr('E://CTFpractice/miscellaneous/18e4c103d4de4f07b33a42cb1f0eaa1d/00000122/usbdata.txt')当然,也可以直接使用王一航的代码直接从pcap包中解压文件,省去了中间很多步骤,代码也很通用