核心是盯住空密码、弱哈希、非预期账户三类高危信号:用awk -f: '$2 == "" {print $1}' /etc/shadow筛空密码;grep -e '^\w+:\$1\$'查md5弱哈希;awk -f: '$3 == 0 {print $1}' /etc/passwd结合shadow密码字段溯源uid 0非root账户。

排查 /etc/shadow 异常密码哈希和后门账户,核心是盯住三类高危信号:空密码、弱哈希、非预期账户。不用复杂工具,几条命令就能快速筛出问题。
先看哪些账户没设密码
空密码字段(::)意味着无需密码即可登录,风险极高。执行:
awk -F: '$2 == "" {print $1}' /etc/shadow
如果输出非空,比如显示 backup 或 test,立刻检查该账户是否合法、是否被禁用(usermod -L username)、是否 UID 为 0。注意:/etc/passwd 第二字段为空 ≠ 密码为空,真正密码在 /etc/shadow 的第二字段。
识别过时或可疑的哈希算法
现代系统应使用 $6$(SHA-512)或 $y$(Yescrypt)。老旧哈希如 $1$(MD5)已不安全,!* 表示账户被锁定或禁用,但需确认是否人为操作:
-
grep -E '^\w+:\$1\$' /etc/shadow—— 找出 MD5 哈希用户 -
grep -E '^\w+:[!*]' /etc/shadow—— 找出被锁或禁用账户,再比对/etc/passwd确认是否本应存在 - 若发现
$5$(SHA-256)或$6$是正常;$2a$或$2y$多见于旧 Debian/Ubuntu,需评估是否需升级
结合 passwd 检查 UID 0 的“影子账户”
攻击者常创建 UID 0 但非 root 的账户(如 admin、toor、rrot),并配一个看似合理的哈希。先筛出所有 UID 0 用户:
awk -F: '$3 == 0 {print $1}' /etc/passwd
再逐个查其在 /etc/shadow 中的密码字段:
while read u; do echo "$u: $(grep "^$u:" /etc/shadow 2>/dev/null | cut -d: -f2)"; done
重点看:哈希是否为空、是否为 ! 或 *(可能被禁用但账户仍存在)、是否为弱哈希。哪怕哈希看着“正常”,只要用户名不是 root,就必须人工溯源——是运维临时加的?还是 Ansible 脚本误配?或是 useradd -u 0 -o 植入的?
快速验证账户是否可登录
仅看 shadow 不够,还要确认该账户能否实际登录:
- 查 shell 是否有效:
grep "^username:" /etc/passwd | cut -d: -f7,输出不是/bin/bash、/bin/sh或/usr/bin/zsh的(如/sbin/nologin、/usr/sbin/nologin),通常不能交互式登录 - 查家目录是否存在且可访问:
grep "^username:" /etc/passwd | cut -d: -f6,然后ls -ld /path/to/home - 若账户存在、shell 可用、密码字段非空非锁,就具备登录能力,必须立即处理










