1.nginx降权
1.1 capabilities的介绍与运用
1.2 用普通用户启动nginx
1.3 root用户权限赋予
1.4 查看普通用户的nginx权限
1.5 查看nginx的欢迎网页
2.nginx与php的相互匹配
2.1 安装php及php-fpm包
2.2 检查php-fpm服务运行状态
2.3 php-fpm上的配置
2.4 nginx上的配置
2.4 检测nginx与php是否匹配成功
1.nginx降权
1.1 capabilities的介绍与运用
在Linux内核2.2之前,为了检查进程权限,将进程区分为两类:特权进程(euid=0)和非特权进程。特权进程(通常为带有suid的程序)可以获取完整的root权限来对系统进行操作,但是如此操作会导致普通用户的权限过大,使得攻击者也会拥有重要进程的root权限,十分危险。
在linux内核2.2之后引入了capabilities机制,来对root权限进行更加细粒度的划分。如果进程不是特权进程,而且也没有root的有效id,系统就会去检查进程的capabilities,来确认该进程是否有执行特权操作的的权限。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
注意:如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。
可以通过man capabilities来查看具体的capabilities。
capability名称 | 描述 |
---|---|
CAP_AUDIT_CONTROL | 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则 |
CAP_AUDIT_READ | 允许通过 multicast netlink 套接字读取审计日志 |
CAP_AUDIT_WRITE | 将记录写入内核审计日志 |
CAP_BLOCK_SUSPEND | 使用可以阻止系统挂起的特性 |
CAP_CHOWN | 修改文件所有者的权限 |
CAP_DAC_OVERRIDE | 忽略文件的 DAC 访问限制 |
CAP_DAC_READ_SEARCH | 忽略文件读及目录搜索的 DAC 访问限制 |
CAP_FOWNER | 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制 |
CAP_FSETID | 允许设置文件的 setuid 位 |
CAP_IPC_LOCK | 允许锁定共享内存片段 |
CAP_IPC_OWNER | 忽略 IPC 所有权检查 |
CAP_KILL | 允许对不属于自己的进程发送信号 |
CAP_LEASE | 允许修改文件锁的 FL_LEASE 标志 |
CAP_LINUX_IMMUTABLE | 允许修改文件的 IMMUTABLE 和 APPEND 属性标志 |
CAP_MAC_ADMIN | 允许 MAC 配置或状态更改 |
CAP_MAC_OVERRIDE | 忽略文件的 DAC 访问限制 |
CAP_MKNOD | 允许使用 mknod() 系统调用 |
CAP_NET_ADMIN | 允许执行网络管理任务 |
CAP_NET_BIND_SERVICE | 允许绑定到小于 1024 的端口 |
CAP_NET_BROADCAST | 允许网络广播和多播访问 |
CAP_NET_RAW | 允许使用原始套接字 |
CAP_SETGID | 允许改变进程的 GID |
CAP_SETFCAP | 允许为文件设置任意的 capabilities |
CAP_SETPCAP | 参考 capabilities man page |
CAP_SETUID | 允许改变进程的 UID |
CAP_SYS_ADMIN | 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
CAP_SYS_BOOT | 允许重新启动系统 |
CAP_SYS_CHROOT | 允许使用 chroot() 系统调用 |
CAP_SYS_MODULE | 允许插入和删除内核模块 |
CAP_SYS_NICE | 允许提升优先级及设置其他进程的优先级 |
CAP_SYS_PACCT | 允许执行进程的 BSD 式审计 |
CAP_SYS_PTRACE | 允许跟踪任何进程 |
CAP_SYS_RAWIO | 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备 |
CAP_SYS_RESOURCE | 忽略资源限制 |
CAP_SYS_TIME | 允许改变系统时钟 |
CAP_SYS_TTY_CONFIG | 允许配置 TTY 设备 |
CAP_SYSLOG | 允许使用 syslog() 系统调用 |
CAP_WAKE_ALARM | 允许触发一些能唤醒系统的东西(比如 CLOCKBOOTTIMEALARM 计时器) |
由于这里我们的目标是为nginx降权,所以我们这里主要使用的capabilities指令为CAP_NET_BIND_SERVICE 用它绑定 nginx 的端口赋予普通用户nginx的端口权限。(nginx的默认端口为80)
1.2 用普通用户启动nginx
现在在普通用户的 /www/env/nginx/sbin目录即 nginx安装目录下无法启动nginx服务说明,说明现在普通用户没有nginx的使用权限。
1.3 root用户权限赋予
指令:setcap CAP_NET_BIND_SERVICE=eip nginx
使用 getcap 指令查看nginx的端口权限绑定成功
注意:这里要更改nginx的所属关系为普通用户
1.4 查看普通用户的nginx权限
用普通用户启动nginx
查看nginx程序的进程都为普通用户创建
说明nginx的降权操作成功
1.5 查看nginx的欢迎网页
2.nginx与php的相互匹配
2.1 安装php及php-fpm包
apt install phpapt install php-fpm
2.2 检查php-fpm服务运行状态
systemctl status php8.1-fpm
2.3 php-fpm上的配置
在php的安装目录下找到 php/8.1/fpm/pool.d/www.conf 的配置文件打开
修改php监听的端口号为本机的9000端口
取消所选框字段的注释 listen.allowed_clients 字段是允许监听的服务端,这里设为只允许本机监听,否则会触发 php-fpm服务的未授权访问漏洞。
2.4 nginx上的配置
在nginx的安装目录下找到 nginx/conf/nginx.conf 的配置文件打开
找到所选框内关于与php相互匹配的注释,将注释取消,开通二者的匹配关系。
2.4 检测nginx与php是否匹配成功
在nginx/html 的目录下创建一个 index.php 文件:
文件内容:
<?phpphpinfo()?>
从浏览器的nginx界面打开 index.php 文件
成功标志着nginx与php相互匹配成功。