USB流量分析总结(实战[NISACTF 2022] 破损的flag)

一、USB流量分析

USB协议的数据部分在 Leftover Capture Data 域之中,可以用tshark命令将leftover capture data 数据单独提取出来,利用命令如下:

tshark -r 1.pcapng -T fields -e usb.capdata > usbdata.txt
tshark -r 1.pcapng -T fields -e usbhid.data > usbdata.txt

二、鼠标流量分析

在CTF中对鼠标流量一般是需要还原鼠标的经过轨迹,关键信息就在还原轨迹之中。由于不同鼠标使用的鼠标协议是不同的,每个数据包的数据区可能是4字节、6字节或者8字节。
数据报的数据区若是4字节时的含义如表9-3所示。
第一字节:按键。0x00为没有按键, 0x01为左键,0x02为右键。
第二字节:水平位移。为正(小于127)是向右移动多少像素,为负(负数补码,大于127小于255)是向左移动多少像素。
第三字节:垂直位置。为正(小于127)是向上移动多少像素,为负(负数补码,大于127小于255)是向下移动多少像素。
第四字节:滚轮数据。0,没有滚轮运动;1,垂直向上滚动一下;2,水平滚动右键一次;0xFE,水平滚动左键单击一下;0xFF,垂直向下滚动一下。

当数据区是6个字节时,第一个字节表示按键指示左右键, 第二个字节表示水平位移,第三个字节表示垂直位移。
数据区若是8个字节时,第一个字节表示按键指示左右键,第三个字节表示水平位移,第五个字节表示垂直位移。
可以利用Tshark命令将Leftover Capture Data 提取保存到 usbdata.txt 文件中:

tshark -r 1.pcapng -T fileds -e usb.capdata > usbdata.txt
tshark -r 1.pcapng -T fields -e usbhid.data > usbdata.txt

对提取出来的键盘数据,我们可以写一个键盘数据转换坐标脚本convert.py

nums = []
keys = open('usbdata.txt','r')
result = open ('1.txt','w')
posx = 0
posy = 0
for line in keys:
	line =	line.strip()
	#处理类似“0000120000000000”内容
	if len(line) == 16:
		x = int(line[4:6],16)
		y = int(line[8:10],16)
	#处理类似“00:00:12:00:00:00:00:00”内容
	elif len(line) == 24:
		x = int(line[6:8],16)
		y = int(line[12:14],16)
	else:
		continue
	if x>127: x -= 256
	if y>127: y -= 256 
	posx += x
	posy += y
	#1 for left(左键),2 for right(右键),0 for noting(无按键)
	btn_flag = int(line[0:2],16)
	if btn_flag == 1:
		result.write(str(posx)+''+str(-posy)+'\n')
keys.close()
result.close()	

然后我们用UsbMiceDataHacker的工具,把坐标数据作画来还原鼠标活动轨迹。

三、实战: 【DASBOOK】9.4.2键盘流量分析

键盘数据包的数据长度为8个字节, 击键信息在第3个字节。每次击键都会产生一个数据包。 如果我们拿到的流量包是USB协议,即数据报中Capture Data 的信息都是8个字节,几乎只有第3个字节不为00,下图很明显能看出来:
在这里插入图片描述
当拿到atta.pcapng流量包后,放到kali里面通过tshark命令将Leftover Capture Data提取保存到usbdata.txt文件中,命令如下:

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

然后编写一个键盘映射脚本Keyboard.py,针对提取出的usbdata.txt代码如下:

#-*-coding:utf-8-*-
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:"!",0x1f:"@",0x20:"#",0x21:"$",0x22:"%",0x23:"^",0x24:"&",0x25:"*",0x26:"(",0x27:")",0x28:"<RET>",0x29:"<ESC>",0x2a:"<DEL>",0x2b:"\t",0x2c:"<SPACE>",0x2d:"_",0x2e:"+",0x2f:"{",0x30:"}",0x31:"|",0x32:"<NON>",0x33:"\"",0x34:":",0x35:"<GA>",0x36:"<",0x37:">",0x38:"?",0x39:"<CAP>",0x3a:"<F1>",0x3b:"<F2>",0x3c:"<F3>",0x3d:"<F4>",0x3e:"<F5>",0x3f:"<F6>",0x40:"<F7",0x41:"<F8>",0x42:"<F9>",0x43:"<F10>",0x44:"<F11>",0x45:"<F12>"}
result = ''
with open('usbdata.txt','r') as f:
    for line in f.readlines():
        line = line.strip()
        #处理形如“0000120000000000”的内容
        if len(line) == 16:
            s = int(line[4:6],16)
        #处理形如“00:00:12:00:00:00:00”
        elif len(line) ==24:
            s = int(line[6:8],16)
        else:
            continue
        if s!=0:
            result += mappings[s]
print(result)

得到结果:
在这里插入图片描述
然后自己手动转换成 flag{helloworld!}

四、实战:[NISACTF 2022] 破损的flag

下载后的附件,无扩展名。
在kali中通过file命令可得出是pcap流量包数据:
在这里插入图片描述
键盘数据包的数据长度为8个字节, 击键信息在第3个字节。

然后我们用前一个实战案例中的tshark命令提取出usbdata.txt ,如下图:
在这里插入图片描述

我们可以用前文的 键盘映射脚本进行提取,得到信息:
在这里插入图片描述

推测出来是键盘密码,在键盘密码中寻找被包围起来的字母,如下所示:
UJKO:i
POK::l
QWSZ:a
QASE:w
IKLP:O
RDCVG:f
NJK<:m
RDCVG:f
TFVBH:g
WSDR:e
NJK:m
UHNMK:j
TFVBH:g
RDCVG:f
UJKO:i
POK::l
WSDR:e
BHJM:n
YHJI:u
POK:l
WAZXD:s
XDFV:c
RFGY:t
YHJI:u

把这段代码解密后就是:
imgulfflagiswelcometfjnu
因为要补全单词:
得到flag{welcome_to_fjnu}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值