从bugku几道流量题学习tshark-【USB流量截取】【花点流量听听歌】

1前言

.
【文章首发于:https://mp.weixin.qq.com/s/bAYphUPNG1gwsOugReFSbg】

今天在bugku上做了几道Misc题,都是和流量相关的,做题顺序也恰好是从简单到难,也是学到不少东西

分别是:USB流量截取 -->> 花点流量听听歌

image-20240202194529782

image-20240202194542244

遇到一些问题,这里做个记录,也因为第一次正式接触流量题,比较深奥的东西暂写不出,同时很多东西不太熟悉、懵懂懵懂,如笔记有错误还请不吝指正。

[本意不是写wp,所以就不具体写解题]

1.1前置知识

​ USB流量指的是USB设备接口的流量,攻击者能够通过监听usb接口流量获取键盘敲击键、鼠标移动与点击、存储设备的铭文传输通信、USB无线网卡网络传输内容等等。在CTF中,USB流量分析主要以键盘和鼠标流量为主。

①键盘流量:

​ USB协议键盘数据部分,会出现在 Leftover Capture Data 或者 HID Data 中(这就是踩的坑),数据长度为8个字节,我们关注第3个字节 15,这里是16进制的15. 每次键盘操作后都会产生一个数据包。

image-20240202210623892

​ 以及 HID Data 中的数据:

image-20240202211258009

②鼠标流量:

​ USB协议鼠标数据部分,也会出现在 Leftover Capture Data 或者 HID Data 中,此时数据长度有所变化,为 4 个字节。(写此文的时候还未做过此类题型,直接拿的参考文章里面的图)

image-20240202211512881

参考:https://blog.csdn.net/ON_Zero/article/details/130528679

2正文

题1、USB流量截图:

第一题很友好,入门usb流量分析的经典题。直接wireshark打开usb流量包,不需要做任何过滤器筛选。

数据包里面全有Leftover Capture Data,我们做相关提取就好


注意下图共66条数据包

image-20240202212323400

跟着 https://blog.csdn.net/ON_Zero/article/details/130528679 手敲了一遍代码,成功把Leftover Capture Data流量提取出来了

这里我们看上图,发现所有数据包都是 Leftover Capture Data ,于是可以跟着参考文章里面的tshark的这个命令提取数据:

.\tshark.exe -r D:\Downloads\usb.pcap -T fields -e usb.capdata >D:\Downloads\usbdata.txt

image-20240202212157141

提取出来的 usbdata.txt ,也有66条数据,同pacp里面数据条数一致。

image-20240202212612648

这里介绍一下我们做题时 tshark 的常用参数:【官方文档:https://www.wireshark.org/docs/man-pages/tshark.html】

-r:要分析的输入文件,-r usb.pcag

-T:输出的格式,可以选择 ek|fields|json|jsonraw|pdml|ps|psml|tabs|text ,注意 fields 要配合 -e 参数使用。

-e:导出的协议字段,可以同时使用多个 -e,例如 -e frame.number -e ip.addr

-Y:显示过滤器,可以理解为wireshark的过滤器

-r:显示所有报文

image-20240202213745188

-T fields:不加-e无法使用

image-20240202213839175

-T fields -e frame.number -e usb.src:只导出 f.num 和 usbsrc 这两个字段

image-20240202214101686

-Y 'usb.data_len == 8 && usb.src=="2.5.1"':过滤条件为 data_len==8 且 src地址为"2.5.1"

(-Y后面尽量外面用单引号)

image-20240202214121743

最后附此题脚本1:

#脚本1
#python3
def setp1():
    f=open("usbdata.txt",'r')
    fi=open("usbdata_out.txt","w")
    while 1:
        a=f.readline().strip()
        # print(a)
        if a:
            if len(a)==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+"\n")
        else:
            break
    fi.close()

