UID 0 账号检查是什么
在 Linux 上决定权限的不是用户名而是 UID:UID 为 0 的账号就是 root,无论它叫什么名字。攻击者拿到 root 后最常见的做法之一,是新增一个 UID 为 0 的账号作为后门,因为这样不依赖密钥、不依赖 sudo 配置,只要口令有效就能直接拿到最高权限。检查的动作很简单,但必须做成常规项——正常的系统里 UID 0 的账号应该只有 root 一个。
基本信息
| 检查目标 | /etc/passwd 中所有 UID 字段等于 0 的账号 |
|---|---|
| 正常基线 | 只有 root 一行(部分发行版另有同步账号,需按本单位基线确认) |
| 可疑特征 | 别名 UID 0 账号、UID 0 且登录 shell 可用、UID 0 且家目录是新建的 |
| 查看命令 | awk 按字段过滤、getent passwd 取合并结果 |
| 权限要求 | 读取 /etc/passwd 无需特权;配合查看 /etc/shadow 需要 root |
| 辅助对比 | Debian 系保留 /etc/passwd- 上一版备份,可直接 diff 出改动 |
典型使用场景
- 确认主机是否被留下 root 等价的后门账号
- 排查账号异常告警,判断新增账号是否具备最高权限
- 做账号基线时留存 UID 0 与高权限账号清单
- 与 SSH 密钥、sudoers 检查一起做,构成完整的提权后门排查
- 清理前对照 passwd 的备份文件,确认哪些行是入侵后新增的
列出全部 UID 0 账号
列出全部 UID 0 账号
awk -F: '$3==0 {print $1, "uid="$3, "shell="$7}' /etc/passwd # 本机账号
getent passwd | awk -F: '$3==0 {print $1, $3, $7}' # 含 LDAP 等目录服务账号
awk -F: '($2=="") {print $1, "口令字段为空"}' /etc/passwd # 顺带查空口令字段
diff /etc/passwd- /etc/passwd 2>/dev/null | head -n 20 # Debian 系对比上一版
sudo awk -F: '$3==0 {print $1}' /etc/shadow | while read u; do passwd -S "$u"; done # 看口令状态
ls -lt --time-style=full-iso /etc/passwd /etc/shadow # 文件改动时间是否可疑passwd 七字段读法
| 字段 | 含义 | 异常信号 |
|---|---|---|
| 用户名 | 登录名 | 仿冒 root 的名字,如 root0、r00t、adm1n |
| 口令占位 | 通常为 x 或占位符,真实哈希在 shadow | 此处直接出现哈希,说明被改成旧式格式或被替换 |
| UID | 用户标识,0 即 root | 出现除 root 之外的第 2 个 0 |
| GID | 主组标识 | UID 0 但 GID 指向非常规组,可能是手工构造的 |
| 注释 | 描述字段,可随意填写 | 写着系统服务名称但实际能登录 |
| 家目录 | 登录后的起始目录 | 指向新建的陌生目录,或与账号创建时间一致 |
| 登录 shell | 登录后使用的 shell | 系统类账号却配置了可交互 shell,需要解释来源 |
只查 /etc/passwd 不够:接入 LDAP、NIS 或 sssd 的机器,账号来自目录服务,必须用 getent passwd 取合并结果才能看全;只按本地文件判断会漏掉目录侧被添加的高权限账号。
别名账号往往有讲究:名字做成像系统账号(如 systemd-、dbus- 前缀),注释字段写成服务描述,用来骗过肉眼与粗略的脚本检查。所以判定必须基于 UID 与 shell,而不是名字看起来像不像系统账号。
处置与留证
处置与留证
sudo cp -a /etc/passwd /etc/shadow /evidence/ # 先留证
sudo grep -n '可疑账号名' /etc/passwd | tee -a /evidence/passwd_hit.txt
sudo passwd -l 可疑账号名 # 先锁口令,避免误删影响排查
sudo userdel -r 可疑账号名 # 确认无业务依赖后再删除
sudo pkill -KILL -u 可疑账号名 # 清除该账号仍存活的进程
sudo ls -la /home/可疑账号名 /root/.ssh # 复查家目录与密钥文件删除账号前先把它的家目录打包留证:命令历史、脚本、工具与下载的载荷都在里面,删掉后就再也看不到它做过什么。
权限不只体现在 UID:把账号加入 wheel、sudo 或其他具备 sudo 授权的组,效果接近 root。检查 UID 0 的同时要顺手核对 /etc/group 里这些组的成员名单,否则会漏掉组授权这条同样有效的提权路径。
做完清单要落到流程里:把 UID 0 账号核对与 sudo 组核对固定成每日或每周的巡检项,并保留每次结果。一次性的排查只能发现当下问题,多数后门是在日常巡检的差异比对里被发现的。