本章学习目标

  1. 掌握 Linux 系统的底层核心机制:进程管理、文件系统、SUID/SGID、Capabilities、权限模型的底层工作原理

  2. 从红队视角,挖掘 Linux 权限机制的可利用缺陷,理解本地提权的底层逻辑

  3. 复现 SUID 提权、sudo 提权两种最常用的 Linux 本地提权攻击,理解提权的实现过程

  4. 编写自动化的 Linux 权限检查脚本,帮助红队在拿到普通用户 Shell 后,快速发现可利用的提权点

  5. 梳理 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 系统的核心,正常的进程管理,是用来管理系统的进程的资源、权限的,但是,从红队的视角,进程管理,有很多可利用的点:

  1. ptrace 机制:ptrace 是 Linux 的进程跟踪机制,正常的作用,是用来调试进程的,但是,红队可以利用 ptrace,注入到其他进程,读取进程的内存,获取进程的凭据,比如,进程的密码、Token,甚至,修改进程的代码,执行任意代码。

  2. 进程权限继承:Linux 的进程,会继承父进程的权限,比如,root 的进程,创建的子进程,默认也是 root 权限,红队可以利用这个,比如,通过 root 的进程,创建一个 root 的 shell,实现提权。

  3. 进程环境变量:进程的环境变量,是可以被用户控制的,红队可以利用环境变量,劫持进程的执行,比如,修改 PATH 环境变量,让 SUID 的进程,执行恶意的程序,实现提权。

  4. 定时任务进程:Linux 的定时任务 cron,是 root 运行的,红队如果可以修改定时任务的脚本,就可以让 root 执行恶意的代码,实现提权。

4.1.2 文件系统:红队的文件攻击面

Linux 的文件系统,是 Linux 系统的存储核心,正常的文件系统,是用来管理文件的权限的,但是,从红队的视角,文件系统,有很多可利用的点:

  1. 敏感文件权限:很多系统的敏感文件,比如,/etc/shadow,存储了用户的密码 Hash,.ssh 目录,存储了 SSH 的密钥,如果这些文件的权限不当,普通用户可以读取,红队就可以拿到用户的凭据,实现提权或者横向移动。

  2. 配置文件权限:很多系统的配置文件,比如,/etc/sudoers,定时任务的脚本,服务的启动脚本,如果这些文件的权限不当,普通用户可以修改,红队就可以修改配置,让 root 执行恶意的代码,实现提权。

  3. 挂载选项绕过:很多分区,会挂载 noexec、nosuid 的选项,禁止执行程序,禁止 SUID,但是,红队可以利用一些方法,绕过这些限制,比如,通过共享库,执行代码,或者,通过内核的漏洞,重新挂载分区。

  4. 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 权限,是让文件执行的时候,以文件的所属组的权限运行,而不是执行用户的组的权限。

Linux-文件特殊权限:SUID,SGID,SBIT-CSDN博客

红队可利用点

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 的权限运行,实现提权。

SUID提权教程-CSDN博客

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 权限,这样,就可以限制进程的权限,提高系统的安全。

Linux中的SetUid和capability权能机制_setuid capability-CSDN博客

红队可利用点

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 提权,步骤如下:

  1. 查找系统中的 SUID 文件 首先,我们用普通用户的身份,登录系统,然后,查找系统中的 SUID 文件,执行:

    1. find / -perm -u=s -type f 2>/dev/null
    2. 这个命令,会查找所有的,设置了 SUID 位的二进制文件,我们可以找到,比如,find 命令,是 root 的 SUID 文件,权限是rwsr-xr-x,属主是 root。

  2. 利用 SUID 的 find 命令提权 找到 find 的 SUID 文件后,我们就可以利用 find 的 - exec 参数,执行任意的命令,执行:

    1. find / -exec /bin/sh \;
    2. 这个命令,会让 find,执行 /bin/sh,而 find 是 root 的 SUID 文件,所以,/bin/sh,就会以 root 的权限运行,我们就拿到了 root 的 shell。

  3. 验证提权效果 执行完命令后,我们可以执行:

    1. id
    2. 我们可以看到,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 最常用的权限管理工具,也是红队提权的常用攻击面。

  1. 查看当前用户的 sudo 权限 首先,我们用普通用户的身份,执行:

    1. sudo -l
    2. 这个命令,会查看当前用户,被允许运行哪些 sudo 的命令,我们可以看到,比如,当前用户,被允许以 root 的身份,运行 vim 命令,而且,不需要密码(NOPASSWD)。

  2. 利用 sudo 的 vim 提权 然后,我们执行:

    1. sudo vim
    2. 这个时候,vim 就会以 root 的权限运行,然后,我们在 vim 里,输入:

    3. :!/bin/sh
    4. 然后,回车,我们就拿到了 root 的 shell,提权成功。

  3. 验证提权效果 同样的,我们执行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 之后,需要快速的检查系统的权限,找到可利用的提权点,手动检查太麻烦了,所以,我们可以编写一个自动化的权限检查脚本,自动的检查所有的可利用点,步骤如下:

