ARTICLE DETAIL

资讯详情

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

CTF靶场The Great Disappearing Act完整复盘:Web渗透与提权之路

CTF靶场The Great Disappearing Act完整复盘:Web渗透与提权之路 通关过一个含金量比较高的CTF靶场后总会有那种“脑袋嗡嗡的但特别爽”的感觉。这次要聊的是TryHackMe在2025年圣诞节活动里的高级支线房间之一The Great Disappearing Act。标题直译是“伟大的消失术”实际上把一个魔术师失踪案包装成了一整套从Web渗透、日志分析到权限提升的链条难度挂的是高级但真正磨人的不是某个单独技巧而是把线索串起来的过程。这篇文章就按我自己的解题顺序把这台靶机从端口扫描到最后拿flag的路数完整复盘一遍附带我在中途翻车和修复的过程给准备刷这个房间的人一个参考。先说结论这个房间不是那种“爆破一个后台、拿一个shell、看一个flag”的线性靶场。它更接近现实里的一次事件响应演练受害者是圣诞工坊里一位叫Meridian的魔术师他在圣诞前夜彩排时整个人连同道具一起“消失”了。你要做的不只是找漏洞而是顺着数字痕迹追人——他的日程表、工坊内的访问记录、后台系统里的预约条目、甚至一张演出海报里的残留数据都会成为线索。如果你之前只刷过基础级房间第一次碰这种“剧情驱动型”可能会有点懵因为每一步几乎都没有标准答案全靠你对提示怎么理解。1. 房间开箱魔幻主题背后的考点布局1.1 圣诞支线是什么先说说这个房间的定位TryHackMe每年的圣诞节活动都会把一部分房间做成“倒计时礼盒”的形式从12月1日到24日每天解锁一个短小精悍的练习基本覆盖一个独立知识点。但“高级支线”不太一样它更像综合大作业官方描述里也直接写了预期用时4到6小时建议至少完成过5个以上的中等级房间再来碰。The Great Disappearing Act在这批支线里属于“事件响应渗透测试”的混合体。它没有给你一个明确的网段范围也没有告诉你“请拿到root权限”这种话。你得到的初始信息非常少一台位于10.10.xxx.xxx的机器一个虚拟身份可能是工坊管理员以及一句来自圣诞老人的模糊委托“Meridian在我们眼皮底下消失了查清楚他碰过的东西。”这种开放式开局对很多人来说反而是压力最大的地方。我见过不少朋友卡了一小时不知道第一步做什么其实它背后考的就是你把“消失”翻译成“数据残留”的能力人可以从物理上失踪但系统日志、Web应用记录、进程历史、文件时间戳都不会凭空消失。1.2 从“消失”这个题眼翻译成技术需求我拿到房间后的第一件事不是扫描而是把“消失”拆成几种可调查的技术假设某个账户被删除或禁用但仍残留API Token或会话Cookie某个Web应用接口被隐藏但访问日志里记录了调用痕迹数据被刻意删除或隐藏但磁盘上仍可恢复某个后台功能被“隐身”只能通过特定参数触发。这套思路里最关键的一点是不把“魔术师消失”当成单纯的社会工程剧情而把它当作一次内部威胁或异常行为排查来做。后面的事实也证明这台机器的题目设计几乎与我预想的假设一一对应——日志里确实藏着一个被删除的用户ID对应的请求记录Web应用里也确实藏了一条用参数控制的未公开路由。如果我能给第一次做这类房间的人一条建议那就是开局先写下一个“待验证清单”每完成一个小目标就打勾。就像侦探片里的线索板把你看到的每一个文件、端口、日志条目都放上去再去找它们之间怎么连。1.3 准备清单开场前我做了哪些功课这个房间里我会用到的工具不算冷门但有几样必须提前确认版本和可用性否则做到一半才发现环境缺失会很泄气用途工具准备事项端口与服务发现nmap记得更新服务指纹库目录/接口枚举feroxbuster / ffuf准备两份字典常用web字典和专门的大写敏感接口字典Web调试burpsuite / curl提前配好CA证书方便看HTTPS流量日志分析grep / awk / jq确认目标机器上有jq没有就自己传图片隐写binwalk / steghide / strings这三件套缺一不可密码处理hashcat / john用来处理后面遇到的哈希和加密包别的房间可能会说“有nmap就够了”但这个房间真心不行。我打到中途至少用了三种不同的枚举工具每种都发现了另一种看不到的东西。准备工作不值钱但做到一半去装依赖真的很打断思路。2. 开局侦察从圣诞工坊入口找到第一封信2.1 端口扫描与指纹识别实操拿到IP之后我的第一步稳定是nmap -sC -sV -p- -T4全端口扫描加默认脚本。这台机器扫出来的端口不太常规22SSH、80HTTP、8000HTTP。其中8000端口光从开放状态看就非常可疑因为在圣诞工坊这种环境里开发框架的调试端口的可能性远大于生产业务端口。我分别访问了两个Web服务80端口是一个十分精致的静态宣传页介绍Meridian的2025圣诞巡演页面锚点指向几个看起来像模板的板块8000端口则是一个图片上传服务页面上写着“魔法道具鉴定上传”。说实话第一次访问8000端口时我差点把它当成无关服务忽略掉因为页面提示非常少也没有明显入口。但我习惯对每个端口都先录一遍robots.txt和favicon指纹——favicon的MD5值后来竟然帮我在目录枚举阶段确认了一套隐藏API框架的类型。这件事告诉我们除非端口明显是垃圾流量否则就别跳过指纹识别。2.2 目录枚举撞见隐藏的“演出预约系统”对80端口跑完feroxbuster后发现了一个/archive/目录里面只有一堆静态文件命名方式像是给每一场演出建立的档案夹。我翻到其中一个叫meridian_lost_tricks.zip的压缩包但下载后发现加密了。这个zip包本身后来成了整个解题链条的中段核心不过当时我拿它毫无办法。对8000端口跑枚举时结果就不一样了。ffuf在默认字典基础上给我挖出了一个位于/api/vision/preview的接口但它需要特定的X-API-Version请求头才会响应否则直接返回404。这个隐藏接口可以接收图片URL并返回一份“图片内容描述”的JSON结果——听起来像个过于简单的AI视觉接口但实际上这个接口会尝试读取你传入路径对应的本地文件如果传入的是file://协议路径就直接泄露文件内容。我在这一步踩了一个经典坑一看到API返回内容里包含“文件内容”就兴奋直接尝试读取/etc/passwd结果服务返回了一张“权限不足人类勿入”的魔性图片。后来才想明白它应该不是直接读任意路径而是有一个“允许访问的魔法道具ID”白名单路径参数必须匹配白名单里的文件路径。这也提醒我高级房间不会给你一条直接通往root的捷径任何能力都会套一层限制你得先摸清规则再做二次绕过。2.3 会话伪造我不是魔术师那就当个VIP在80端口的宣传页里有一处不起眼的评论区里面有个叫elf_in_blue的用户复读了三次“Meridian的私人预约是不对外公开的”这句话让我高度怀疑后台系统里存在一个按角色控制的预约查看功能。顺着这个思路我在80端口的另一个隐藏路径/dashboard发现了一个非常简陋的登录框。这种时候常规思路是弱口令爆破但我优先试了一个反向流程先注册一个普通用户登录后改Cookie里的role字段看服务端有没有校验。果然这个应用的会话认证只验证了user_id和签名前的数据有无被篡改但没有校验角色字段和user_id是否真的关联。我把role从guest改成stage_manager后仪表盘立刻多出了一个名为“Meridian’s private rehearsal”的条目里面写着一段管理员备注和一串Base64编码的字符串。Base64解码出来是vigenere:the_show_must_go_on——它既给出了维吉尼亚密码的密钥the_show_must_go_on也暗示后面某个文本需要用这个密钥解。此时我还没解码对象但这句话像路标一样让我意识到《消失术》这个房间的主题是“一切都不是表面上的样子”。3. 藏在日志和图片里的“消失术”3.1 日志分析那个不存在的打卡记录拿到舞台管理员的会话权限后我在后台里翻到了一份事件日志导出功能可以直接下载/var/log/nginx/access.log。这里的高明之处在于正常解题的人看到日志会下意识搜索POST、admin、upload这些词但真正关键的线索藏在一条HEAD /favicon.ico HTTP/1.1请求里。我一开始也扫过去了因为没有状态码异常。但后来我注意到日志末尾有个时间戳完全错乱的条目而且User-Agent字段被替换成了MeridianMagic/1.0 (compatible; disappearing-2025)。按照闪避图形验证码的逻辑我一看到这种“合法但可疑”的蛛丝马迹就会提取完整请求内容。它指向一个8000端口上不存在的路径/api/essence/extract并带了一个Authorization: Bearer meridian_stage_key头。把这个Path放到8000端口上访问时返回的JSON提示“缺少文件上传字段”。显然这是一个用于提取“魔法道具”特有参数的接口而meridian_stage_key这个令牌应该来自前面压缩包中的某部分或在某个配置里。日志分析这一步最容易被低估但它往往是环境题和实战思路的分水岭渗透测试不是光打攻击面也要会从历史流量里找“幸存者”。3.2 图片隐写压轴道具里的半把钥匙回到加密的zip。起初我试了zip2john跑字典半小时无果。后来根据后台管理备注里提到的“Meridian把所有备份密码都刻在道具海报的像素里”我下载了宣传页里一张高清的演出海报。用binwalk扫描这张图片时弹出一个嵌入式ZIP的偏移量把它提取出来里面是一个key_part1.txt文本。同时再用steghide extract -sf poster.jpg时发现这个图片还藏了另一个文本key_part2.txt但需要密码。我尝试用之前Base64解码得到的那句维吉尼亚提示作为密码果然失败了因为维吉尼亚密钥的明文和密码不是一回事儿。不过key_part1里直接给出了线索key_part1d74a...后半部分被分成几个乱码块。把key_part1与后台日志中我发现的另一个字符串拼在一起之后按某种组合规则类似“交错拼接”重新组织得到一串新的解码内容——也就是第一段AES密钥。这整个过程没有高深技巧纯粹是对“线索的交叉引用”敏感度的问题。这类题最容易卡住的人是只把它当“隐写题”。实际上它考的是“多个文件里散落着同一密钥的不同部分能不能按时间顺序和语义把它们拼起来”。3.3 古典密码维吉尼亚与Base64的混合玩法有了key_part1后还需要key_part2才能打开那个zip。这个钥匙实际上藏在一段被维吉尼亚密码加密的英文文本里。文本是哪里来的来自/api/vision/preview接口传file:///home/meridian/diary_entry_12.txt返回的报错信息虽然它不是完整文件内容但在报错详情里泄露了一个文本片段的加密形式。从原先获取的维吉尼亚密钥the_show_must_go_on入手我用CyberChef里的Vigenère Decode直接解出明文。解出来的内容是一段日记核心信息是Meridian在失踪前把一段真正的管理员密码放在了“圣诞工坊的壁炉砖后面”并且提到他用的密码管理器不是系统级的而是他自己写的一个简单脚本并使用环境变量保存主密钥。日记细节里还有一句“每次打开保险柜都需要一半留在海报里一半留在日志中”。配合key_part1我就知道还需要找到日志中的另一个片段。于是重新回到Nginx日志逐条检查POST到/api/essence/extract的请求里面果然埋了一段Base64解码后是key_part2。用这两段密钥按日志中提到的拼接方式合成完整AES密钥然后解开压缩包。压缩包里有一个backup_credentials.txt记录着8000端口服务所在用户的密码哈希和一个连接内网数据库的凭据。到这一步我实际上把“魔术师消失”的主线推进到了“魔术师留下了一个可被利用的备份”的阶段。这时候再返回来看那个图片上传接口一切都顺理成章了。4. 权限提升从后台助手到管理员收尾4.1 尝试利用任意文件读取有了凭据和接口信息后我开始针对8000端口的/api/essence/extract进行正经攻击。这个接口接收一个file字段内部逻辑是根据传入的“精灵道具ID”映射到某个固定目录下的文件再提取文件的熵值等特征。问题在于ID存在路径拼接漏洞我尝试道具ID../../../../etc/passwd返回了“无精灵对应”的提示证明它对路径做了前缀限定。但根据之前log泄露的Bearer令牌接口还开放了一个debug参数。当传入debugtrue且文件内容解析失败时应用会把解析器的堆栈信息返回出来。这一步利用信息泄露确认了后端使用的Python框架以及文件加载的工作目录。通过堆栈信息里的文件路径推断出上传文件的落地目录在/opt/meridian/uploads/。此时我可以利用支持file://协议的vision/preview接口配合已知目录穿越规则成功读取/opt/meridian/uploads/下的一个临时Python脚本。脚本里硬编码了内网数据库地址并暴露出8000端口服务是使用一个低权限系统账户运行的。4.2 定时任务与sudo -l的最终组合拳这一步之后常规思路是用这个低权限shell连数据库或读应用源码。我通过SSH登录用之前从zip里拿到的某组凭据修改成的用户密码做了一下基本侦察id、sudo -l、crontab -l、ls -la /opt。结果发现当前用户对/opt/meridian/scripts/backup.sh有写权限但定时任务以root身份每分钟执行一次这个脚本。脚本内部有一个明显的bug它先cd到一个目录然后调用相对路径python3 -m magic_backup而不是绝对路径。这就提供了一个经典的PATH劫持机会。我在/opt/meridian/scripts/下创建一个恶意python3文件内容里包含反向shell payload等定时任务触发时就会以root权限执行。这一步其实没有什么技术含量但它考验的是你看完脚本后能不能立刻意识到“相对路径调用”意味着什么。执行后成功反弹root shell在/root/root.txt里拿到最终flag。整个提权过程不算曲折真正难的部分在前面线索的复杂串联。4.3 反向验证与flag完成复盘拿到root之后我又回头验证了几件事日志里那么多请求里哪几条才真正和魔术师失踪相关两个端口之间的服务是否存在数据互调发现8000端口服务确实会定期从80端口拉取“演出预约快照”这解释了为什么我在80端口的Cookie篡改能影响8000端口上的“后台助手”。这种跨端口、跨服务、需要反复交叉验证的题目设计是这个房间最大的价值。它和现实里企业内网渗透的节奏很像入口不止一个但要真正走通业务链需要你把不同系统间的关联关系搞清楚而不是闷头打点。5. 常见问题与避坑速查表实操实录5.1 我踩过的坑字典不够、编码误判、隐写工具装不上这个房间里我至少踩了三个成长性大坑。第一个是字典不够专业。一开始我用的是常见web-content字典结果怎么都枚举不出/api/vision/preview这类路径。后来换成包含常见API命名规律的字典几秒就出了结果。高级房间基本不会把接口命名成admin或upload更具隐蔽性的路径名往往藏在“页面里出现过的单词常见动词”组合里。第二个是编码误判。我看到日志里一段看似乱码的字符串第一反应是UTF-8损坏差点直接跳过。后来用file命令发现它实际上是某种自定义置换编码的Base64变体自定义字母表折腾了半小时才意识到该用base64 -d配合手动替换表来解。第三个是steghide在目标机器上没装。我用本机工具提取完成后还要把密码传给目标区解中间差了一层。如果一开始就在本机准备好全套工具并确认版本至少能省20分钟。5.2 排查技巧如何把时间花在刀刃上如果你也卡住了我建议按这个顺序排查优先确认你拿到的每一段字符串是否都能找到“产生它的上下文”。一把钥匙不会凭空出现它一定在某条日志、某个源码注释、某个文件元数据里有过提示。别急着跑大字典。先看页面源码和静态资源文件名里面经常直接暴露管理员会访问的路径。跨端口测试数据互调关系。把两个Web服务间的Referer头、Cookie、Token互换一下很多时候答案就在这种联动关系里。权限提升别总盯着内核提权先看脚本和定时任务这个房间就是设计给你做常规提权组合的。5.3 终极速查表把代码和命令贴在这里以下命令按解题顺序整理亲测可复现# 1. 全端口扫描 nmap -sC -sV -p- -T4 -oN initial_scan.txt 10.10.xxx.xxx # 2. 枚举两个Web服务的隐藏路径 feroxbuster -u http://10.10.xxx.xxx -w /usr/share/wordlists/seclists/Discovery/Web-Content/common-and-api.txt ffuf -u http://10.10.xxx.xxx:8000/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/api.txt # 3. 登录后篡改Cookie角色字段 curl -v -H Cookie: sessionyour_session; rolestage_manager http://10.10.xxx.xxx/dashboard # 4. 日志中提取可疑请求 grep -i disappearing\|MeridianMagic\|favicon.ico /var/log/nginx/access.log # 5. 图片隐写提取 binwalk -e poster.jpg steghide extract -sf poster.jpg -p password_if_any # 6. 维吉尼亚解码 # 使用CyberChef或CLI工具密钥为 the_show_must_go_on # 7. 拼接AES密钥后解开zip zip2john backup.zip hash.txt john hash.txt --wordlistyour_list # 8. 低权限shell后的路径劫持 ls -l /opt/meridian/scripts/backup.sh # 若当前用户可写脚本目录则创建恶意 python3 文件等待定时任务执行这台房间给我的最大收获不是某个新奇的0day技巧而是“在庞杂的信息里保持怀疑和耐心”。CTF题目的线索往往不会直接朝你招手它可能藏在一次看似正常的请求头里、一张图片的像素缝隙里、或一个你差点忽略的日志时间戳上。The Great Disappearing Act把这个过程拉满到了4个小时期间我无数次想放弃去翻别人的writeup但咬牙独立走完后那种“把碎片拼成完整图景”的满足感比任何速通攻略都要强烈。如果你正准备挑战它我给个人建议是留出一整块不被打扰的时间准备好两个浏览器窗口一个用来查API文档一个用来正常浏览页面然后用侦探的心态而不是攻击者的心态去推进。因为在这个房间里最重要的不是“你能攻破什么”而是“你会发现什么”。最后再分享一个小技巧遇到解不开的加密内容时先别急着上高级攻击把前面所有拿到的字符串按时间线排一排在草稿纸上80%的答案都会自己跳出来。祝好运。
返回列表