环境搭建与利用复现)
Apache HTTP Server 2.4.49 路径穿越与文件泄露漏洞CVE-2021-41773环境搭建与利用复现【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhubApache HTTP Server 2.4.49 在 2.4.49 版本引入的路径规范化改动中存在缺陷攻击者可构造特殊编码的 URL 绕过目录边界穿越到 Web 根目录之外读取敏感文件甚至在启用 CGI 模块时实现远程代码执行。本文基于 vulhub 仓库中的 httpd/CVE-2021-41773 环境完整讲解漏洞成因、Docker 环境搭建、文件读取与命令执行两种利用方式并结合 Dockerfile 与镜像配置深入分析漏洞触发的前提条件。漏洞背景与成因Apache HTTP Server 是一个开源的跨平台 HTTP 服务器。在 2.4.49 版本中官方对路径规范化逻辑path normalization做了一处改动正是这次改动引入了 CVE-2021-41773 漏洞攻击者可以利用路径穿越path traversal攻击将 URL 映射到预期 document root 之外的文件。该漏洞的触发需要同时满足两个条件Apache 版本恰好为 2.4.492.4.50 已部分修复但修复不完整衍生出后续的 CVE-2021-42013被穿越的目标目录允许被访问例如配置了Directory /Require all granted/DirectoryApache 默认配置为Require all denied因此默认配置下攻击无法成功。满足条件后攻击者可以读取位于 Apache Web 目录以外的其他文件读取 Web 目录中脚本文件如 PHP的源码在服务端开启了cgi或cgid模块时执行任意命令。漏洞环境搭建本仓库在 httpd/CVE-2021-41773 目录下提供了完整的漏洞环境。进入该目录后执行以下命令即可编译并启动一个存在漏洞的 Apache HTTP Server 2.4.49 实例docker compose build docker compose up -d环境启动后通过浏览器访问http://your-ip:8080即可看到 Apache 默认的It works!页面说明服务已正常运行。环境配置细节该环境的编排文件 docker-compose.yml 非常简单基于当前目录构建镜像并将容器的 80 端口映射到宿主机的 8080 端口version: 2 services: apache: build: . ports: - 8080:80真正关键的是 Dockerfile它基于 vulhub 基础镜像 base/httpd/2.4.49/Dockerfile即官方httpd:2.4.49镜像构建并通过 sed 与 perl 对httpd.conf做了三处关键修改用来构造满足漏洞触发条件的服务器启用 CGI 模块取消LoadModule cgid_module modules/mod_cgid.so和LoadModule cgi_module modules/mod_cgi.so两行的注释为后续命令执行利用提供前提启用 autoindex 模块取消Include conf/extra/httpd-autoindex.conf的注释使/icons/目录存在且可访问——这是路径穿越利用中必要的跳板目录放开根目录访问权限将Directory /配置段中的默认策略由Require all denied替换为Require all granted从而允许请求穿越到 Web 根目录之外。值得注意的是第 3 点恰恰对应了漏洞文档中强调的前提条件默认配置下Directory /是Require all denied即使存在路径规范化缺陷穿越请求也会被拒绝只有将根目录权限放开后文件读取才可能成功。这也解释了为何官方公告称该漏洞受配置影响较大。漏洞利用一任意文件读取利用路径穿越读取/etc/passwd的 Payload 如下注意其中的/icons/必须是一个存在且可访问的目录curl -v --path-as-is http://your-ip:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd对 Payload 稍作拆解--path-as-is告诉 curl 不要对 URL 中的.和..片段做本地规范化处理原样发送给服务端这是绕过 curl 自身检查的关键参数%2e是.的 URL 编码形式/%2e%2e/在服务端解码后即等价于../请求先命中真实存在的/icons/目录再通过连续多级..逐级上跳最终越过 document root 访问到/etc/passwd。成功执行后服务端返回HTTP/1.1 200 OK响应体即为/etc/passwd的完整内容可以看到root、daemon、bin等系统用户的 UID、GID、家目录与 Shell 路径等敏感信息。图中可见root:x:0:0:root:/root:/bin/bash等行证明文件读取成功。除读取系统文件外该漏洞还可用于读取 Web 目录内脚本的源码如.php、.jsp等从而进一步辅助攻击者审计业务逻辑、寻找更多弱点。漏洞利用二远程命令执行需要 CGI 模块当服务端启用了cgi或cgid模块时路径穿越可以进一步升级为任意命令执行。利用方式是通过穿越到/bin/sh并借助 CGI 机制将 POST 数据作为命令喂给 shellcurl -v --data echo;id http://your-ip:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/shPayload 分析--data echo;id发送 POST 请求体内容为echo;id——先输出一个空行以分隔 HTTP 响应头与命令结果再执行id命令URL 中的/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh在解码后等价于/cgi-bin/../../../../bin/sh将请求转发给系统自带的/bin/sh执行。执行成功后返回HTTP/1.1 200 OK响应体中直接出现命令执行结果例如uid1(daemon) gid1(daemon) groups1(daemon)证明已经以daemon用户身份在服务器上执行了任意命令。攻击者可将id替换为任意命令如反弹 Shell、下载恶意程序等实现完全控制。这也是本环境在 Dockerfile 中主动启用cgid_module/cgi_module的原因——只有同时满足路径穿越可用与CGI 已启用两个条件才能演示从任意文件读取升级到远程命令执行的完整攻击链。修复与防护建议升级版本升级到不受影响的 Apache HTTP Server 版本官方在 2.4.50 中修复了本漏洞但其修复并不完整还引入了 CVE-2021-42013 绕过问题因此应升级到修复 CVE-2021-42013 之后的版本收紧目录权限保持Directory /等根目录配置为默认的Require all denied仅对确实需要公开的目录开放访问按需启用模块如无必要不启用cgi/cgid模块避免文件读取漏洞升级为命令执行。关联环境本漏洞与 httpd/CVE-2021-42013 是同一攻击链上的两个连续漏洞CVE-2021-41773 影响 2.4.492.4.50 的修复被绕过后又产生 CVE-2021-42013影响 2.4.49 与 2.4.50其利用思路与本环境基本一致区别仅在于绕过编码从%2e变为双重编码的%%32%65。感兴趣的读者可以对照研究 Apache 路径规范化逻辑的演进。【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考