Linux权限体系:UGO模型、特殊权限(SUID/SGID)与提权后门
Linux权限体系:UGO模型、特殊权限(SUID/SGID)与提权后门
如果说 Windows 的权限模型是一座戒备森严、充斥着各种访问控制列表(DACL)和安全描述符的迷宫,那么传统的 Linux 权限模型(UGO)则更像是一座由三个简单数字(如 755)控制的城堡。
然而,极简并不代表安全。在 Linux 中,“一切皆文件”。这种万物归一的设计哲学,使得文件权限的微小配置失误,往往会直接导致系统最高权限(Root)的彻底沦陷。本文将结合终端命令,解剖 Linux 的 UGO 权限基础,并深入探讨红队最钟爱的提权跳板——SUID 特殊权限。
1. 基础权限基石:UGO 模型
Linux 使用 UGO (User, Group, Others) 模型来管理文件的访问权限。
💻 日常接触:拆解
ls -l的输出 当我们在终端输入ls -l时,最左侧的 10 个字符就是 Linux 安全的基石:
这 10 个字符可以拆解为四部分:
- 第一位 (
-):文件类型。-代表普通文件,d代表目录,l代表软链接,c/b代表设备文件。 - U (User,文件所有者):接下来的三位
rw-。代表文件拥有者root具备读取(r)和写入(w)权限,但不能执行(x)。 - G (Group,所属组):中间的三位
r--。代表属于shadow组的用户只具备读取(r)权限。 - O (Others,其他人):最后的三位
---。代表除了所有者和组成员之外的其他任何用户,没有任何权限。
安全关联:
/etc/shadow 文件存储着全系统用户的密码 Hash(如 SHA-512)。如果运维人员手误执行了 chmod o+r /etc/shadow(将 Others 权限赋予读取),那么任何一个通过 Web 漏洞拿到低权限 Shell 的黑客,都可以直接下载该文件进行离线暴力破解,从而获取 root 密码。
2. 突破边界的魔法:特殊权限机制
如果 UGO 限制得如此死板,那普通用户如何修改自己的密码?
普通用户运行 passwd 命令时,必须要将新密码写入 /etc/shadow 文件,但根据前面的分析,普通用户对 /etc/shadow 是绝对没有写入权限的!
为了解决这个“死锁”,Linux 引入了极其强大的特殊权限机制。
2.1 SUID (Set User ID):权限跃迁
底层逻辑:当一个可执行文件被设置了 SUID 标志后,任何用户在运行该文件时,进程的有效用户 ID (eUID) 都会瞬间提升为该文件所有者 (通常是 root) 的 ID!
💻 日常接触:查看
passwd命令的特殊权限 注意passwd所有者权限中的那个神秘的s:这里的
s替换了原本的x。当普通用户alice执行passwd时,内核会发现该文件有 SUID 标志且所有者是 root,于是内核将这个正在运行的passwd进程的权限提升为 root。这样,该进程就能合法地写入/etc/shadow了。命令执行完毕,进程销毁,权限回落。
2.2 SGID (Set Group ID) 与 Sticky Bit (粘滞位)
- SGID (
s出现在 Group 权限位):类似于 SUID,运行时继承文件所属组的权限。如果作用在目录上,则任何人在该目录下创建的新文件,都会强制继承该目录的所属组(常用于部门共享文件夹)。 - Sticky Bit (
t出现在 Others 权限位,如/tmp目录):/tmp目录的权限是777(所有人可读可写可执行),如果没有限制,黑客可以随意删除系统或其他用户放在里面的临时文件。粘滞位t的作用是:在/tmp中,只有文件的拥有者和 root 才能删除该文件,其他人只能读写自己创建的文件。
3. 渗透实战:SUID 提权与权限维持 (Backdoor)
SUID 机制虽然精巧,但如果管理员为了图方便,给一些本身就具备命令执行、文件读取能力的基础工具赋予了 SUID 权限,这就等于给黑客敞开了一扇通往 Root 的大门。
3.1 寻找目标:全盘扫描 SUID 文件
在获取了低权限 Shell 后,攻击者的第一步通常是执行以下命令,在整个文件系统中搜寻带有 SUID 且属于 root 的文件:
3.2 经典提权案例:以 find 命令为例
假设管理员为了让普通用户能全局搜索文件,脑子一热执行了 chmod u+s /usr/bin/find。
攻击者发现 find 具有 SUID 后,如何提权?
find 命令有一个极其危险的参数 -exec,它允许对找到的文件执行指定的系统命令。
由于 find 运行时是 root 权限,那么由 -exec 派生出的子进程,自然也是 root 权限!
💻 实战命令:利用 SUID find 提权
注意:现代 Bash 有一种防御机制,如果发现 eUID (有效ID) 和 rUID (真实ID) 不一致,会自动丢弃 eUID。因此提权时通常需要加上
-p参数(保持特权模式)。
其他经常被错误配置 SUID 从而沦为提权跳板的经典命令包括:vim(可在内部执行 :!/bin/sh)、nmap、awk、bash 等。
3.3 权限维持 (Root Backdoor)
如果黑客通过某个 Web 0day 漏洞拿到了 Root 权限,他需要留下一个后门,以便明天即便漏洞被修了,依然能重返系统。 最简单的 Linux 隐藏后门,就是拷贝一个 bash,赋予 SUID 隐藏起来:
第二天,黑客通过一个低权限的普通用户登录系统,只需执行 /tmp/.hidden_bash -p,瞬间重获 Root 权限!
4. 总结与防御
UGO 权限模型是 Linux 安全的基础,而 SUID/SGID 机制则是为了在严格的隔离中开辟一条业务通道。然而,滥用 SUID 无异于在堡垒中埋下地雷。
防御视角:
- 定期审计:运维人员应定期执行扫描命令,比对系统中 SUID 文件的哈希,确保没有被植入后门或错误配置。
- 挂载防御:对于无需执行程序的数据盘或临时目录(如挂载
/tmp或/var/www/uploads),在/etc/fstab中使用nosuid和noexec参数进行挂载。这样即使黑客在里面放了 SUID 后门文件,内核也会直接拒绝提升权限。
下一篇预告: SUID 提权虽然经典,但在现代 Linux 容器(Docker/Kubernetes)中,Root 权限被进一步细化了。哪怕你在容器里是 Root,也可能什么破坏都做不了! 下一篇,我们将探讨现代 Linux 认证与权限的进阶框架:PAM 认证模块 与 Capabilities 进程提权机制!