ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Writeup 4 CTFHub 流量分析 · 协议流量分析 · ICMP 三题

Writeup 4 CTFHub 流量分析 · 协议流量分析 · ICMP 三题 CTFHub 流量分析 · 协议流量分析 · ICMP 三题 Writeup题目Data、Length、LengthBinary类别流量分析 / 协议流量分析 / ICMP工具tshark、awk、perl、xxd、cut、tr、fold0. 前置知识ICMP 协议简介ICMPInternet Control Message Protocol是网络层协议最常见的用途是ping。一个 ping 包的结构[以太网头 14B][IP 头 20B][ICMP 头 8B][ICMP Data ...]ICMP echo 报文有两个方向类型名称说明type 8Echo Requestping 请求type 0Echo Replyping 回复关键点request 和 reply 的data 字段内容完全相同。分析时只取一种通常icmp.type 8避免数据重复。ICMP 的data 内容、包长度、时间间隔、序列号等都可以作为隐蔽信道。通用命令骨架tshark-r文件.pcap-Y过滤表达式-Tfields-e字段名参数含义-r读取 pcap 文件-Y显示过滤器-T fields输出指定字段-e指定字段名为什么只取 requestping 一次产生 request replydata 相同。若不过滤每个字符会出现两次ccttffhhuubb{{...只取icmp.type 8后ctfhub{...1. Data题目信息题目Data提示ping 也可以携带数据?附件icmp_data.pcap解题思路提示“ping 也可以携带数据”说明 flag 藏在 ICMP 的Data 字段内容里。每个 ping 包的 data 结构[8 字节时间戳][1 字节 flag 字符][0x4d 4d 4d ... 填充]后面全是4dASCII 的M做填充。所以只要提取每个包的第 9 字节按顺序拼接即可。提取步骤Step 1提取每个 ICMP request 包的 data 字段tshark-ricmp_data.pcap-Yicmp.type 8-Tfields-edata输出形如46451218edacd741634d4d4d4d... 338b5318edacd741744d4d4d4d... ...Step 2去掉冒号部分版本输出带:|tr-d:Step 3取每行第 17~18 个字符即第 9 字节每字节占 2 个字符第 9 字节 第 17~18 字符。|cut-c17-18得到63 74 66 68 ...Step 4hex 转字符|xxd-r-p得到ctfhub{...}完整命令tshark-ricmp_data.pcap-Yicmp.type 8-Tfields-edata\|tr-d:\|cut-c17-18\|xxd-r-p;echo验证前几个字节包序第 9 字节ASCII163c274t366f468h575u662b77b{确认是ctfhub{。最终 flagctfhub{c87eb99796406ac0b}小插曲如果用-Y icmp不过滤 request会得到每个字符重复两次ccttffhhuubb{{cc8877eebb9999779966440066aacc00bb}}去重后同样是正确 flag。但更规范的做法是直接过滤icmp.type 8。2. Length题目信息题目Length提示ping 包的大小有些奇怪附件icmp_len.pcap解题思路提示“包的大小有些奇怪”说明 flag 藏在 ICMP 的包长度里。出题人把 flag 字符的ASCII 码 42作为 ICMP 包的总长度frame.len 14(以太网头) 20(IP头) 8(ICMP头) data_len 42 data_len所以data_len frame.len - 42 字符的 ASCII 码提取步骤Step 1提取每个 ICMP request 包的长度tshark-ricmp_len.pcap-Yicmp.type 8-Tfields-eframe.len输出141 158 144 146 159 140 165 139 141 140 96 95 99 144 90 92 93 167Step 2减 42 转 ASCII|awk{printf %c, $1-42}验证frame.len-42ASCII14199c158116t144102f146104h159117u14098b165123{确认是ctfhub{。完整命令tshark-ricmp_len.pcap-Yicmp.type 8-Tfields-eframe.len\|awk{printf %c, $1-42};echo替代命令如果 tshark 版本支持data.len字段可以直接tshark-ricmp_len.pcap-Yicmp.type 8-Tfields-edata.len\|awk{printf %c, $1};echo最终 flagctfhub{acb659f023}3. LengthBinary题目信息题目LengthBinary提示ping 包的大小有些奇怪附件icmp_len_binary.pcap解题思路和 Length 类似但这次包长度不是直接编码 ASCII而是二值化74→ 二进制0106→ 二进制1每 8 位一组转 ASCII 字符。提取步骤Step 1提取每个 ICMP request 包的长度tshark-ricmp_len_binary.pcap-Yicmp.type 8-Tfields-eframe.len输出只有两个值74 106 106 74 74 74 106 106 ...Step 2二值化|awk{printf ($1106)?1:0}得到连续二进制串01100011011101000110011001101000011101010110001001111011...Step 3每 8 位一组|fold-w8得到01100011 01110100 01100110 01101000 01110101 01100010 01111011 ...Step 4二进制转字符|perl-lneprint chr(oct(0b$_))验证二进制十进制ASCII0110001199c01110100116t01100110102f01101000104h01110101117u0110001098b01111011123{确认是ctfhub{。Step 5去掉换行拼成一行|tr-d\n;echo完整命令tshark-ricmp_len_binary.pcap-Yicmp.type 8-Tfields-eframe.len\|awk{printf ($1106)?1:0}\|fold-w8\|perl-lneprint chr(oct(0b$_))\|tr-d\n;echo替代命令while read 版tshark-ricmp_len_binary.pcap-Yicmp.type 8-Tfields-eframe.len\|awk{printf ($1106)?1:0}\|fold-w8\|whilereadb||[-n$b];doprintf\\x$(printf%02x$((2#$b)))done;echo注意不加|| [ -n $b ]时最后一行若没有换行符read会失败导致最后一个字符}丢失输出变成ctfhub{04efed1e05加上后正常输出ctfhub{04efed1e05}最终 flagctfhub{04efed1e05}4. 三题总结题目隐蔽信道核心思路关键命令DataICMP data 内容取每包 data 第 9 字节tr -d : | cut -c17-18 | xxd -r -pLengthICMP 包长度frame.len - 42转 ASCIIawk {printf %c, $1-42}LengthBinaryICMP 包长度二值化740 / 10618 位一组转字符awk {printf ($1106)?1:0} | fold -w8 | perl -lne print chr(oct(0b$_))命令流水线对比Data: tshark → tr → cut → xxd → 字符 Length: tshark → awk(%c) → 字符 LengthBinary: tshark → awk(二值化) → fold(8位) → perl(二进制转字符) → tr(去换行) → 字符经验总结ICMP 不只是 pingdata 内容、包长度、时间间隔、序列号都可能是隐蔽信道。先过滤 requesticmp.type 8避免 request/reply 重复。观察数据规律长度只有两个值 → 二进制编码长度连续变化 → 可能是 ASCII 偏移data 里有可疑字节 → 直接提取管道组合每个命令只做一件事组合起来完成复杂提取。注意最后一行while read对无换行的最后一行可能漏处理用perl或加|| [ -n $b ]更稳。5. 附常用命令速查tshark# 过滤 ICMP 请求tshark-rx.pcap-Yicmp.type 8# 输出字段tshark-rx.pcap-Yicmp.type 8-Tfields-eframe.len-edata# 跟踪 TCP 流tshark-rx.pcap-q-zfollow,tcp,ascii,0# 搜索字符串tshark-rx.pcap-Ytcp contains\flag\awkawk{printf %c, $1}# 数值转字符awk{printf %c, $1-42}# 减偏移转字符awk{printf ($1106)?1:0}# 二值化awk{print $1, $2}# 打印多列awkNR1 {print}# 只打印第 1 行perlperl-lneprint chr(oct(0b$_))# 二进制转字符perl-lneprint chr(hex($_))# hex 转字符perl-neprint if /flag/# 过滤含 flag 的行其他tr-d:# 删除冒号tr-d\n# 删除换行cut-c17-18# 取第 17-18 字符fold-w8# 每 8 字符折行xxd-r-p# hex 转二进制/字符这三道 ICMP 题是一组很经典的协议流量分析练习把“隐蔽信道”的思路展现得很清楚Data— 藏在内容里Length— 藏在长度里LengthBinary— 藏在长度的二进制编码里以后再遇到流量分析题可以养成几个习惯先看协议— ICMP / TCP / UDP / HTTP / DNS / MySQL / Redis…再找异常— 长度、时间间隔、内容、序列号、字段值善用管道— tshark 取数 → awk/tr/cut 处理 → perl/xxd 转换注意细节— request/reply 重复、最后一行无换行、字段名版本差异希望这份 Writeup 对你有帮助如果后面遇到 ICMP 相关的其他变种题比如时间间隔编码、序列号编码可以继续按这个思路分析。Rambo2026年9月27日
返回列表