📚 网络安全Kali学习系列 · Linux系统深度
01 环境搭建与文件权限入门 ✓ 已完成
02 SUID/SGID特殊权限与ACL(当前篇)
03 进程管理与服务管理(systemd)
04 网络配置与包管理
05 Bash脚本编写基础
06 Vim高效操作

SUID/SGID特殊权限与ACL

基础级理解Linux三种特殊权限位的工作原理,掌握SUID安全审计与ACL精细权限控制
读完本篇你将能:理解 SUID/SGID/Sticky Bit 三种特殊权限位的工作原理和安全影响,使用 find 命令审计系统中的 SUID 文件,通过 ACL(访问控制列表)实现传统 rwx 无法做到的细粒度权限控制。
📑 本文目录
01超越rwx——为什么需要特殊权限
02SUID:以所有者身份执行
03SGID:组权限继承机制
04Sticky Bit:删除保护
05SUID安全审计
06ACL访问控制列表
07动手练习

01 超越rwx——为什么需要特殊权限

上一篇你学会了 rwx 基础权限和 chmod/chown 操作。现在思考一个实际问题:普通用户 kali 执行 passwd 修改密码时,需要写入 /etc/shadow 文件——但这个文件的权限是 -rw-r----- root shadow,普通用户既不是所有者也不在 shadow 组。kali 是怎么改密码的?

答案就是 SUID——Linux 三种特殊权限位之一。传统 rwx 只能控制「谁能读写执行」,而特殊权限位能控制「以谁的身份执行」。这在安全领域至关重要:SUID 配置错误是 Linux 提权漏洞最常见的入口之一,后续模块4「漏洞利用与后渗透」中的 SUID 提权技术正是建立在本篇知识之上。

02 SUID:以所有者身份执行

SUID(Set User ID)机制就像政务大厅的服务窗口。你去办护照时,提交申请的是你本人(执行者),但盖章生效用的是工作人员的职权(文件所有者的权限)。passwd 命令就是这个窗口——你以 kali 身份运行它,但它写入 /etc/shadow 时用的是 root 的权限。

识别SUID标志

查看 passwd 命令的权限,注意所有者执行位上的字母:

Bash
# 查看 passwd 命令的权限
ls -l /usr/bin/passwd
# 输出: -rwsr-xr-x 1 root root 68208 Jul 15 10:30 /usr/bin/passwd

权限字符串 -rwsr-xr-x 中,所有者执行位不是 x 而是 s——这就是 SUID 标志。它表示「无论谁执行这个程序,进程都将以文件所有者(root)的身份运行」。

kali用户执行passwd
→
SUID触发身份切换
→
以root权限写shadow

设置与移除SUID

Bash
# 数字法设置 SUID(前缀 4)
sudo chmod 4755 /opt/myapp
# 符号法设置 SUID
sudo chmod u+s /opt/myapp
# 移除 SUID
sudo chmod u-s /opt/myapp
⚠️ 常见错误
chmod u+s 后权限显示为大写 S(-rwSr-xr-x),SUID 生效了
✓ 正确理解:大写 S 表示所有者本身没有执行权限,SUID 形同虚设——程序都无法执行,身份切换更无从谈起。必须先确保有 x 权限,小写 s 才有效。修复:chmod 4755 而非 chmod 4644。

03 SGID:组权限继承机制

SGID(Set Group ID)作用于目录时,像公司部门的共享文件柜——放进去的文件自动盖上部门章(继承目录的所属组),这样部门所有人都能按组权限访问,不需要逐个文件修改 chown。

SGID 对文件和目录的效果不同:

• 作用于文件:执行时以文件所属组身份运行(类似 SUID,但切换的是组身份)
• 作用于目录:目录内新建的文件自动继承目录的所属组(而非创建者的默认组)

实战:创建共享目录

Bash
# 创建开发团队共享目录
sudo mkdir /opt/devteam
sudo groupadd devteam
sudo chown root:devteam /opt/devteam
sudo chmod 2770 /opt/devteam

2770 中第一位 2 就是 SGID。验证效果——在共享目录中创建文件,观察所属组是否自动继承:

Bash
# 在共享目录中创建文件
cd /opt/devteam
touch test.txt
ls -l test.txt
# 输出: -rw-r--r-- 1 kali devteam 0 Aug 9 14:00 test.txt

文件所有者是 kali,但所属组是 devteam 而非 kali 的默认组——这就是 SGID 的效果。devteam 组的所有成员都能按组权限(rwx)访问这个文件,无需额外配置。

04 Sticky Bit:删除保护

Sticky Bit 像公共储物柜——所有人都能往柜子里放东西(目录有写权限),但只有自己存的东西才能取走(删除),别人的格子碰不了。Linux 中最典型的例子是 /tmp 目录。

Bash
# 查看 /tmp 目录的 Sticky Bit
ls -ld /tmp
# 输出: drwxrwxrwt 15 root root 4096 Aug 9 14:00 /tmp
# 设置 Sticky Bit
sudo chmod 1777 /opt/shared

权限字符串 drwxrwxrwt 末尾的 t 就是 Sticky Bit 标志。/tmp 权限是 1777(所有人可读写执行),但没有 Sticky Bit 的话,任何用户都能删除别人创建的临时文件——这在多用户系统中是灾难性的。

权限 数字前缀 符号法 对文件效果 对目录效果
SUID 4 u+s 以所有者身份执行 通常无意义
SGID 2 g+s 以所属组身份执行 新文件继承目录的组
Sticky 1 +t 现代系统已废弃 仅文件所有者可删除

