ARTICLE DETAIL

资讯详情

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

CTF Misc 工具链全指南:隐写、流量、取证与压缩包实战

CTF Misc 工具链全指南:隐写、流量、取证与压缩包实战 简介这是一份面向CTF竞赛MISC方向选手与网络安全初学者的工具合集针对杂项题型知识点零散、工具链繁杂、临场找不到趁手脚本的痛点把常用离线工具与在线工具入口做了集中整理适合入门打基础也适合老手作为赛前速查手册。压缩包为zip格式整体约354.42MB文件数量与类型明细上游未提供从体量看应包含隐写分析、图片与音频取证、流量包解析、编码转换、压缩包处理等多类工具覆盖MISC常见解题环节。目前已有3131人学习下载说明该合集在实战中具备一定参考价值。拿到后可直接按题型定位所需工具省去逐个搜索下载与配置环境的时间配合在线工具入口还能应对部分特殊场景描述中提到若觉得工具有缺漏可联系作者补充便于后续按需扩展自己的工具箱。1. ctf之misc所需要工具从签到题到隐写流量一套能打完整场比赛的装备清单打 CTF 的 misc 方向最让人难受的不是不会而是赛场上临时找不到趁手的工具。签到题给你一张 PNG你右键属性看不出东西别人zsteg一把梭就出了 flag流量分析题给你一个 pcap你 Wireshark 翻到手酸别人tshark加两行过滤就定位到 USB 键盘码。misc 这个方向的特点是杂隐写、取证、编码、流量、压缩包、内存镜像、磁盘镜像每一类都有自己的一套工具链。它不像 Web 有 Burp 一条龙也不像 Pwn 有 pwntools 打天下misc 的工具是散装的需要你自己攒一套。这篇笔记就是把我自己打比赛和带新人时反复用到的那套 misc 工具清单拆开讲清楚每类题该上什么工具、参数怎么设、装的时候踩过哪些坑、哪些工具是必须常驻的。适合刚入门 ctf 的新手照着装一遍也适合打了几年但工具链一直没整理利索的老手对照查漏。2. 隐写与图片取证先看文件头再谈工具图片隐写是 misc 里出现频率最高的题型没有之一。很多人一上来就binwalk其实顺序错了。正确的流程是先确认文件真实类型再看有没有附加数据最后才上针对性工具。这一章把图片和文件类隐写的工具链按流程拆开。2.1 文件类型识别file 和 binwalk 的正确打开方式拿到任何 misc 附件第一步永远是看它到底是什么。改扩展名是最基础的障眼法file命令能直接告诉你真实类型。# 看文件真实类型不要信扩展名 file suspicious.png # 看文件头十六进制确认魔数 xxd suspicious.png | head -5 # 扫描文件内嵌的其他文件压缩包、图片、ELF 等 binwalk suspicious.png # 提取 binwalk 扫出来的内容 binwalk -e suspicious.png # 强制提取处理一些 binwalk 识别不全的情况 binwalk -e --dd.* suspicious.pngfile读的是文件头魔数比扩展名可靠得多。xxd | head是让你肉眼确认魔数比如 PNG 是89 50 4E 47JPG 是FF D8 FFZIP 是50 4B 03 04。binwalk做的是签名扫描把文件里所有符合已知格式签名的偏移都列出来。-e是自动提取--dd.*是在自动提取失败时的兜底强制按所有签名提取。这里有个坑binwalk -e提取出来的东西会放在_文件名.extracted目录里如果原文件名带特殊字符可能出问题建议先重命名成简单名字再跑。2.2 图片隐写三件套zsteg、steghide、stegsolve确认是图片之后按 PNG 和 JPG 分开处理。PNG 优先用 zstegJPG 优先用 steghide两者都搞不定再上 stegsolve 肉眼翻通道。# PNG 隐写首选自动跑多种 LSB 和位平面检测 zsteg suspicious.png # 只看特定通道比如 red 通道的 lsb zsteg -c red-lsb suspicious.png # 提取所有可疑数据 zsteg -a suspicious.png # JPG 隐写需要密码时先试空密码 steghide extract -sf suspicious.jpg steghide extract -sf suspicious.jpg -p # 查看 steghide 是否嵌入了数据 steghide info suspicious.jpgzsteg是 Ruby 写的装的时候gem install zsteg国内网络可能要多试几次。它的核心能力是遍历各种位平面组合把 LSB、MSB、通道交叉的情况都跑一遍输出里带meta或text标记的行就是可疑数据。steghide是 JPG 隐写的老牌工具-p 是空密码很多出题人偷懒不设密码。steghide info能先告诉你有没有嵌入文件避免瞎提取。stegsolve 是 Java 图形工具用来手动翻位平面和颜色通道。它的价值在于自动化工具跑不出来时人眼能发现规律。常见操作是切到Alpha通道看透明度异常或者用Frame Browser逐帧看 GIF。这个工具没有命令行就是java -jar stegsolve.jar打开然后一张张图拖进去翻。2.3 图片处理与修复当图片本身被破坏有些题会把图片的某些字节改掉让你先修复再隐写。这时候需要能直接操作二进制和像素的工具。# 用 PIL 读图片像素检查异常像素值 from PIL import Image img Image.open(suspicious.png) pixels img.load() w, h img.size # 扫描像素找 RGB 值异常的点比如某个通道全是 0 或 255 for y in range(h): for x in range(w): r, g, b pixels[x, y][:3] # 举例找红色通道异常高的像素 if r 250 and g 5 and b 5: print(f({x},{y}) - ({r},{g},{b}))这段代码的逻辑是遍历所有像素按条件筛出可疑点。参数上pixels[x, y]返回的是元组PNG 可能是 RGBA 四通道JPG 是 RGB 三通道用[:3]统一取前三。实际比赛中更常见的是用PIL配合numpy做矩阵运算速度比双重循环快几个数量级。如果图片被改了宽高导致打不开可以用pngcheck看 CRC 报错再用脚本爆破正确的宽高。# 检查 PNG 结构完整性会报 CRC 错误 pngcheck -v suspicious.png # 用 tweakpng 或手动改 IHDR 里的宽高 # IHDR 结构宽(4字节) 高(4字节) 位深(1) 颜色类型(1) ...宽高爆破是 misc 经典题。PNG 的 IHDR 块里宽高各占 4 字节改完之后 CRC 会不对但很多查看器不校验 CRC 照样能显示。脚本思路是遍历可能的宽高组合重新计算 CRC 并写入然后尝试打开看是否正常。3. 流量分析与取证tshark 过滤比 Wireshark 点鼠标快十倍流量题在 misc 里占比越来越高尤其是 USB 流量和 HTTP 流量。Wireshark 图形界面适合看但批量处理和精确过滤还是得靠 tshark。这一章讲流量分析的工具链和常见题型套路。3.1 tshark 常用过滤命令从几百兆 pcap 里捞出关键包tshark 是 Wireshark 的命令行版过滤语法和 Wireshark 一致但能写进脚本批量跑。# 列出所有协议层级快速了解 pcap 里有什么 tshark -r capture.pcap -q -z io,phs # 过滤 HTTP 请求只看 GET 和 POST tshark -r capture.pcap -Y http.request -T fields -e http.request.method -e http.request.uri # 提取所有 HTTP 流的内容 tshark -r capture.pcap -Y http -T fields -e http.file_data # 过滤 USB 流量看设备地址 tshark -r usb.pcap -Y usb -T fields -e usb.device_address -e usb.endpoint_address # 导出特定流的所有数据 tshark -r capture.pcap -q -z follow,tcp,ascii,0-z io,phs是协议分层统计一眼看出这个包里有 HTTP、USB 还是别的。-Y是显示过滤器语法和 Wireshark 一样。-T fields -e是提取指定字段适合做二次处理。-z follow,tcp,ascii,0是跟踪第 0 号 TCP 流把内容按 ASCII 打出来。这里的关键参数是流编号先用-z conv,tcp看有哪些流再决定跟踪哪个。USB 流量题是近年热点。键盘流量看usb.capdata鼠标流量看usb.capdata里的坐标变化。键盘流量需要把 HID 码转成字符网上有现成脚本但建议自己写一遍理解原理。# USB 键盘流量解析把 HID 码转成字符 # 标准 HID 键盘码表部分 hid_map { 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, 0x2c: , 0x2d: -, 0x2e: , } # 从 tshark 导出的 capdata 逐行解析 with open(usb_capdata.txt) as f: for line in f: data line.strip().split(:) if len(data) 3: # 第三个字节是按键码 key int(data[2], 16) if key in hid_map: print(hid_map[key], end)这段代码的核心是 HID 码表映射。usb.capdata通常有 8 个字节第一个字节是修饰键Shift、Ctrl 等第三个字节是按键码。实际解析时要处理 Shift 组合比如 Shift1 是!。参数上data[2]取的是第三个字节不同系统抓的包可能字节位置有偏移需要先看几个包确认。3.2 内存取证与磁盘取证volatility 和 autopsy内存镜像题一般给一个.raw或.mem文件用 volatility 分析。磁盘镜像题给.dd或.E01用 autopsy 或sleuthkit。# volatility3 查看内存镜像基本信息 vol -f memory.raw windows.info # 列出进程 vol -f memory.raw windows.pslist # 扫描文件 vol -f memory.raw windows.filescan # 导出文件 vol -f memory.raw windows.dumpfiles --virtaddr 0x12345678 # 查看剪贴板 vol -f memory.raw windows.clipboardvolatility3 的语法是vol -f 镜像 插件插件名按系统分windows.、linux.、mac.前缀。windows.info先确认系统版本windows.pslist看进程windows.filescan扫文件对象。导出文件需要虚拟地址从filescan输出里拿。常见坑是 volatility2 和 volatility3 语法不兼容网上很多老教程是 v2 的命令前缀是volatility --profile...别搞混。磁盘取证用 autopsy 图形界面或者sleuthkit命令行。fls列文件icat提取文件mmls看分区表。这些工具在 Kali 里默认都有装的时候注意sleuthkit和autopsy的版本匹配。4. 编码与密码CyberChef 是瑞士军刀但别只会点 Magic编码题是 misc 的送分题也是翻车重灾区。Base64、Base32、十六进制、URL 编码、Unicode 转义这些单独出现都好办叠在一起就容易懵。这一章讲编码工具和常见密码题的解法。4.1 CyberChef 的 Magic 功能与手动配方CyberChef 是浏览器里的编码转换工具开源可以本地部署。它的Magic功能会自动尝试多种解码组合但有时候会过度解码把正常数据也解了。# 本地部署 CyberChefDocker 方式 docker run -d -p 8080:80 mpepping/cyberchef # 或者直接下载静态文件 # 从 GitHub 仓库下载 CyberChef_vX.X.X.zip解压后打开 index.html用 CyberChef 的正确姿势是先手动试最可能的编码不行再上 Magic。比如看到ZmxhZ3开头直接 Base64 解码看到%7B直接 URL 解码看到\u0066直接 Unicode 解码。Magic 适合完全看不出规律的情况但它会把数据反复解码直到没有可识别编码容易把 flag 解没。建议 Magic 跑完后看Output里有没有flag{字样有就停。4.2 常见编码识别与 Python 批量解码有些题会给一串混合编码需要写脚本批量尝试。import base64 import binascii import urllib.parse def try_decode(s): 尝试多种编码解码返回所有可能结果 results [] # Base64 try: results.append((base64, base64.b64decode(s).decode(utf-8, ignore))) except: pass # Base32 try: results.append((base32, base64.b32decode(s).decode(utf-8, ignore))) except: pass # Hex try: results.append((hex, binascii.unhexlify(s).decode(utf-8, ignore))) except: pass # URL try: results.append((url, urllib.parse.unquote(s))) except: pass return results # 对可疑字符串逐层解码 data 5L2g5aW9 for name, result in try_decode(data): print(f[{name}] {result})这段代码的逻辑是暴力尝试常见编码每个都 try 一遍。参数上decode(utf-8, ignore)里的ignore是防止解码出二进制导致报错。实际比赛中编码往往是嵌套的比如 Base64 解出来是 HexHex 解出来是 URL 编码。写个循环反复调用try_decode直到结果里出现flag或不再变化。密码题常见的有凯撒、维吉尼亚、栅栏、RSA 基础。凯撒用caesar工具或脚本爆破 26 个偏移。维吉尼亚需要密钥没密钥时用vigenere爆破或频率分析。栅栏密码用rail fence脚本按栏数遍历。RSA 基础题用RsaCtfTool自动跑常见攻击。# 安装 RsaCtfTool git clone https://github.com/RsaCtfTool/RsaCtfTool.git cd RsaCtfTool pip install -r requirements.txt # 用法给公钥和密文自动尝试多种攻击 python3 RsaCtfTool.py --publickey pub.key --uncipherfile cipher.txt # 或者给 n e c 直接算 python3 RsaCtfTool.py -n 123456789 -e 65537 --uncipher 987654321RsaCtfTool 集成了几十种 RSA 攻击方式包括小公钥指数、共模、因数分解等。参数上--publickey给公钥文件--uncipherfile给密文文件-n -e --uncipher是直接给数值。常见坑是 Python 版本和依赖库版本建议用虚拟环境装。5. 压缩包与文件结构从伪加密到 CRC 爆破压缩包题在 misc 里属于中等难度考的是对 ZIP、RAR 格式的理解。伪加密、CRC 爆破、明文攻击、密码爆破这四类基本覆盖了所有压缩包题。5.1 ZIP 伪加密与密码爆破ZIP 伪加密是改压缩包的加密标志位让解压软件以为有密码实际数据没加密。# 查看 ZIP 结构 zipinfo suspicious.zip # 用 010 Editor 或脚本改加密标志位 # ZIP 本地文件头偏移 6 字节是通用目的位标记 # 全局方式位标记在中央目录偏移 8 字节 # 把加密位从 1 改成 0 # 用 Python 批量修复伪加密 import struct with open(suspicious.zip, rb) as f: data bytearray(f.read()) # 遍历本地文件头签名 PK\x03\x04 pos 0 while True: pos data.find(bPK\x03\x04, pos) if pos -1: break # 通用目的位标记在签名后 6 字节 flag struct.unpack(H, data[pos6:pos8])[0] if flag 0x1: # 清除加密位 flag ~0x1 data[pos6:pos8] struct.pack(H, flag) pos 4 with open(fixed.zip, wb) as f: f.write(data)这段代码的逻辑是找到所有本地文件头把通用目的位标记的加密位清零。参数上PK\x03\x04是本地文件头签名pos6是通用目的位标记的偏移。注意中央目录里也有加密标志有些题只改一处需要两处都改。更省事的办法是用zip -FF修复或者用010 Editor的 ZIP 模板直接改。密码爆破用fcrackzip或john。# fcrackzip 字典爆破 fcrackzip -u -D -p rockyou.txt suspicious.zip # john 爆破 ZIP zip2john suspicious.zip zip.hash john --wordlistrockyou.txt zip.hashfcrackzip的-u是只显示正确密码-D是字典模式-p指定字典。john需要先用zip2john转成 john 认识的格式。字典用rockyou.txtKali 自带没的话网上能下到。5.2 CRC 爆破与明文攻击CRC 爆破适用于 ZIP 里文件很小比如几个字节且知道文件内容格式的情况。原理是 ZIP 里每个文件都有 CRC32 校验值如果文件内容短可以暴力枚举所有可能内容算 CRC 匹配。import binascii import zipfile import string # 读取 ZIP 里文件的 CRC zf zipfile.ZipFile(suspicious.zip) for info in zf.infolist(): print(f文件名: {info.filename}, CRC: {info.CRC:08x}, 大小: {info.file_size}) # 假设文件内容是 3 个小写字母爆破 CRC target_crc 0x12345678 # 替换成实际 CRC chars string.ascii_lowercase for a in chars: for b in chars: for c in chars: content (a b c).encode() if binascii.crc32(content) 0xffffffff target_crc: print(f找到: {content})这段代码的逻辑是三层循环枚举所有 3 字母组合算 CRC32 比对。参数上binascii.crc32返回的是有符号整数 0xffffffff转成无符号。实际比赛中文件内容可能是数字、大小写混合需要调整字符集。如果文件稍大可以用z3求解器或者多进程加速。明文攻击适用于 ZIP 里有一个已知文件的情况。原理是 ZIP 的加密算法有已知明文攻击漏洞知道一个文件的内容就能解出密钥。# 用 pkcrack 做明文攻击 # 需要已知文件的明文和加密后的 ZIP pkcrack -C encrypted.zip -c known_file.txt -P plain.zip -p known_file.txt -d decrypted.zippkcrack的参数-C是加密的 ZIP-c是加密 ZIP 里的已知文件名-P是包含明文的 ZIP-p是明文文件名-d是输出。这个工具对 ZIP 版本有要求必须是传统加密ZipCryptoAES 加密的 ZIP 不行。6. misc 工具链避坑那些让我通宵重装的坑这一章记录几个我在装工具和用工具时踩过的坑每个都是血泪经验。6.1 Python 版本冲突导致工具装不上现象pip install zsteg报错或者volatility3跑起来提示模块找不到。原因misc 工具很多是 Python 2 时代写的现在系统默认 Python 3直接pip install会装到错误版本。另外有些工具依赖特定版本的库比如pycryptodome和crypto冲突。解决每个工具用独立虚拟环境。python3 -m venv venv_zsteg source venv_zsteg/bin/activate pip install zsteg。volatility3 建议用pipx install volatility3隔离得更干净。遇到crypto和pycryptodome冲突先pip uninstall crypto pycryptodome再只装pycryptodome。6.2 binwalk 提取不出东西现象binwalk -e跑完_extracted目录是空的或者只提取出一堆碎片。原因binwalk 的自动提取依赖unsquashfs、jefferson等外部工具这些没装的话提取会静默失败。另外有些文件用了非标准签名binwalk 识别不到。解决先binwalk --dd.*强制按所有偏移提取再用file逐个看提取出来的文件。装全依赖sudo apt install squashfs-tools mtd-utils。如果是自定义格式用xxd手动找文件头再用dd按偏移切。6.3 tshark 过滤 USB 流量时字段为空现象tshark -r usb.pcap -Y usb -T fields -e usb.capdata输出全是空行。原因USB 流量的capdata字段只在特定传输类型里有比如中断传输。如果抓包时没抓全或者过滤条件不对字段就是空的。另外不同版本的 tshark 字段名可能不一样。解决先用tshark -r usb.pcap -Y usb -T fields -e usb.transfer_type -e usb.endpoint_address看传输类型。中断传输的transfer_type是0x01。确认有数据后再用-e usb.capdata提取。如果字段名不对用tshark -r usb.pcap -Y usb -T fields不加-e看所有可用字段。6.4 steghide 提取报 “could not extract any data”现象steghide extract -sf image.jpg提示没有嵌入数据但题目明确说图片有隐写。原因steghide 只支持 JPG、BMP、WAV、AU 格式PNG 不支持。另外密码可能不是空或者图片被二次压缩过导致数据损坏。解决先steghide info image.jpg确认有没有嵌入文件。如果是 PNG换zsteg或stegsolve。如果提示需要密码试常见弱密码123456、password、admin。如果图片被压缩过steghide 的数据可能已经损坏需要找原图。6.5 volatility 插件跑不动或报错现象vol -f memory.raw windows.pslist报错Unable to validate the plugin requirements。原因volatility3 需要先确定内存镜像的系统版本如果windows.info跑不出来后续插件都会失败。另外有些镜像需要指定--profilevolatility2或安装符号表volatility3。解决volatility3 先跑vol -f memory.raw windows.info看能不能识别系统。如果报错试vol -f memory.raw banners看镜像类型。volatility2 需要--profileWin7SP1x64这样的参数用volatility imageinfo先探测。符号表问题在 volatility3 里一般自动下载网络不通的话手动下symbols包放到对应目录。7. 把工具串成流水线一个 misc 题的完整解题脚本单独会用工具是一回事赛场上时间紧能把工具串成流水线是另一回事。这一章给一个从附件到 flag 的自动化脚本框架把前面讲的工具按流程串起来。#!/usr/bin/env python3 misc 题自动分析流水线 用法python misc_pipeline.py 附件路径 import subprocess import sys import os def run(cmd): 执行命令并返回输出 try: result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, timeout30) return result.stdout result.stderr except subprocess.TimeoutExpired: return [超时] def analyze_file(path): 第一步识别文件真实类型 print( * 50) print([1] 文件类型识别) print(run(ffile {path})) print(run(fxxd {path} | head -3)) def scan_embedded(path): 第二步扫描内嵌文件 print( * 50) print([2] binwalk 扫描) print(run(fbinwalk {path})) def try_stego(path): 第三步根据类型尝试隐写工具 print( * 50) print([3] 隐写检测) ext path.lower().split(.)[-1] if ext png: print([zsteg]) print(run(fzsteg {path})) elif ext in (jpg, jpeg): print([steghide]) print(run(fsteghide info {path})) elif ext in (zip, rar, 7z): print([压缩包信息]) print(run(fzipinfo {path})) def check_strings(path): 第四步提取可打印字符串找 flag print( * 50) print([4] strings 搜索) output run(fstrings {path} | grep -iE flag|ctf|key) print(output if output.strip() else 未找到明显 flag 字符串) if __name__ __main__: if len(sys.argv) 2: print(用法: python misc_pipeline.py 附件路径) sys.exit(1) target sys.argv[1] if not os.path.exists(target): print(f文件不存在: {target}) sys.exit(1) analyze_file(target) scan_embedded(target) try_stego(target) check_strings(target) print( * 50) print([完成] 根据以上输出决定下一步深入方向)这个脚本的逻辑是四步走先file和xxd确认类型再binwalk扫内嵌然后按扩展名调对应的隐写工具最后strings搜 flag。参数上timeout30是防止某个命令卡死实际用的时候可以调大。grep -iE flag|ctf|key是搜常见关键词可以按题目特点加词。这个框架的价值在于把重复劳动自动化赛场上拿到附件先跑一遍输出里往往就有线索。但要注意它不能替代人工判断。比如zsteg输出几百行需要你自己看哪行可疑binwalk扫出一堆偏移需要你决定提取哪个。工具是辅助思路才是核心。我自己的习惯是每打一场比赛就把新遇到的工具和命令补进这个脚本慢慢就攒成了一套顺手的装备。misc 这个方向没有银弹工具会一直变题型也会一直变但“先识别、再扫描、后深入”的流程是不变的。希望帮到你。本文还有配套的精品资源点击获取
返回列表