关于 TryHackMe "Modern Web Stacks" 房间的 writeup,重点利用 CVE-2021-41773,这是 Apache HTTP Server 2.4.49 中的一个路径遍历漏洞,当 mod_cgi 启用时可导致远程代码执行。
| 项目 | 详情 |
|---|---|
| 漏洞 | CVE-2021-41773 — Apache 2.4.49 路径遍历 / RCE |
| 目标服务 | 端口 8080 上的 Apache HTTP Server |
| 受影响版本 | Apache/2.4.49 (Unix) |
| 根因 | ap_normalize_path() 中规范化顺序错误 |
| 影响 | 任意文件读取 → 通过 mod_cgi 实现远程代码执行 |
| 使用工具 | curl |
Apache 2.4.49 改变了 ap_normalize_path() 处理 URL 的方式。Apache 本应在请求路径到达文件系统之前阻止任何包含 ../ 的路径——但遍历过滤器在完整 URL 解码之前运行。
这意味着使用双编码序列 .%2e/ 的请求不会被过滤器识别为 ../。然而,一旦 Apache 将路径交给操作系统,.%2e/ 被解析为 ../,而遍历过滤器已经被绕过。
仅此一项就允许在 Web 根目录之外进行任意文件读取。当与 mod_cgi 结合时,影响变得严重:如果遍历路径解析为 CGI 启用目录(例如 /cgi-bin/)内的可执行文件(如 /bin/sh),Apache 会将其作为 CGI 脚本执行,并将 HTTP POST 主体传递到其标准输入——从而获得远程命令执行。
确定目标的 Server 响应标头为:
Apache/2.4.49 (Unix)
此版本直接受 CVE-2021-41773 影响。
/cgi-bin/ 可用性请求 /cgi-bin/ 并收到 403 Forbidden 响应(而非 404),表明该目录存在且 mod_cgi 可能已启用——这是通过此 CVE 实现 RCE 的先决条件。
使用带 --path-as-is 标志的 curl,按原样发送编码的遍历序列,避免 curl 在客户端侧先进行规范化:
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
为什么需要 --path-as-is: 默认情况下,curl 会规范化 URL 并在发送请求之前剥离 .%2e/ 序列。--path-as-is 告诉 curl 按原样发送 URL,从而保留编码的遍历,使其完整到达服务器。
该载荷从 /cgi-bin/ 遍历到根文件系统,通过注入的 POST 主体将 /bin/sh 作为 CGI 脚本执行,并返回 /flag.txt 的内容。
Flag 格式确认:THM{...}
(根据 TryHackMe 关于公开 writeup 的指南,Flag 已被编辑。)
mod_cgi + 路径遍历 = RCE。 仅文件读取已经很糟糕;与 CGI 可执行目录结合后,就变成了命令执行。--path-as-is(或等效的原始请求工具)至关重要。mod_cgi。此 writeup 记录了实验室环境(TryHackMe)。未访问任何未授权系统。