三位特殊权限可以组合使用。例如 chmod 3770 表示同时设置 SGID(2)+ Sticky Bit(1)= 3,再加 770 基础权限。上一篇的开放挑战题正是需要 SGID + Sticky Bit 组合。

05 SUID安全审计

SUID 是双刃剑——系统需要它正常运作(passwd、sudo),但攻击者一旦找到配置不当的 SUID 程序,就能直接提权到 root。渗透测试中,进入目标系统后的第一步就是枚举 SUID 文件。使用 find 命令可以快速搜索:

Bash
# 搜索系统中所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null
# 搜索 SGID 文件
find / -perm -2000 -type f 2>/dev/null

-perm -4000 表示匹配权限中包含 SUID 位(4)的文件。2>/dev/null 将权限不足导致的错误信息丢弃,保持输出干净。安全审计时,重点关注非标准路径下的 SUID 文件:

Bash
# 搜索非标准路径的 SUID 文件(安全审计重点)
find / -perm -4000 -type f 2>/dev/null | grep -v '^/usr'
# 同时搜索 SUID 和 SGID
find / \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null

Kali 系统上常见的 SUID 程序及其安全状态:

程序路径 状态 说明
/usr/bin/passwd 正常 修改密码需写 /etc/shadow
/usr/bin/sudo 正常 提权执行命令的核心程序
/usr/bin/pkexec 需关注 PolicyKit,历史漏洞多(CVE-2021-4034)
/usr/bin/vim 高危 若有SUID,可用 :!sh 获取root shell
/usr/bin/find 高危 若有SUID,可用 -exec 执行任意命令
自定义SUID脚本 高危 Shell脚本设SUID无效,但二进制脚本极易提权
💡 小贴士
渗透测试中,枚举 SUID 文件后下一步是查阅 GTFOBins(gtfobins.github.io)——一个收录 Linux 二进制程序提权方法的数据库。例如 find 有 SUID 时,执行 find . -exec /bin/sh \; 即可获取 root shell。这个知识点将在模块4深入展开。

06 ACL访问控制列表

传统 rwx 权限有个硬伤:每个文件只能有一个所有者和一个组,无法对「特定用户」单独授权。例如你想让用户 guest 读取某个文件,但不想把 guest 加入文件所属组——传统权限做不到。ACL(Access Control List)解决了这个问题,它允许你为任意单个用户或组设置独立权限,不受 u/g/o 三组限制。

setfacl与getfacl

Bash
# 为单个用户设置 ACL 权限
sudo setfacl -m u:guest:rx /opt/devteam
# 为单个组设置 ACL 权限
sudo setfacl -m g:audit:r /opt/devteam
# 移除某用户的 ACL 条目
sudo setfacl -x u:guest /opt/devteam

-m 表示 modify(添加/修改),-x 表示 remove(移除)。格式为 u:用户名:权限 或 g:组名:权限。设置后用 getfacl 查看完整 ACL:

输出示例
getfacl /opt/devteam
# file: opt/devteam
# owner: root / group: devteam
user::rwx
user:guest:r-x
group::rwx
mask::rwx
other::---

user:guest:r-x 就是 ACL 添加的独立条目——guest 用户有读和执行权限,但不影响其他用户的权限。mask::rwx 是 ACL 掩码,限制 ACL 条目的最大权限上限——即使给 guest 设了 rwx,如果 mask 是 r-x,guest 实际只有 r-x。

💡 小贴士
ACL 设置后,ls -l 的权限字符串末尾会多出一个 + 号(如 drwxrwxr-x+),这是快速判断文件是否配置了 ACL 的方法——不需要每次都跑 getfacl。
📖 知识回顾
SUID身份切换 SGID组继承 Sticky Bit删除保护 特殊权限数字前缀4/2/1 大写S vs 小写s find搜索SUID文件 GTFOBins提权数据库 setfacl/getfacl ACL掩码mask
✏️ 动手练习
🟢 基础验证
在树莓派上执行 ls -l /usr/bin/passwd /usr/bin/sudo /usr/bin/su,找到每个文件权限字符串中的 SUID 标志(小写 s),解释为什么这三个程序需要 SUID 权限。
参考:passwd 需写 /etc/shadow,sudo 需切换用户身份,su 需切换登录会话。三者都以 root 身份运行才能完成特权操作。
🟡 组合应用
创建共享目录 /opt/audit,要求:devteam 组成员可创建文件(读写执行),audit 组成员只能读取(不可写不可执行),所有人创建的文件只有自己能删除。提示:组合使用 SGID + Sticky Bit + ACL 三种机制。
提示:chmod 3770 设置 SGID+Sticky,再用 setfacl -m g:audit:r 给 audit 组单独读权限。
🔴 开放挑战
在树莓派上执行 SUID 安全审计(搜索所有 SUID 文件),记录输出结果。然后访问 gtfobins.github.io,查阅 find、vim、python3 三个程序的 SUID 提权方法。思考:为什么 Linux 系统默认不给这些常用程序设置 SUID?这将在模块4「漏洞利用与后渗透」中深入探讨。
下篇预告
03 进程管理与服务管理(systemd)
将学习 systemd 服务管理器的核心操作——使用 systemctl 管理服务启停与开机自启,通过 ps/top/htop 监控进程状态与资源占用,使用 journalctl 查询系统日志。这些技能是后续部署安全工具(Metasploit、Burp Suite)和管理靶场环境的基础。
掌握本篇内容后,回复继续制作下一篇