Nginx-UI 任意文件写入漏洞分析与利用思路 (CVE-2024-23827)
字数 1213 2025-08-10 08:28:52

Nginx-UI 任意文件写入漏洞分析与利用 (CVE-2024-23827) 教学文档

漏洞概述

Nginx-UI是一个用于管理Nginx配置的web界面。在v2.0.0-beta.12之前的版本中,"导入证书"功能存在任意文件写入漏洞,允许攻击者将任意内容写入系统中的任意路径。通过覆盖配置文件app.ini,可以实现远程代码执行(RCE)。

影响版本

  • 受影响版本: < v2.0.0-beta.12
  • 安全版本: v2.0.0-beta.12

漏洞分析

路由分析

漏洞位于/api/cert路由,对应的处理函数是AddCert。该路由组使用了authRequired()中间件进行认证,因此这是一个需要认证的后台漏洞。

认证流程:

  1. 从请求头中读取Authorization
  2. 如果为空则读取X-Node-Secret
  3. 使用CheckToken方法进行验证
  4. 验证通过后继续处理请求

漏洞点分析

AddCert函数处理添加新证书的请求,关键问题在于:

  1. 接收用户提供的ssl_certificate_pathssl_certificate_key_path参数
  2. 接收用户提供的ssl_certificatessl_certificate_key内容
  3. 调用content.WriteFile()将内容写入指定路径

WriteFile()函数的问题:

  1. 使用os.MkdirAll创建目录(如果不存在)
  2. 使用os.WriteFile写入文件
  3. 不验证用户输入是否为合法的证书/密钥
  4. 允许写入任意路径
  5. 新建文件权限为0644(所有者读写,其他用户只读)

漏洞利用思路

1. 覆盖app.ini配置文件实现RCE

app.ini中的StartCmd参数会在程序启动时执行:

  1. 构造请求覆盖/root/nginx/app.ini文件
  2. StartCmd参数中插入恶意命令
  3. 等待程序重启时执行命令

示例请求:

POST /api/cert HTTP/1.1
Host: 127.0.0.1:9000
Authorization: <JWT>
Content-Type: application/json

{
  "name": "poc",
  "ssl_certificate_path": "/root/nginx/app.ini",
  "ssl_certificate_key_path": "/tmp/test2",
  "ssl_certificate": "[server]\r\nStartCmd = bash\r\n...",
  "ssl_certificate_key": "test2"
}

2. 写入SSH公钥实现免密登录

步骤:

  1. 本地生成SSH密钥对: ssh-keygen -t rsa -b 4096
  2. 将公钥(id_rsa.pub)写入服务器的~/.ssh/authorized_keys
  3. 使用私钥直接SSH登录服务器

3. 通过计划任务实现RCE

覆盖系统crontab文件实现命令执行:

  1. 覆盖/etc/crontab文件
  2. 添加定时执行的任务

示例crontab内容:

* * * * * root /path/to/malicious/command

修复建议

  1. 升级到v2.0.0-beta.12或更高版本
  2. 实施输入验证,确保写入的内容是合法的证书/密钥
  3. 限制可写入的路径范围
  4. 对文件操作实施更严格的权限控制

总结

该漏洞是由于缺乏对用户输入的验证和路径限制导致的任意文件写入漏洞。虽然新建文件没有执行权限,但通过覆盖关键配置文件或已有文件,可以实现远程代码执行。建议所有使用Nginx-UI的用户立即升级到安全版本。

Nginx-UI 任意文件写入漏洞分析与利用 (CVE-2024-23827) 教学文档 漏洞概述 Nginx-UI是一个用于管理Nginx配置的web界面。在v2.0.0-beta.12之前的版本中,"导入证书"功能存在任意文件写入漏洞,允许攻击者将任意内容写入系统中的任意路径。通过覆盖配置文件app.ini,可以实现远程代码执行(RCE)。 影响版本 受影响版本: < v2.0.0-beta.12 安全版本: v2.0.0-beta.12 漏洞分析 路由分析 漏洞位于 /api/cert 路由,对应的处理函数是 AddCert 。该路由组使用了 authRequired() 中间件进行认证,因此这是一个需要认证的后台漏洞。 认证流程: 从请求头中读取 Authorization 如果为空则读取 X-Node-Secret 使用 CheckToken 方法进行验证 验证通过后继续处理请求 漏洞点分析 AddCert 函数处理添加新证书的请求,关键问题在于: 接收用户提供的 ssl_certificate_path 和 ssl_certificate_key_path 参数 接收用户提供的 ssl_certificate 和 ssl_certificate_key 内容 调用 content.WriteFile() 将内容写入指定路径 WriteFile() 函数的问题: 使用 os.MkdirAll 创建目录(如果不存在) 使用 os.WriteFile 写入文件 不验证用户输入是否为合法的证书/密钥 允许写入任意路径 新建文件权限为0644(所有者读写,其他用户只读) 漏洞利用思路 1. 覆盖app.ini配置文件实现RCE app.ini中的 StartCmd 参数会在程序启动时执行: 构造请求覆盖 /root/nginx/app.ini 文件 在 StartCmd 参数中插入恶意命令 等待程序重启时执行命令 示例请求: 2. 写入SSH公钥实现免密登录 步骤: 本地生成SSH密钥对: ssh-keygen -t rsa -b 4096 将公钥( id_rsa.pub )写入服务器的 ~/.ssh/authorized_keys 使用私钥直接SSH登录服务器 3. 通过计划任务实现RCE 覆盖系统crontab文件实现命令执行: 覆盖 /etc/crontab 文件 添加定时执行的任务 示例crontab内容: 修复建议 升级到v2.0.0-beta.12或更高版本 实施输入验证,确保写入的内容是合法的证书/密钥 限制可写入的路径范围 对文件操作实施更严格的权限控制 总结 该漏洞是由于缺乏对用户输入的验证和路径限制导致的任意文件写入漏洞。虽然新建文件没有执行权限,但通过覆盖关键配置文件或已有文件,可以实现远程代码执行。建议所有使用Nginx-UI的用户立即升级到安全版本。