在网络安全CTF比赛中,流量分析题是MISC杂项方向常常会出现的题型。这类CTF题的特征是会提供一个包含流量数据的pcap文件,选手通过该文件筛选和过滤其中无关的流量信息,根据关键流量信息找出flag或者相关线索,一般flag隐藏在某个数据包里面,或者需要从中提取一个文件出来等等。
如果流量分析题要细分下去的话可以按照不同的流量协议题目类型进行划分,比如web流量分析题、USB流量分析、无线协议流量分析、加密流量分析等等。
然而这些都绕不过一个很重要、功能十分强大的工具,也就是wireshark,下面将展开对wireshark工具使用的简单介绍以及不同流量分析题目的解题思路和技巧。
WireShark是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
WireShark在网络封包和流量分析领域有着十分强大功能的工具,基本使用分为数据包筛选、数据包搜索、数据包还原、数据提取四个部分。
当我们拿到一个pcap文件时可以直接拖进wireshark打开,或者使用wireshark的导入文件功能,打开后界面入下:
其中分组详情中,会显示数据包的所有详细信息内容,包括协议中的每一个字段,各行信息分别如下:
再来介绍下最重要的筛选功能模块,pcap文件一般都会包含很多信息干扰的无关流量数据,这就需要我们具备快速筛选出关键数据流量的能力和技巧,从而快速定位到准确的流量进行分析。
协议过滤
直接在抓包过滤器中呼入协议名即可,比如http、tcp、icmp等等查看所指协议的数据包列表
ip过滤
筛选条件为ip源地址表达式:
ip.src ==源ip地址
筛选条件为ip目的地址表达式:
ip.dst==目的地址
端口过滤
显示源主机或者目的主机端口为80的数据包列表
tcp.port ==80
只显示TCP协议的源主机端口为80的数据包列表
tcp.srcport == 80
只显示TCP协议的目的主机端口为80的数据包列表
tcp.dstport == 80
MAC地址过滤
只显示目标mac的数据包列表:
eth.dst ==目标mac
只显示源mac的数据包列表:
etc.src eq
只显示源mac和目标mac的数据包列表:
eth.addr eq
包长度筛选
筛选长度大于xx的tcp流量包:
tcp.len >= xx
筛选长度为xx的整个流量包:
frame.len == xx
在wireshark界面按“Ctrl+F”,可以直接进行关键字搜索,比如直接搜索flag关键字:
Wireshark的搜索功能支持正则表达式、字符串、十六进制等方式进行搜索,通常情况下直接使用字符串方式进行搜索。
搜索栏的左边下拉,有分组列表、分组详情、分组字节流三个选项,分别对应wireshark界面的三个部分,搜索时选择不同的选项以指定搜索区域:
在wireshark中,存在一个追踪流的功能,可以将HTTP或TCP流量集合在一起并还原成原始数据,具体操作方式如下:
选中想要还原的流量包,右键选中,选择追踪流 – TCP流/UPD流/SSL流/HTTP流。
可在弹出的窗口中看到被还原的流量信息:
Wireshark支持提取通过http传输(上传/下载)的文件内容,方法如下:
在弹出的窗口中可以选择导出的文件类型:
http流量题
例题1
这类题目先过滤显示http协议
右键跟踪tcp流后,可以通过返回包的内容去猜测请求包的加密参数的作用
这里通过返回包的内容可以猜测出这里是列出了文件目录信息,加密的请求流量可以看出来是菜刀的流量
将其中的base64解码后内容如下:
增加stream流数查看数据包:
同样解其中的base64,能看到flag.tar.gz
也就是说返回包中的内容应该有包含这个flag.tar.gz文件
找到这个对应的数据包后右键查看包字节详情
返回包中X@Y是菜刀流量的标志位,需要把这个标志位去掉,调整以3位置开始即可,如图所示,然后后选择以压缩解密的方式查看获得flag
例题2
用wireshark打开题目提供的pcap文件,同样先看http流量,然后逐个流开始看,从第一个流开始可以看到类似例题1的菜刀流量
到第7个流时发现跟之前的包长度完全不一样,这个流有一大串字符串
z1参数base64解密出来是D:wamp64wwwupload6666.jpg
猜测z2参数就是这图片的内容,16进制转图片得到:
通过这图片可以看出来得到了一串密码,不过这里还不确定是什么密码,接着逐个流继续玩下看,到了第9个流时:
可以大致看出zip里面有个 flag.txt 然后需要密码,base64解密z1参数后得到:
D:wamp64wwwuploadhello.zip
于是直接查看这个数据包的返回包
右键查看包详情,以Raw的形式显示
然后复制下来用010editor以16进制保存为hello.zip文件,然后用上面图片得出的密码进行解压得到flag
https流量题
如果遇到SSL加密流量的题目,比如这道例题:
如果追踪流的话可以追踪TLS流,不过由于是加密流量,不过显示的也是空白
这道题比较简单,题目直接提供了密钥文件,这里主要是重点介绍下如何加载密钥文件。
首先先打开首选项设置
在Protocols下面找到TLS选项
然后点击Browse加载密钥文件,然后点击确定,最后还需要进行重新加载
加载完密钥文件后就可以筛选http流量了,在最后可以看到有个flag.txt,跟踪TLS流查看得到flag
USB流量题
usb接口是目前最为通用的外设接口之一,通过监听该接口的流量,可以得到很多有意思的东西。例如键盘击键,鼠标移动与点击,存储设备的明文传输通信,usb无线网卡网络传输内容。
例题1
打开流量包:看到的确是usb流量,并且没有杂包(如果有不是usb的包需提前滤除掉)
把这个流量包放进kali中提取数据:
tshark -r example.pcap -T fields -e usb.capdata > usbdata.txt
然后就得到了 usbdata.txt文件:
然后用脚本进行处理得到flag:
# -*- coding: cp936 -*-
import os
os.system("tshark -r test.pcapng -T fields -e usb.capdata > usbdata.txt")
normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":""","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
nums = []
keys = open('usbdata.txt')
for line in keys:
#print(line)
if len(line)!=17:
continue
nums.append(line[0:2]+line[4:6])
#print(nums)
keys.close()
output = ""
for n in nums:
if n[2:4] == "00" :
continue
if n[2:4] in normalKeys:
if n[0:2]=="02":
output += shiftKeys [n[2:4]]
else :
output += normalKeys [n[2:4]]
else:
output += '[unknown]'
print('output :' + output)
给了一个pcap包,提示密码是6666XXXX,这道题使用到kali自带的无线攻击工具aircrack-ng,先用这个打开流量包看看
aircrack-ng WIFI.pcap
发现flag,但是之间提示我们需要用完整的密码替换password那块,下面提示我们指定目标的序号
可以使用kali自带的字典生成工具crunch
crunch 8 8 6666%%%% > password.txt
// 后面两个8是指定最大最小长度,6666%%%%是密码模糊匹配,%代表数字,然后重定向到文件中
下面继续使用aircrack-ng工具爆破:
aircrack-ng WIFI.pcap -w password.txt
拿到密码后,替换进flag即可。
这道题的流量都是工业协议的内容,先常规找flag关键字,这类题还有个技巧是看流量的长度,找其中跟其他流量明显不一样的流量
其中有base64,在网络接口层中
右键查看详细包数据内容
看到是张图片,这里直接去掉前面的字符串,留下base64编码的字符串
然后选择以base64的方式解码
然后以查看图片的方式显示,得到包含flag的图片
蓝牙的题可以先通过wireshark的协议分级功能进行分级:
找到OBEX,选择应用过滤,为什么要过滤出OBEX协议的流量呢,原因是OBEX全称为Object Exchange,用于在蓝牙设备间传数据对象,来源于红外定义的协议,后被蓝牙采用
通过这个OBEX协议找到what_you_want.7z压缩文件传输的流量包
将这个压缩包导出,不过需要密码
提示说是蓝牙的pin,直接查找pin关键字,不过要注意选择的是搜索包的详情
密码为141854,解压得到flag
原文始发于微信公众号(山石网科安全技术研究院):流量分析之常见协议解题技巧