def step2():
    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:"." }
    keys = open("usbdata_out.txt",'r')
    nums=[]
    flag=''
    for key in keys:
        # print(key.strip())
        key=key.strip()
        tmp=key.split(":")
        # print(tmp)
        flags=True #标识符,识别其他字符是否全为 00
        for i in range(len(tmp)):
            if i!=2:
                if tmp[i]=="00":
                    continue
                else:
                    flags=False
                    break
        if flags:
            nums.append(int(key[6:8],16))
        pass

    for num in nums:
        # print(num)
        if num in mappings:
            # print(mappings[num])
            flag+=mappings[num]
    print(flag)
    # FLAGPR3550NWARDSA2FEE6E0

到这里一切正常,学着参考资料做出了这题,但下一题就发现了问题

题2:花点流量听听歌

拿到题目是一个压缩包,压缩包里面有一个mp3文件(mp3可以正常播放),通过binwalk、strings等分析发现mp3文件里面还有隐写了其他压缩包

进一步提取得到 1、加密的flag.rar 2、描述文件.txt 3、whereiskey.pcapng流量包

image-20240202215323783

分析流量包:

我们重点关注的是3流量包,打开分析:

image-20240202215523170

这次更复杂点,数据量更大,而且仔细一看能发现比之前的Usb的流量包多了不同的数据,

其中前30条报文应该是usb通信的准备配置数据包,往后应该就是鼠标/键盘通信的数据包了,仔细观察发现是8个字节,应该是键盘流量

image-20240202215947984

这时准备用之前的tshark语句继续导出:(兴高采烈)

tshark.exe -r whereiskey.pcap -T fields -e usb.capdata >D:\Downloads\usbdata.txt

奇怪的事情发生了,发现导出的usbdata.txt内容为空?后续换其他电脑其他版本的wireshark,以及kali中的wireshark都无法提取

第一反应想到是否是因为 whereiskey.pcagpng 和 usb.pcag 内容有差异导致的,于是仔细对比两个数据包的差异:

相同处:

​ 1、usb.pcag和whereiskey.pcag都有从 ‘Source==x.x.x -->> Des == host’ 的数据包,其info信息都为 ‘URB_INTERRUPT IN’。同时usb.pcag的数据包全是这种流量。

不同处:1、whereiskey.pcag 比 usb.pcag 多了配对的流量 (非重点)

​ 2、whereiskey 包还有 从 ‘Source==host -->> Des == x.x.x’ 的数据包(会是这两个的原因吗)

​ 3、whereiskey 包的 ‘Source==x.x.x -->> Des == host’ 的框架不再是之前的 Leftover Capture Data 而是 HID Data (这也是后来才发现的,最初没注意到)

提取生成new.pcapng:

于是在我最初的想法中,1、2是原因,所以这里我用了一个笨方法,手动从wireshark中提取之前那种数据包。好巧不巧算是瞎猫碰上死耗子,操作如下:

① 过滤器填写:usb.src==“2.5.1”,

② 导出筛选的76条数据包,保存为new.pcapng

image-20240203001932644

new.pcapng:(不仔细看没发现新生成的new.pcapng包里面已经从 之前的 HID Data 变---->>>成 Left xxx 了)

image-20240203004935990

③ 使用命令:

tshark.exe -r new.pcap -T fields -e usb.capdata >D:\Downloads\usbdata.txt

咦,又可以了?

image-20240203002214783

当时隐约感觉有点问题,但是又没细想,继续写题了。回过头来越想越不对劲,于是先仔细看了看别人的wp,附两篇wp:

1、https://demonstaralgol.github.io/Misc/Bugku/Bugku%20Misc%2012%EF%BC%8869-72%EF%BC%89.html

2、https://www.cnblogs.com/Moomin/p/15085041.html

发现别人都是用 工具 UsbKeyboardDataHacker.py 直接一步到位的,于是github查看py源码,发现里面大致和之前写的代码逻辑一样,最不一样之处就在于工具将 tshark命令写在了python脚本里面执行,

