
周末刷题时碰到 red_vs_blue 这个 Misc 题第一眼看到名字就知道是红蓝对抗的套路给你一个抓好的流量包让你扮演蓝队从一堆噪声里把红队的一举一动翻出来最后拼出 flag。这种题在杂项里算高频题型我前前后后解过几道类似的题目这次就把完整思路和背后的判断逻辑写出来希望对刚接触流量分析的新手有帮助也欢迎老手一起交流。这类题考的不是某个框架的漏洞利用而是在一个模拟攻防场景里你能不能把隐藏在协议细节中的信息还原出来。1. 先搞清楚 red_vs_blue 到底在考你什么1.1 红蓝对抗在 CTF 里的表现形式红蓝对抗在安全行业里是一套很成熟的方法论。红队模拟攻击者负责渗透、利用、横向移动蓝队则站在防守侧负责监控、分析、溯源。到了 CTF 赛场上这种对抗往往被压缩成一两个附件最常见的就是一个 pcap 流量包或者一个内存镜像再或者一整份系统日志。red_vs_blue 这个名字已经直接把对抗双方写在了题目表面它基本可以确定是流量分析方向。因为对杂项题来说纯日志文件太单薄内存镜像对出题和做题的成本都比较高流量包是最平衡的选择体积可控、信息层次丰富、可以从多个协议维度埋线索。我当时拿到题目后的第一反应就是红队是怎么进来的、做了什么、留下了什么。这三个问题其实就是蓝队日常应急响应的核心流程。出题人为了让题目不落俗套通常会在里面塞两到三条链路一条是常规的 Web 渗透痕迹另一条是隐蔽信道传输数据。后者往往才是 flag 真正藏身的地方。1.2 这类题目的通用套路我复盘了近几年常见的挑战题发现 Misc 场景下的红蓝对抗几乎都遵循同一套模板红队先对目标做信息收集也就是扫描和指纹识别这段流量通常表现为大量 SYN 包、HTTP HEAD 请求、404 响应。然后是漏洞利用或弱口令尝试HTTP 层会出现 POST 请求、异常 User-Agent、参数中包含命令拼接的痕迹。再后面是权限维持最常见的就是上传一个文件或者通过 DNS、ICMP 这类不容易被防火墙拦截的协议建立隐蔽通道。最后蓝队抓包把所有行为记录成了 pcapflag 就藏在某一层通信载荷里。明白了这个流程你就知道该往哪些协议上重点看。如果一开始像无头苍蝇一样从第一个包翻到最后一个包别说 flag光是想搞清楚谁和谁在通信就得花掉不少时间。这个题目本身并不算难难的是你有没有建立一套先总览、再聚焦的分析习惯。2. 开局准备工具选型和环境搭建2.1 工具清单与各自定位做流量分析前先把手里的工具理清楚。我平时用的是一套开源组合基本覆盖了从快速体检到深度提取的所有场景工具用途使用场景Wireshark图形化抓包分析交互式翻包、看协议细节、过滤会话tshark命令行流量分析批量提取字段、脚本化处理、超大流量包capinfos流量包信息统计快速查看包数量、时长、文件大小NetworkMiner自动文件提取从流量中还原 HTTP 文件、传输文件strings / binwalk文件内容与附加数据探测分析还原出来的文件对象CyberChef编码解码与转换处理 Base64、URL 编码、十六进制、压缩数据不要觉得 Wireshark 有图形界面就万事大吉。真实比赛里流量包经常有几十万甚至上百万个数据包图形界面一打开就卡这时候 tshark 的命令行提取能力才是主力工具。我建议新手至少在 Wireshark 里看懂基础过滤再学几个常用 tshark 命令后面你会感谢自己在工具上多花的这点时间。2.2 拿到流量包后的 5 分钟快速体检打开流量包之前先用 capinfos 看一眼基本信息capinfos red_vs_blue.pcapng它会输出包总数、时长、平均包速率、IPv4 地址数量、端口统计等。这一步能帮你快速建立对题目规模的认识。如果是个几十万包的流量后面要大胆用过滤器缩小范围如果只有几千包那所有数据都可能有用细节会更重要。接下来用 Wireshark 打开不要急着翻包先看两处菜单Statistics - Protocol Hierarchy 和 Statistics - Conversations。Protocol Hierarchy 告诉你流量在哪些协议上分布比如 UDP 占了多大比例、HTTP 占了多少。看到异常偏高的协议基本就是题目在向你招手。Conversations 则列出通信双方和各自的字节数帮助你定位一对主通信方。我记得那次一打开 Protocol Hierarchy就发现 UDP 的占比不正常再看细分大量 UDP 都落在 53 端口上。53 是 DNS正常业务环境里 DNS 请求虽然多但不会多到让 UDP 占比过半。这个信号直接在提醒我红队可能用了 DNS 隧道。3. 从通信特征锁定红队的影子3.1 常见流量异常特征速查流量分析说穿了是找反常。你自己先要知道正常长什么样才能判断崩坏在哪里。我总结了一张平时做题会对照的异常特征表协议/现象正常状态异常信号DNS解析常见域名请求短小子域名为一长串随机字符、同一个根域反复查询、大量 NXDomainICMPping 包 payload 固定且短payload 长度异常、内容非普通回显数据、频率均匀到像脚本HTTP正常页面资源请求密集 404、路径里带 phpinfo、cmd、shell 等关键字、User-Agent 是扫描器TCP 连接连接数平缓短时间内大量目的 IP 相同、目的端口递增的 SYN 包时间戳人类操作间隔不均匀包与包之间间隔固定像定时任务在发包DNS 隧道在 CTF 里出现频率最高。原因是 DNS 几乎不会被防火墙拦截而且出题人写个脚本就能批量生成不需要太多基础设施。做这类题目时看到长串子域名心里就要有一个预期值这段子域名字符串很可能就是编码后的数据。3.2 从统计到会话的聚焦方法Protocol Hierarchy 给了方向后我用 tshark 快速拉出可疑域名的统计tshark -r red_vs_blue.pcapng -Y dns.qry.name -T fields -e dns.qry.name | sort | uniq -c | sort -nr这条命令把所有 DNS query 名字取出来按出现次数排序。正常解析的域名会分散在几十上百个不同域名上而隧道域名会集中在某几个固定根域下并且子域部分几乎每次都不重复。还可以用过滤器进一步确认dns.qry.name contains example这里的 example 是根域的关键字你按实际情况替换。过滤后如果发现有几百条子域名都是以同一根域结尾的查询那就不用犹豫了直接进入提取环节。HTTP 流量也一样。可以用 http.request.full_uri 字段查看所有请求的完整 URI按状态码筛选。如果看到大量 404说明红队在跑目录枚举如果在枚举之外又发现了一个上传成功的 200 响应那个响应对应的文件往往是后续隐蔽通道的跳板。我在这里给新手一个建议不要急着把所有可疑内容都背下来先把主通信链路摸清楚。比如攻击者 IP 是 198.51.100.10目标服务器是 192.0.2.80那后续所有过滤都可以带上 ip.addr192.0.2.80 和 ip.addr198.51.100.10把视野始终锁定在这对会话上大幅减少噪声。4. 解出数据的完整流程DNS 隧道、多层编码与文件还原4.1 DNS 隧道的识别与字段提取确认目标根域后我要把每一条查询的子域名部分完整提取出来。用 tshark 导出域名和时间戳tshark -r red_vs_blue.pcapng -Y dns.qry.name contains \example.com\ -T fields -e frame.time_epoch -e dns.qry.name注意这里会有坑DNS 查询包和响应包都会含有 dns.qry.name 字段如果不过滤只提取一次会得到两倍数据。所以我会显式加上 dns.flags.response 0只保留查询请求避免重复。提取到的域名字段可能长这样1685527200.123456 dummy1.example.com 1685527200.126789 dummy2.example.com 1685527201.456123 dummy3.example.com去掉.example.com后缀后剩下的部分看起来像 Base64。判断依据很简单字符串只包含 A-Z、a-z、0-9、、/、而且每隔一定字符长度就会有一个 结尾。Base64 是最常见的编码方式因为它能把二进制数据扁平化成 DNS 子域可以承载的文本字符。把子域名部分拼接后去掉分隔符写到一个 txt 文件然后解码base64 -d payload.txt payload.bin file payload.bin这次解码后仍然不是可读文本file 也没识别出具体文件格式。当时我第一反应是数据经过了二次处理这个等下再展开。但如果你运气好file 输出的是 PNG、JPEG 或 Zip那后面的路会清晰很多。4.2 从 Base64 到文件头判断CTF 题有个规律越是藏在后面的数据越喜欢套多层壳。Base64 解完如果是一堆乱码别慌先把数据保存下来再用十六进制看一眼开头xxd payload.bin | head -5常见文件头的特征要能背书ZIP 是50 4B 03 04PNG 是89 50 4E 47JPEG 是FF D8 FF E0ELF 是7F 45 4C 46当时我看到开头是一段不像文件的字符但中间有大量连续 0。这让人怀疑真实的文件数据被分段埋进了一个二进制容器里或者整体又做了一次异或、反转处理。异或这类编码比较烦人因为单靠肉眼看不出来需要先猜测密钥或者尝试常见单字节异或 0xFF、0x00、0x55 等。这时候 CyberChef 的 Magic 功能很有用它会把常见的编码、压缩、二进制识别自动跑一遍。但我建议把 Magic 当辅助而不是唯一工具。依赖 Magic 容易让你失去对数据本身的感知。正确做法是先手动试一遍 反转、URL 解码、二次 Base64如果都没效果再去用 Magic 兜底。4.3 从隐藏流量到图片隐写和隐藏输入在我实际复盘的这个场景里最终解出来的其实是一个 ZIP 压缩包。把它解压后获得了一个文本文件和一张小尺寸图片。文本文件打开后看起来有内容但 flag 不完整后半段全是空格和不可见字符。这里就要引入零宽字符的知识了。零宽空格、零宽非连接符、零宽连接符这类 Unicode 控制字符在视觉上看不见却能在文本里携带额外的二进制信息。常见的套路是两种零宽字符分别代表 0 和 1把它们按顺序提取出来转成 ASCII再解码成可见文本太典型的解法了。检查方法也很简单用十六进制编辑器打开文本文件看字与字之间是不是多了 E2 80 8B、E2 80 8C 之类的字节序列。发现之后提取出来按空格切分、映射、合并就能得到真正隐藏的 flag 片段。图片那边同样需要看一眼。先用 strings 扫一遍有没有作者或注释信息再 binwalk 看有没有附加文件然后才轮到 stegsolve 或 zsteg 去检查 LSB 隐写。很多时候图片并不复杂就是藏了个字符串或者一段提示没必要每次都上最重的隐写工具。我记得那个图片用 strings 什么都没发现但 binwalk 显示尾部多了一块数据把尾部切出来以后又是一张小图和一段 URL 编码过的文本。这种层层套娃的题目耐心比技术更能决定成败。5. 实战中常见的坑与排查思路5.1 流量包太大图形界面卡死不做过多处理直接开 Wireshark很卡很正常。百万级别的包光渲染就够电脑卡一阵。我的处理方式是把流量包先用 editcap 按会话或按 IP 切片比如只留一对主通信 IP 之间的包editcap -A 2021-07-01 10:00:00 -B 2021-07-01 10:30:00 red_vs_blue.pcapng sliced.pcapng或者用 tshark 直接导出过滤后的结果tshark -r red_vs_blue.pcapng -Y ip.addr192.0.2.80 ip.addr198.51.100.10 -w filtered.pcapng产出一个更小的文件再丢进 Wireshark体验会好很多。脚本化处理就是在这一步体现价值的。5.2 拿到数据但解到一半看不懂这种情况多半是编码层判断错了。比如我前面说到的 Base64 解码后乱码很多人一看到乱码就放弃其实乱码不一定真的乱。给几个排查思路把解码后的字节交给file命令判断识别出来格式就说明路走对了。看十六进制中是否出现PK、ffd8、8950这类文件头。出现就说明 Base64 只是第一层数据本身是一个文件剥离到正确边界就是完整文件。文本类乱码可以试常见字符集反转比如 UTF-16 的小端序字符会被普通文本工具显示成乱码但十六进制里能看到规律的 00 分隔。试试是不是数据里有冗余字符比如每 N 位多一个填充符。每次判断下一层编码都要记录你做了什么操作这样才不会在一个方向上反复绕圈。5.3 文件提取失败与图片隐写毫无头绪HTTP 对象导不出来或者导出文件损坏优先用 NetworkMiner 做交叉验证。Wireshark 的 Export Objects 依赖 HTTP 头里的 Content-Length如果传输用了分块编码或者连接在文件传输完成前就被断开导出的文件就会缺尾部。NetworkMiner 处理流重组的能力更强一些同样一个流量包它常常能在文件面世时给你惊喜。图片隐写找不到线索问题往往出在顺序上。不要上来就开 stegsolve先做基础排查。通常顺序是文件信息 - strings - binwalk - LSB。每步都要记录结果尤其要注意 binwalk 从第几个偏移开始发现附加数据因为那直接决定了你怎么把附加数据切出来。如果 binwalk 识别出的数据在图片中间可以用 dd 按偏移量切割dd ifimage.png ofhidden.bin skip1024 bs1 count2048这里的 skip 和 count 要根据 binwalk 输出调整。切出来的文件再 file 判断类型继续下一层。我在做题时还遇到过一个情况图片本身完全正常没有任何隐写flag 藏在文件名里。文件名带下划线分隔的单词连起来读就是一段提示。遇到这种情况只能说明要先检查周边信息再陷入技术操作。6. 复盘心得红蓝对抗 Misc 的做题节奏这类题做多了会发现解题过程完全可以流程化。首先是看协议分布用统计给流量分类其次是找异常通信定位可疑目标然后是聚焦到具体协议提取负载数据最后是解码和文件还原。四个环节里只要有一个做得太久就会卡住所以做题时我会给自己设置时间分片体检阶段不超过 10 分钟聚焦阶段不超过 20 分钟遇到层数多的解码一定做记录。我个人在使用中感受最深的其实是 tshark 发挥的作用。图形界面可以让你看清楚一个包但无法快速看清一万个包。掌握几个常用的字段提取命令在处理大规模数据时效率完全不同。这也是新手最容易忽略的点花在工具命令行上的十分钟会在真正实战里省下半小时。另外解这类题一定要有耐心。Misc 和 Web、PWN 不同后者有明确的漏洞入口前者更像是在一堆文件里做拼图。常见的情况是最后一步解出 flag 之前经历了三四次看似错误的尝试。只要方向合理每一步都在收窄范围就不要因为中途乱码而放弃。如果你也准备参加 CTF 或者做安全应急相关的练习建议自己动手把 DNS 隧道这类场景模拟一遍用脚本往指定域名发几段编码后的数据自己抓包、自己提取、自己解码。这个过程走一遍远比看十篇题解更管用。下次再遇到 red_vs_blue 这样的流量分析题你就能自然而然地知道下一步该做什么了。