我们编写的脚本,会自动检查:

  1. 系统中的 SUID 文件

  2. 系统中的 SGID 文件

  3. 系统中的 Capabilities 权限

  4. 当前用户的 sudo 权限

  5. 敏感文件的权限,比如,/etc/shadow、.ssh 目录

  6. 定时任务的配置

  7. 系统的版本信息,用来查找内核提权漏洞

脚本的代码如下:

#!/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/SGIDSUID 提权root 的 SUID 文件存在可利用的漏洞本地提权普通用户提权到 root
SUID/SGID环境变量劫持SUID 文件调用了 system 函数,可修改 PATH本地提权劫持 SUID 进程的执行,提权到 root
CapabilitiesCapabilities 提权进程拥有高权限的 Capabilities,比如 CAP_SETUID本地提权普通用户提权到 root
sudosudo 提权sudo 允许运行的命令存在可利用的漏洞本地提权普通用户提权到 root
文件权限配置文件权限不当普通用户可修改 root 的配置文件,比如 sudoers、cron 脚本本地提权修改配置,让 root 执行恶意代码
文件权限敏感文件泄露普通用户可读取敏感文件,比如 /etc/shadow、SSH 密钥凭据窃取 / 提权获取用户凭据,提权或者横向移动
进程管理ptrace 注入普通用户可 ptrace root 进程本地提权注入 root 进程,执行任意代码
进程管理定时任务滥用普通用户可修改 cron 的脚本本地提权让 root 定时执行恶意代码
权限模型SELinux 绕过SELinux 策略存在可利用的缺陷本地提权绕过 MAC 的限制,执行 root 命令

本章小结

本章,我们从红队的视角,深入学习了 Linux 的权限机制,跳出了正常的权限管理的认知,重点挖掘了权限机制的可利用缺陷:

  1. Linux 的核心权限机制,包括进程管理、文件系统、SUID/SGID、Capabilities、权限模型,每个机制,都存在红队可利用的缺陷,是本地提权的核心攻击面。

  2. SUID 和 sudo,是最常用的本地提权的攻击面,普通用户可以利用有漏洞的 SUID 文件,或者 sudo 允许的命令,提权到 root,我们也复现了这两种提权的过程。

  3. 我们编写了自动化的 Linux 权限检查脚本,红队可以用这个脚本,在拿到普通用户的 Shell 之后,快速的检查系统的权限,找到可利用的提权点,提高渗透的效率。

  4. 我们整理了 Linux 权限机制的完整攻击面,梳理了每个攻击的利用条件和应用场景,为 Linux 本地提权、内网渗透打下了基础。

课后思考题

  1. 为什么 SUID 权限可以用来提权?它的底层原理是什么?是不是所有的 SUID 文件都可以用来提权?

  2. Capabilities 的细粒度权限,为什么还会被用来提权?比如 CAP_SETUID,为什么可以直接提权到 root?

  3. 尝试复现环境变量劫持的 SUID 提权,看看能不能利用 PATH 劫持,提权到 root。

  4. 尝试扩展我们的权限检查脚本,添加内核漏洞的检查,比如,检查系统的版本,匹配已知的内核提权漏洞。

  5. 为什么 SELinux 这种强制访问控制,还是会被绕过?红队可以怎么绕过 SELinux 的限制?

拓展阅读

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