2020天津市ctf大赛之usb数据包流量分析题

1.鼠标流量分析

1.常用命令

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

如果提取出来的数据有空行,可以将命令改为如下形式:

tshark -r usb2.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt

如果提取出来的数据没有冒号,可以用脚本来加上冒号(因为一般的脚本都会按照有冒号的数据来识别,有冒号时提取数据的[6:8],“无冒号时数据在[5:7]”—但是我在另一篇博客{见USB流量取证分析}上看的是无冒号时数据在[4:6],我用的[5:7])

参数:

-r:设置tshark分析的输入文件
-T:设置解码结果输出的格式,包括fileds,text,ps,psml和pdml,默认为text

对于鼠标流量的字节分析
基础知识

鼠标移动时表现为连续性,与键盘击键的离散性不一样,但实际上鼠标动作所产生的数据包也是离散的。不同的鼠标抓到的流量不一样,一般的鼠标流量都是四个字节

每一个数据包的数据区有四个字节。
第一个字节代表按键:

当取0x00时,代表没有按键,当取0x01时,代表按左键,当取0x02时,代表当前按键为右键。

第二个字节可以看成是一个signed byte类型,其最高位为符号位:

当这个值为正时,代表鼠标水平右移多少像素
当这个值为负时,代表鼠标水平左移多少像素。
第三个字节与第二字节类似,代表垂直上下移动的偏移。
鼠标流量包分析

这个代表的意思便是鼠标右移01像素,垂直向上移动ff.

题目实解

使用tshark命令将数据提取出来

tshark -r usbx.pcap -T fields -e usb.capdata > usbdata.txt

分离出usbdata.txt文件 如图:
利用tshark分离这个.txt是我整理过的,本来在0001fe00前面还有大量的空行,我把它删掉了
导出后由于不知道操作者是用左键还是右键进行鼠标移动以及拖动轨迹,所以需要自己尝试一下,这道题经过测试发现是用左键画的,将通用脚本中的btn_flag改为1即可

#sniffer.py
nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
    x = int(line[2:4],16)
    y = int(line[5:7],16)
    if x > 127 :
        x -= 256
    if y >115 :
        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 == 1 : # 1 代表左键,2代表右键
        result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()
result.close()

运行sniffer.py脚本

python3 sniffer.py

得到result.txt坐标内容
坐标内容
接下来用gnuplot软件来画出鼠标生成的图像

gnuplot -e "plot 'result.txt' " -p

得到最终flag
flag
注:我这里的usbdata.txt文件中的数据没有冒号,如果需要加上 : 则使用下面的脚本(因为一般的脚本都会按照有冒号的数据来识别,有冒号时提取数据的[6:8],无冒号时数据在[5:7])

f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
    a=f.readline().strip()
    if a:
        if len(a)==8: # 键盘流量的话len改为16
            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()

转换后如图:
:转换

usbdata.txt数据中有 : 后,使用新的sniffer.py脚本来运行

#sniffer.py
nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
    x = int(line[2:4],16)
    y = int(line[5:7],16)
    if x > 127 :
        x -= 256
    if y >115 :
        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 == 1 : # 1 代表左键,2代表右键
        result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()
result.close()

得到result.txt最后使用

gnuplot -e "plot 'result.txt' " -p

得到结果万事大吉
文章参考:USB流量取证分析
记一道USB流量分析CTF题
记一次USB流量分析CTF题

第一次写博客 内容格式有所不足,请各位多多指正!如博客内容有误或者有不明白的地方,请在下方评论

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/108926046