ctf流量分析寻找flag
ctf流量分析寻找flag
拿到一个CTF流量分析题,十有八九是析寻一堆pcap文件。别急着上Wireshark乱点,流量分先看文件大小。析寻几百KB的流量分可能只是HTTP明文传输,几十MB的析寻八成藏着大流量或分片重组。我见过最坑的流量分一个题,pcap里只有两个包,析寻一个ARP一个ICMP,流量分flag就藏在ICMP的析寻data字段里——用tshark -r file.pcap -Y icmp -T fields -e data直接拉出来,十六进制转ASCII就完事。流量分
但多数情况没这么友好。析寻上周打某CTF,流量分流量包是析寻USB协议,鼠标移动轨迹。流量分当时第一反应是“这能藏啥”,结果用tshark -r usb.pcap -Y "usb.transfer_type == 0x01" -T fields -e usb.capdata导出所有坐标,再写个Python脚本画图,屏幕上直接拼出flag。这种题考的不是协议多深,而是你愿不愿意把数据从二进制里拽出来换个角度看。
流量分析的核心从来不是“分析”,而是“找不同”。正常流量里混进一个异常包,或者所有包的长度都规整,唯独某个包多了几个字节——那多半就是线索。
HTTP流量最直白。过滤http.request.method == "POST",看有没有上传大文件。有次遇到一个上传了zip的,导出对象里直接解压出flag.txt。但出题人也不傻,现在流行把flag拆成多段,藏在不同的TCP流里。Follow TCP Stream一个个翻?太慢。用tshark -r file.pcap -z follow,tcp,ascii,0批量导出所有流,再grep -i "flag{ ",秒出。要是流量经过加密,比如TLS,那就得找密钥。有时候密钥就明文写在某个HTTP响应里,或者藏在DNS的TXT记录里——tshark -r file.pcap -Y dns -T fields -e dns.txt,别漏了。
DNS隧道题更阴间。数据包全是A记录查询,但域名长得离谱,比如aGVsbG8=.evil.com。把子域名部分base64解码,拼起来就是flag。有次我傻乎乎地手动解了二十多个包,后来发现用tshark -r dns.pcap -Y "dns.qry.name" -T fields -e dns.qry.name | cut -d. -f1 | base64 -d一行命令搞定。工具用对了,省下的时间够喝两杯咖啡。
ICMP隧道也常见。ping包的data字段里塞了东西,tshark -r icmp.pcap -Y "icmp.type == 8" -T fields -e data,导出的十六进制转字符串,有时候是明文,有时候是base64。还有更绝的,把flag编码成二进制,每个包只传一个bit——这种就得写脚本按顺序拼接了。我习惯先capinfos看包总数,如果正好是8的倍数,那八成是bit流。
说到脚本,别排斥写代码。Wireshark的图形界面适合快速浏览,但批量提取数据还得靠tshark加awk、sort、uniq。比如找频率异常的IP,tshark -r file.pcap -T fields -e ip.src | sort | uniq -c | sort -nr | head,排第一的往往就是攻击者。再比如找长度异常的包,tshark -r file.pcap -T fields -e frame.len | sort -n | uniq -c,突然冒出一个只出现一次的长度,点进去看就对了。
最后提个醒:别忽略时间戳。有些题把flag藏在包的时间间隔里,比如莫尔斯码——短间隔是点,长间隔是划。用tshark -r file.pcap -T fields -e frame.time_relative导出时间差,再写个阈值判断,转成摩斯密码表一查,flag就出来了。这种题恶心在,你盯着payload看半天,结果信息在metadata里。
流量分析没有万能公式。每次拿到新题,先strings一下pcap文件本身,有时候flag直接明文躺在里面——出题人偷懒,你也别客气。然后看协议分布,tshark -r file.pcap -q -z io,phs,哪个协议占比异常就重点查哪个。剩下的,就是耐心和直觉了。多打几场比赛,你会发现,那些看似复杂的流量,拆开来看,不过是出题人跟你玩的一场捉迷藏。
(责任编辑:探索)













