免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

CTF工具包实战指南:哈希校验、伪加密与按题型配置

CTF工具包实战指南:哈希校验、伪加密与按题型配置 简介面向CTF参赛者与网络安全学习者的工具合集围绕攻防竞赛中高频出现的抓包分析、密码破解、逆向调试等场景设计适合从入门到进阶的选手备赛时补充常用工具链。压缩包共132个文件约84.72MB文件类型涵盖txt说明文档、exe与jar可执行工具、zip/rar/7z嵌套压缩包、png图示和py辅助脚本其中txt多用于记录解题思路与使用说明png便于对照抓包、解密等界面操作py可通过二次修改适配不同题目。已有2690人下载学习内容覆盖Wireshark流量分析、Burp Suite拦截改包、哈希碰撞破解、二进制逆向等核心题型所需工具也集成了进制转换、编码解码、后台目录扫描等提效小工具。各主题按独立压缩包分类存放既可直接调用也可拆分迁移至私有工具库。综合来看这套资源为理解网络协议、加密算法和攻击手段提供了从工具到实例的支撑能够帮助参赛者提高实战效率是一份结构清晰、实用性强的CTF配套资源。1. 拿到了CTF工具包.zip先弄清它要解决什么再决定怎么解开群里甩来一个“CTF工具包.zip”很多人的第一反应是解压、扔桌面、双击就跑然后比赛时发现工具全在就是什么都跑不起来。CTF工具包这件事难点从来不在下载而在校验、解压、按题型装配和踩坑——伪加密、乱码文件名、损坏的中央目录、缺Java环境每一步都能拦住新手。这篇文章顺着一个CTF杂项题的完整处理流程讲清楚拿到工具包之后该怎么验证、怎么配、怎么用。CTF工具包不是一个软件的集合它是一套需要自己维护的工作流适合刚入门想攒一套顺手本地装备的人也适合赛前负责给全队整理环境的选手。2. 校验与解压CTF工具包哈希、伪加密和乱码文件名的三个关口接到工具包先别急着双击解压压缩包本身就是CTF最常见的载体。工具包里如果被人动过手脚后面所有操作都会基于一个不干净的环境。先把完整性、加密状态、文件名编码三个问题处理掉再谈装配工具链。2.1 用哈希校验确认工具包没被改过拿到“CTF工具包.zip”第一件事不是解压是算哈希。常见做法是同时算SHA-256和MD5前者用来校验完整性后者用来和网上流传的校验值对比。如果压缩包是从比赛官方群或队友手里拷的对不上的时候要警惕是不是传输损坏或被人替换过。sha256sum CTF工具包.zip md5sum CTF工具包.zip命令本身很简单关键是看结果。两个命令分别输出一长串哈希值和文件名如果和发布方给的值不一致就不要继续解压重新找可靠来源。传输过程中USB拷贝、聊天软件压缩传输都可能让zip头损坏哈希校验能第一时间暴露问题。确认完整之后用unzip -l看一眼压缩包内部结构而不急着全部解出来unzip -l CTF工具包.zip | head -30-l是list模式只列目录不解压。输出里能看到每个文件的压缩前后大小、压缩方式和文件名。这一步有两个目的一是确认里面有没有README、依赖说明之类的文本二是看文件命名是不是有规律——很多工具包会把同一个工具的多个版本塞在一起列目录能帮你提前发现版本冲突。如果列出的文件名是一堆乱码那就要走2.3的处理办法。2.2 zip伪加密识别与解除伪加密是CTF题目里最有名的坑之一工具包里也可能混着这种包。原理不复杂zip格式在本地文件头和中央目录头里各有一个“通用位标记”general purpose bit flag第0位表示是否加密。真正加密的zip会把文件数据也做加密处理伪加密只是把标志位置1数据本身没动过假装自己加密了。识别伪加密最快的方法是zipinfozipinfo -v flag.zip | grep -A3 -i encryption如果输出里显示文件被标记为encrypted但用7-Zip去解压时又能直接看到内容或轻松解出基本就是伪加密。另一种更粗暴的判断法用binwalk扫一下如果zip里某个文件头后面的数据能看到明文、字符串、文件名说明数据没加密。解除伪加密的常见做法是写个小脚本把两个头里的加密位清零一劳永逸。基于Python的脚本逻辑如下import struct import sys def fix_fake_encryption(path): with open(path, rb) as f: data bytearray(f.read()) i 0 while i len(data) - 4: # 本地文件头签名 PK\x03\x04 if data[i:i4] bPK\x03\x04: # 通用位标记在本地文件头偏移 6 处2 字节 flag struct.unpack(H, data[i6:i8])[0] flag ~0x0001 # 清零第 0 位加密标志 data[i6:i8] struct.pack(H, flag) # 跳过文件名和扩展字段 name_len struct.unpack(H, data[i26:i28])[0] extra_len struct.unpack(H, data[i28:i30])[0] i 30 name_len extra_len # 中央目录头签名 PK\x01\x02 elif data[i:i4] bPK\x01\x02: # 通用位标记在中央目录偏移 8 处2 字节 flag struct.unpack(H, data[i8:i10])[0] flag ~0x0001 data[i8:i10] struct.pack(H, flag) # 中央目录头固定 46 字节跳到下一个 i 46 else: i 1 with open(path.replace(.zip, _fixed.zip), wb) as f: f.write(data) if __name__ __main__: fix_fake_encryption(sys.argv[1])代码核心是遍历整个zip文件按“本地文件头—文件数据—中央目录头”的顺序扫描。本地文件头的通用位标记在第6字节中央目录头的在第8字节两处都要清否则一些解压工具仍然会按加密文件处理。注意只清一个的话unzip依然会要密码因为zip解压程序一般以中央目录为准。运行完脚本再试试unzip正常应该直接解出内容。2.3 解压乱码Windows与Linux下的编码差异工具包如果是在国内环境打包的压缩时用的文件名编码多半是GBK/GB18030而Linux下的unzip默认按UTF-8解码解出来就是一堆乱码。这不是文件坏了是编码对不上。最省事的做法是在Windows下用7-Zip解压7-Zip对中文编码兼容性较好能识别GBK压缩的文件名。Linux下则需要显式指定编码unzip -O GBK CTF工具包.zip -d ctf_tools/-O参数指定解压时使用的字符集。注意这个参数不是所有unzip版本都支持Debian系的unzip通常带但macOS自带的BSD变体不支持。遇到不支持的情况可以用python3的zipfile模块配合编码转换来处理import zipfile import os z zipfile.ZipFile(CTF工具包.zip) for info in z.infolist(): # 压缩包文件名先按 cp437 还原字节再按 gbk 解出中文 raw info.filename.encode(cp437, errorsreplace) fixed raw.decode(gbk, errorsreplace) target os.path.join(ctf_tools, fixed) os.makedirs(os.path.dirname(target), exist_okTrue) with z.open(info) as src, open(target, wb) as dst: dst.write(src.read())这段脚本的原理是zipfile读到的文件名已经是解码后的字符串对GBK压缩包来说它按错误的码表解出了乱码文本所以先把乱码文本重新编码成原始字节再用GBK解码出正确文件名。errorsreplace是为了防止某个字符转换失败时整个脚本崩溃。处理完再解压文件名就正常了。2.4 目录规划按题型分区避免工具冲突工具包解干净之后下一步是规划目录。很多人把几十个工具全堆在桌面看起来方便实际用起来很痛苦——不同版本的工具依赖不同的运行库全放一起要么冲突要么某次更新误覆盖。我通常会按题型建目录结构大致是这样ctf/ ├── MISC/ # 杂项binwalk、foremost、StegSolve、zbarimg ├── Crypto/ # 密码学CyberChef、随波逐流、hashcat ├── Web/ # WebBurp Suite、dirsearch、蚁剑 ├── Pwn/ # 二进制漏洞pwntools、gdb ├── Reverse/ # 逆向IDA、Ghidra、radare2 ├── 00_scripts/ # 自写的辅助脚本伪加密修复、批量解压 └── 01_general/ # 通用010 Editor、HxD、7-Zip这样划分有两个好处一是工具按场景加载解一道MISC题不会顺手打开Web工具链造成干扰二是依赖关系清晰比如StegSolve需要Java环境把它和JDK版本说明放到MISC目录下换机器时能快速确认缺什么。工具包本身的原始压缩包建议单独留一份备份不要解压完就删后面第5章排查时会需要重新对照原始文件。3. 按CTF题型配置工具链MISC、Crypto、Web各自要装什么CTF题虽然分门别类但工具包里的常用装备其实是相通的。这一章把三个出题量最大的方向——杂项、密码学、Web——的常用工具拆开讲每类给出最小可用集合和对应的典型命令。3.1 MISC杂项从文件识别到隐写提取的一套命令杂项题是CTF新手接触最多的题型出题思路基本围绕文件隐写、压缩包、图片、流量包展开。工具包里最该先装的是binwalk、foremost、strings、exiftool这四个它们分别解决“文件里藏了什么”“把藏的东西扣出来”“查找明文线索”“看文件元数据”四个问题。file challenge.png exiftool challenge.png strings -a -n 8 challenge.png | grep -iE flag|ctf binwalk -e challenge.png foremost challenge.png -o fore_out/file看真实文件类型很多题把一个zip改成jpg后缀file会直接告诉你“这就是Zip archive data”。exiftool查元数据有些题目把提示藏在图片的Comment字段或GPS信息里。strings提取可打印字符串-a扫描整个文件不跳过二进制段-n 8只输出长度不小于8的连续字符串过滤掉太短的噪声。binwalk -e按签名提取内嵌文件foremost用文件头特征做数据恢复式提取两者互补。MISC里还有两类常见题需要单独的工具。一类是二维码题用zbarimg qr.png直接解码Ubuntu下装zbar-tools就有另一类是图片隐写常见工具是StegSolve它是个JAR包运行命令是java -jar stegsolve.jarStegSolve适合做通道分析、帧对比、色板操作这类肉眼看不出来的隐写。依赖Java环境工具包里如果带着它却打不开先检查系统有没有装JDK这是第5章要重点排查的问题。3.2 密码学CyberChef、随波逐流与hashcat的组合密码学题的核心是识别编码和破解算法不需要把所有密码学库都装上。线上用CyberChef离线用随波逐流这类编码识别工具破解哈希用hashcat。这三个覆盖了八成以上的Crypto题。CyberChef最方便的地方是它的配方Recipe机制Base64、Hex、ROT13、URL解码、栅栏密码可以串成一条流水线自动处理。做Crypto题时我从不在脑子里硬记编码特征直接把字符串丢进去逐段叠加解码看输出。如果题目是常见的多层编码——先Base64再Hex再ROT13——CyberChef几分钟就能试出来。随波逐流这类离线编码工具适合比赛现场没有网络的时候用。它把Base64、Hex、ASCII码对照、凯撒、培根、摩斯电码等常用的编码转换集中在一个界面里对刚入门、还没把编码特征背全的人尤其友好。hashcat负责真正的哈希破解hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt-m 0表示MD5hash.txt里放待破解的哈希最后一个参数是字典文件。常见哈希对应关系-m 1000是NTLM-m 22000是WPA2-m 3200是bcrypt。破解前不确定哈希类型时可以用hashid工具识别。注意hashcat在部分系统上需要GPU驱动跑不起来就用john --formatraw-md5 hash.txt顶上功能弱一点但能出结果。3.3 Web方向Burp Suite、目录扫描与命令执行payloadWeb题的分值通常不高但出现频率极高尤其是入门题和签到题。工具包里Web方向最核心的是Burp Suite社区版它负责抓包改包、重放请求、看响应差异。启动后浏览器代理设到127.0.0.1:8080SSL证书装好就能开工。目录扫描是Web题的固定动作题目搭建的站点常常隐藏了目录或备份文件dirsearch -u http://127.0.0.1:8080 -e php,txt,html -x 404-e指定扫描时附加的扩展名-x 404表示过滤响应码为404的路径减少无效输出。扫描结果里如果出现.bak、.zip、flag.php、index.php~这类文件多半就是突破口。Web题里最常见的一类考点是命令执行PHP的passthru函数是常客。题目代码往往长这样?php if (isset($_GET[cmd])) { passthru($_GET[cmd]); } ?passthru和system的区别在于它直接执行外部命令并原样输出原始结果不经过PHP的缓冲区处理。CTF题目里看到passthru($_GET[cmd])这种写法基本就是送你一个RCE。实际利用时直接在URL里传参数http://127.0.0.1:8080/?cmdcat%20/flag实战里最常翻车的点是拼接引号或空格处理。命令里带空格要URL编码成%20带引号要考虑是否被PHP的escapeshellcmd拦截。如果payload执行了但看不到输出先试试passthru(cat /flag /tmp/out.txt)加一步写入文件再直接访问/tmp/out.txt——这个方法绕过输出捕获特别管用。3.4 把工具链做成按需加载的脚本环境工具装齐之后手动一个个验证太慢常见做法是写一个初始化脚本把apt包、Python库、JAR工具一次性装好。下面是一个Debian系发行版可用的脚本覆盖了我日常做CTF的绝大部分需求#!/bin/bash # CTF工具链初始化脚本Debian/Ubuntu/Kali sudo apt-get update sudo apt-get install -y \ binwalk foremost exiftool steghide zsteg \ hashcat john p7zip-full unzip default-jre \ netcat-openbsd curl wget zbar-tools # Python侧的库 pip3 install --user pycryptodome pwntools requests echo 工具链安装完成验证关键命令 for cmd in binwalk foremost exiftool hashcat 7z steghide; do printf %-12s $cmd command -v $cmd echo [OK] || echo [MISSING] done脚本本身不复杂作用是把环境初始化做到可重复。steghide是音频/图片隐写题的提取工具zbar-tools提供二维码解码pycryptodome是Crypto题写RSA和AES脚本的常用库。pwntools是Pwn题交互和exp开发的依赖Web题虽然用不到但统一装好能避免以后临时补环境。4. 从zip杂项题到提取flag一个最小可复现的实战流程第2章解决了工具包本身第3章把各题型工具装配好了这一章用一道典型的MISC杂项题串起整个流程。这类题的常见套路是一个文件伪装成图片或纯数据里面内嵌了一个zipzip里又套了一层文件最终flag被编码过。下面按步骤走每步都要看输出不要跳。4.1 用file识别真实类型不要信扩展名拿到题目文件先放进一个干净的工作目录然后用file判断真实类型。扩展名是png不一定真是图片是txt不一定真是文本。cd /tmp/work file evidence.bin xxd evidence.bin | head -5file靠文件头签名判断类型它报告“Zip archive data”时基本可以确认这是zip伪装。xxd看十六进制开头是为了双保险zip文件的头两个字节是50 4B也就是ASCII的PK。如果一个文件扩展名是jpg头却是PK那它就是被改了后缀的zip直接改名就能解压。xxd的| head -5限制只看前几行避免二进制内容刷屏。4.2 处理嵌套zip与同名文件覆盖杂项题特别喜欢玩“套娃”——一个zip解出来还是一个zip解到第5层才出flag。手动一层层解也能做但浪费时间我一般用循环脚本处理#!/bin/bash set -euo pipefail work$(mktemp -d) cp $1 $work/current.zip cd $work for ((i0; i20; i)); do echo [*] 第 $i 层解压开始 if ! unzip -o current.zip -d layer_$i /dev/null 21; then echo [!] 解压失败可能是加密或损坏 break fi next$(find layer_$i -name *.zip -type f | head -1) [ -z $next ] break cp $next current.zip done echo [*] 文件树 find $work -type f | sort脚本要点有三个。第一每层解压到独立的layer_$i目录避免同名文件互相覆盖便于追踪“第几层出了问题”。第二用cp而不是mv保留每一层的压缩包作为现场证据万一最后flag不对还能回头重查。第三循环上限20层是为了防止套娃题目设计成死循环遇到解不完的情况能自动退出。输出文件树后逐个file过去看最内层是什么类型。4.3 从图片里提取隐藏文件binwalk和foremost的完整命令串如果内层是一个图片文件那就进入隐写提取环节。最常见的是图片尾部追加了zip或者在图片中间插入了另一个文件。这类情况file看不出来binwalk能通过扫描文件签名发现。binwalk -e flag.jpg ls -la _flag.jpg.extracted/ foremost flag.jpg -o fore_out/binwalk -e会递归提取所有检测到的签名文件输出目录通常叫_原名.extracted。注意-e的递归提取对某些畸形文件也会报错报错时改用-D按类型分离binwalk -D zip:zip flag.jpg-D zip:zip表示只提取被识别为zip签名的数据输出为.zip文件。这个写法在误报多的时候很管用。foremost是另一套提取机制基于文件头特征做匹配对部分binwalk漏掉的情况有奇效。两个配合使用基本能覆盖九成以上的文件隐写题。4.4 把完整流程固化成一个脚本上面的步骤手动敲一遍就够做多了应该把它固化成脚本。我自己的做法是把伪加密修复、循环解压、密文解码串成一个工具脚本放在00_scripts/目录下面随用随调#!/bin/bash # 用法: ./autorelease.sh evidence.bin set -euo pipefail TARGET$1 WORK$(mktemp -d) cp $TARGET $WORK/current # 第一步识别真实类型 ftype$(file -b $TARGET) echo [*] file 识别: $ftype # 第二步如果是zip伪装先改后缀再解压 case $ftype in *Zip*|*zip*) mv $WORK/current $WORK/current.zip ;; esac # 第三步binwalk提取内嵌文件 binwalk -e $WORK/current -C $WORK/extract /dev/null 21 || true # 第四步找文本文件尝试解码base64 find $WORK -type f | while read -r f; do if file -b $f | grep -q text; then content$(cat $f) echo [*] 发现文本: $f echo $content | base64 -d 2/dev/null || true echo fi done脚本的原理就是前面几步的逻辑串联识别类型、处理zip伪装、binwalk提取、扫描文本并尝试base64解码。|| true放在binwalk后面是为了让脚本在提取失败时继续执行不中断整个流程。实际比赛里遇到批量题目这种脚本能省下大量重复操作时间。5. CTF工具包踩坑记录伪加密、密码爆破与损坏zip的排查清单工具类问题最大的特点是没有报错或者报错很隐晦这一章把CTF工具包最常见的五个坑按“现象→原因→解决”的顺序写清楚。这些坑我都栽过每一条都是赛前没查、赛中抓瞎的血泪经验。坑一zip打得开但解压时突然要密码现象双击压缩包能看到文件列表也很容易打开一旦执行解压就弹出密码输入框输什么都错。用zipinfo -v查看显示文件带encryption标记但用7z预览时又隐约能看到压缩包内文件名。原因zip伪加密。文件数据没有真正加密只是头部通用位标志被置1解压程序据此要求密码。这种设计在CTF题里是故意的在工具包里则可能是打包工具来源不明导致。解决把第2.2节的Python脚本跑一遍清零两处加密标志位重新保存为_fixed.zip。如果不想写脚本用7-Zip直接尝试“提取到指定文件夹”有部分伪加密包能绕过密码直接解出内容。修复后验证一下zip -T能通过完整性测试就是干净了。坑二明明记得密码但解压一直报“password incorrect”现象感觉密码是个弱口令但重复输入几十次都报错。怀疑自己记错又试了几组类似密码仍然失败。原因大概率是密码经过了编码转换或者大小写不敏感被记成了全小写。另一种常见情况是压缩包用的是AES加密模式而部分老旧解压工具只支持传统ZipCrypto两者密码校验方式不同。解决先用7z l看加密方式输出里会标注ZipCrypto或AES。如果是AES换支持AES的版本解压。如果是想爆破优先用带-u参数的工具fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u flag.zip-D指定字典模式-p后面跟字典路径-u表示用“实际解压”验证密码而不是仅做内部校验。垃圾字典跑不出来时把密码范围缩小到“题目提示里出现的单词常见数字变形”比如key123、pass2024这类。爆破是最后手段做题时优先还原出题人的心理——密码往往就是文件名或者题目描述里的某个词。坑三解压出来全是乱码文件名文件能打开但找不到哪个是工具现象压缩包解压成功所有内容都在但文件名是锟斤拷、这种乱码完全无法判断哪个文件是哪个工具。原因压缩时用GBK编码记录文件名解压时用了UTF-8两边字符集拼不上。工具包是国内团队打包给国内选手的最常见的原因就是这个。解决最省事的办法是直接用7-Zip在Windows下解压它自己会处理GBK兼容问题。Linux下按第2.3节的unzip -O GBK指定字符集抢救。如果已经解压成一堆乱码文件别删把压缩包留好重新用正确编码解到新目录不要试图手动重命名乱码文件。坑四binwalk扫了半天什么都提不出来现象binwalk输出很少或只有一行“Nothing extracted”。但直觉告诉你这个文件里有东西比如文件大小异常或者在文本编辑器里能看到PK字样。原因文件头被修改过或者隐藏数据没有独立签名。binwalk依赖文件签名进行识别遇到人为破坏的签名就失效。解决用xxd和strings双管齐下xxd evidence.bin | grep -n 504b strings -a evidence.bin | head -20504b是PK的十六进制grep直接定位疑似zip起始位置。如果strings能看到PK和明显是路径的字符串说明zip数据还在只是没有对齐到binwalk识别的偏移。这时用dd按偏移切出数据段再单独修复zipdd ifevidence.bin ofrecovered.zip bs1 skip1024 count4096skip和count按xxd里看到的偏移调整。切出来的zip可能缺少中央目录用第2.2节的Python脚本或者zip -FF recovered.zip --out fixed.zip尝试修复。坑五工具包里某个工具双击没反应现象工具包里的stegsolve.jar双击没反应binwalk在Windows上装好但运行报缺少库。不是题目问题是工具本身跑不起来。原因八成是依赖缺失。JAR工具需要Java环境Linux下编译的二进制工具拿到Windows上跑缺少Windows版本依赖还有一类是工具是32位编译的运行在纯64位系统上缺32位库。解决先看工具的启动方式。JAR统一用命令行启动能看到报错信息java -jar stegsolve.jar报ClassNotFoundException或UnsupportedClassVersionError就是Java版本不对前者缺依赖JAR后者是Java版本太旧或太新。二进制类工具用ldd查看动态库依赖ldd ./binwalk出现not found的库用包管理器对应安装。工具落到比赛环境里“跑不起来”的核心药方是Docker化把整套依赖锁进容器这也是第6章要做的事。6. 把CTF工具包变成自己的环境脚本自测、Docker化与版本管理工具包与其说是收集来的资产不如说是一套需要持续维护的环境。维护的核心是让它在任何一台新机器上都能快速复原。我自己的习惯是三层管理第一层是git版本管理记录每次增删工具的意图第二层是自测脚本拿到任何环境先跑一遍缺什么立刻暴露第三层是Docker化把整套环境锁进镜像从此告别“在我机器上能跑”这种玄学。6.1 用git记录工具包的变更cd ctf git init cat .gitignore EOF *.jar *.bin __pycache__/ EOF git add . git commit -m 初始化CTF工具包加入MISC/Crypto/Web基础工具.gitignore把JAR包和大体积二进制排除在版本控制之外这些文件只要能下载回来就不需要备份进git。git里真正要追踪的是工具的版本清单、安装脚本和文档而不是工具本体。6.2 自测脚本验证工具链#!/bin/bash # check_tools.sh tools(file exiftool strings binwalk foremost 7z hashcat java python3) miss0 for t in ${tools[]}; do if command -v $t /dev/null 21; then echo [OK] $t else echo [MISSING] $t miss1 fi done exit $miss这个脚本输出里只要出现MISSING就立刻补齐依赖。每次拿到新机器或者比赛前一晚跑一遍就当出征检查比临场发现工具跑不起来再找原因省心得多。6.3 Dockerfile打包完整CTF环境FROM kalilinux/kali-rolling RUN apt-get update apt-get install -y \ binwalk foremost exiftool steghide zsteg \ hashcat john p7zip-full unzip default-jre \ netcat-openbsd zbar-tools \ pip3 install pycryptodome pwntools requests WORKDIR /ctf CMD [/bin/bash]构建并进入容器docker build -t ctf-tools:latest . docker run -it --rm -v $(pwd):/ctf ctf-tools:latest bash-v $(pwd):/ctf把当前目录挂载进容器题目文件放在容器里处理工具环境却与宿主机隔离。比赛时遇到“系统里装了一堆乱东西导致环境坏了”的情况重新build一次就回到干净状态。这也是我最后想强调的一句话CTF工具包不是熵减的藏品堆而是你每打一场比赛都要微调一次的个人环境——把它做成能备份、能验证、能一键复原的东西才算真正消化了这份工具包。希望帮到你。本文还有配套的精品资源点击获取
返回列表