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

   日期:2020-10-07     浏览:182    评论:0    
核心提示: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:

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文件 如图:
这个.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

注:我这里的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题

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服