image-20240203002946181

又在kali上执行这个脚本发现还是无法提取 whereiskey.pcap 的流量,于是将里面 tshark 的语句提取出来,直接拿到命令行使用,发现仍有问题,经过不断控制变量测试,最终发现是 -e usb.capdata 搞的鬼。

(ps拓展一下:【已解决】Python的坑:os.system()运行带有空格的长路径和双引号参数有bug_os.system怎么调试-CSDN博客

测试过程也遇到了’脚本/issues/7’中的情况,这个-Y参数值得注意,也更加肯定了我要重新读 tshark 的帮助文档,要搞清楚为什么语法正确但提取失败。

image-20240203003929370

再去查阅 tshark --help 、官方文档、以及其他参考资料:

1、一文读懂网络报文分析神器Tshark:https://cloud.tencent.com/developer/article/2312883

2、USB HID 流量分析 - LinuxStory:https://linuxstory.org/usb-hid-traffic-analysis/

3、CTF中我的USB键盘鼠标流量解密指南和脚本 - FreeBuf:https://www.freebuf.com/sectool/347971.html

4、https://www.wireshark.org/docs/man-pages/tshark.html

5、https://wiki.wireshark.org/CaptureSetup/USB#a-word-of-warning-about-usbpcap

经过一系列的测试,查阅、最终发现 tshark 的 -e 参数是显示字段的功能,-Y起过滤条件的作用。

这里对whereiskey.pcapng包使用 -e usb.capdata 参数的话,导出为空并不是语法错了,其语法是正确的(tip:理由是在wireshark的过滤条件里面写"usb.capdata" 并没有爆红色,而是绿色),而是因为 whereiskey.pcapng 本身就没有 usb.capdata 字段。于是写了几个语法来佐证我的想法:

1、输入:tshark -r whereiskey.pcapng -T fields -e frame.number
# 因为frame.number是肯定存在的,就用frame.number来测试
# 正常返回所有序列号,1-182,对应数据包条数

image-20240203005741853

2、输入:tshark -r whereiskey.pcapng -T fields -e frame.number -Y "usb.capdata && usb.data_len == 8"
# 这里参考的是 UsbKeyboardDataHacker.py 的issues
# 发现查询为空,于是改
3、输入:tshark -r whereiskey.pcapng -T fields -e frame.number -Y "usb.data_len == 8"
# 有数据了,于是这才发现是usb.capdata根本不存在

image-20240203010206322

那么这个usb.capdata究竟是个啥呢?先回到两个 wireshark 数据包里面看看:

image-20240203010345657

image-20240203010440626

发现了啥?whereiskey包在 “usb.capdata” 这一过滤条件下显示0/182,但new.pcapng包,是76/76,全部显示的?

new.pcag是从whereiskey.pcag提取出来的啊,既然我都能在new.pcag里面用 usb.capdata 成功筛选出数据,为啥不能在whereiskey.pcag里面筛选呢,带着这个疑问仔细比对两个数据包:

根据红框可以确定new-76和whereiskey-181是同一个数据包,也即76从181提取过来的

那为什么无法提取whereiskey-181呢?

于是发现了绿框中的内容:一个是 HID Data / 另一个是Leftover Capture Data

image-20240203011517393

难怪。。这下就明确了,再次wireshark查看:

new.pcapng:由这里得出提取 Leftover Capture Data 的语句应为:usb.capdata

【这里就对应上之前说的“瞎猫碰上死耗子”,即对new.pcapng使用同样的语句就能提取成功,反观whereiskey.pcag不行】

image-20240203011907073

whereiskey.pcag:这里得提取 HID Data 的语句应为:usbhid.data

image-20240203012022433

至此,问题得到解决:# 重新更新语句:

tshark -r whereiskey.pcapng -T fields -e usbhid.data -Y 'usb.data_len == 8 && usb.src=="2.5.1"'

image-20240203012151564

再次运行脚本1,得到:

THK[DEL]EPE[DEL]ASY[DEL]SWOI[DEL]RDS[DEL]NOTU[DEL]HES[DEL]REB[DEL]6[DEL]

ok完美解决。

最后,建议自己重新更新一下脚本,多写几个判断情况,下次遇到这种题,你也能秒出flag,虽然也比手动提取快不了几十秒哈哈哈

3参考资料:

1.[USB HID 流量分析],https://www.freebuf.com/sectool/347971.html

2.[CTF中我的USB键盘鼠标流量解密指南和脚本],https://www.freebuf.com/sectool/347971.html

3.[【流量分析】USB键盘与鼠标流量分析],https://blog.csdn.net/ON_Zero/article/details/130528679

4.[tshark官方帮助文档],https://www.wireshark.org/docs/man-pages/tshark.html

5.[一文读懂网络报文分析神器Tshark: 100+张图、100+个示例轻松掌握],https://cloud.tencent.com/developer/article/2312883

6.[Bugku-Misc-花点流量听听歌],https://www.cnblogs.com/Moomin/p/15085041.html

7.[Bugku Misc 12(69-72)],https://demonstaralgol.github.io/Misc/Bugku/Bugku%20Misc%2012%EF%BC%8869-72%EF%BC%89.html

8.[深入理解USB流量数据包的抓取与分析],https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html

9.UsbKeyboardDataHacker.py,https://github.com/WangYihang/UsbKeyboardDataHacker/blob/master/UsbKeyboardDataHacker.py

10.[Python的坑:os.system()运行带有空格的长路径和双引号参数有bug],https://blog.csdn.net/Scott0902/article/details/129446831

11.Wireshark全版本下载地址:https://1.as.dl.wireshark.org/win64/all-versions/

后记:

因为在找寻问题的过程中我也不可能就能肯定可以解决它,复现这一发现过程是凭记忆,其中难免会因为记忆混乱,有一些重复或者顺序上的错误,请体谅。最主要是将这一发现过程分享出来,供大家参考,加深印象。

对于比较熟悉这一题型的大佬应该是不会看到这篇文章,不过对于我们菜鸟来说,我们做题目的时候遇到无法直接复现别人的wp中部分步骤时,可以参考我这种思路来找、解决问题。为啥别人可以直接脚本一步出来结果,一种是usb协议改变了,或者本机wireshark版本、环境有问题。二就是大概率其中的一些坑他人也踩过、于是后来已经修改过代码,再次遇到这种题就直接脚本一键出来结果了。所以我们复现遇到问题,也不妨多看看多想想,总能找到解决方法的()

两个小问题:

①为啥whereiskey.pcapng经过筛选重新导出了new.pcapng后,new.pcapng里面从一开始的 Leftover Capture Data 变成HID Data 了呢?我的猜测是usb协议更新了,后续支持经过后者传输数据。猜测理由之一是数据包时间显示是2021年的,但现在已经2024年了,很多东西已经更新了,经过我在wireshark里面重新导出后,wireshark已经自动把 Leftover Capture Data 变成 HID Data 了。

②另一个有趣的事,我把whereiskey.pcapng(或者old.pcapng) 和 new.pcapng一齐发给学姐看了,在她电脑上居然可以直接usb.capdata搜到【汗颜】,她的wireshark版本是:3.6.7.0

image-20240203015100129

image-20240203015154379

为此,我还特意重新用kali/win10,并且试过了3.6.7.0,3.6.8.0,以及截至到2024-2-2最新版本的wireshark,都不能直接通过这个过滤。

细心点可以发现她给的old2.pcapng应该不是我发的原文件,因为原来是182条,但不知为何总条数只有91条了。但为啥又凑巧是一半呢…我也不懂,最后我的解释是:

image-20240203015529601

  • 21
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值