USB接口流量分析与CTF解题技巧

渗透技巧 1年前 (2023) admin
410 0 0
#01

前言

USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑外部设备的连接和通讯。是应用在PC领域的接口技术。在CTF比赛中最为常见的USB流量分析就是鼠标和键盘的流量分析了,下面我将会带大家学习比赛中这两种USB流量的分析技巧和解题思路。

#02

键盘流量

capture.data
USB协议数据部分在Leftover Capture Data`域中,数据长度为八个字节,其中键盘击键信息集中在第三个字节中,数据如下图所示
如果流量存储在usb.capdata可以用以下命令导出。
tshark -r usb.pcap -T fields -e usb.capdata | sed '/^s*$/d' > usbdata.txt
然后使用如下脚本加冒号,再用下面这个脚本提取出数据。
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
    a=f.readline().strip()
    if a:
        if len(a)==16# 键盘流量的话len为16 鼠标为8
            out=''
            for i in range(0,len(a),2):
                if i+2 != len(a):
                    out+=a[i]+a[i+1]+":"
                else:
                    out+=a[i]+a[i+1]
            fi.write(out)
            fi.write('n')
    else:
        break
fi.close()
最后用脚本提取。
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:"." }
nums = []
keys = open('out.txt')
for line in keys:
    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':
         continue
    nums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:
    if n == 0 :
        continue
    if n in mappings:
        output += mappings[n]
    else:
        output += '[unknown]'
print 'output :n' + output

#03

鼠标流量

capture.data
USB协议鼠标数据部分在Leftover Capture Data`域中,数据长度为四个字节。
其中第一个字节代表按键,当取0x00时,代表没有按键、为0x01时,代表按左键,为0x02时,代表当前按键为右键。第二个字节可以看成是一个signed byte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素,第三个字节与第二字节类似,代表垂直上下移动的偏移
如图所示数据信息为0x00002000,表示鼠标垂直向上移动20
Flag藏于usb流量中,通过USB协议数据中的鼠标移动轨迹转换成Flag
同样的我们要先提取数据出来。
tshark -r usb2.pcap -T fields -e usb.capdata | sed '/^s*$/d' > usbdata.txt
然后使用上面加冒号的脚本,再用下面这个脚本提取出数据。
nums = []
keys = open('out.txt','r')
f = open('xy.txt','w')
posx = 0
posy = 0
for line in keys:
    if len(line) != 12 :
        continue
    x = int(line[3:5],16)
    y = int(line[6:8],16)
    if x > 127 :
        x -= 256
    if y > 127 :
        y -= 256
    posx += x
    posy += y
    btn_flag = int(line[0:2],16)  # 1 for left , 2 for right , 0 for nothing
    if btn_flag == 2 : # 1 代表左键
        f.write(str(posx))
        f.write(' ')
        f.write(str(posy))
        f.write('n')
f.close()
再使用如下脚本将图画出来:
from PIL import Image
img = Image.new('RGB',(2000,2000),(255,255,255))
#创建Image对象
f = open('xy.txt')#xy.txt文件
for line in f.readlines():
    point = line.split()
    img.putpixel((int(point[0]),int(point[1])),(0,0,0))
#读取文件中的每一行,并修改像素
f.close()
img.show()
usbhid.data
鼠标的流量存放在hid中因此导出方法不同tshark导出如下:
tshark -r test2.pcapng -T fields -e usbhid.data > usbdata.txt
       

原文始发于微信公众号(山石网科安全技术研究院):USB接口流量分析与CTF解题技巧

版权声明:admin 发表于 2023年3月13日 上午10:55。
转载请注明:USB接口流量分析与CTF解题技巧 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...