Linux隐藏账户指未在/etc/passwd注册、shell设为/bin/false等或通过NSS/LD_PRELOAD绕过认证的用户;需用getent passwd、进程UID比对、auditd监控及内核模块检查综合识别与关联分析。

识别Linux系统中的隐藏账户
隐藏账户通常指未在/etc/passwd中正常注册、或通过修改shell字段(如设为/bin/false或/usr/sbin/nologin)规避常规登录检查的用户。更隐蔽的情况包括:账户UID低于1000但未列在标准系统用户范围内、主目录存在但/etc/passwd无对应条目(可能被LD_PRELOAD劫持或passwd命令被替换)、或使用nsswitch.conf配置绕过本地文件认证(如集成LDAP但本地留有影子账户)。
建议操作:
- 运行getent passwd而非仅查/etc/passwd,确保覆盖NSS后端(如LDAP、NIS)返回的所有用户
- 用awk -F: '$3 筛查低UID且shell异常的账户
- 检查/etc/shadow中是否存在密码哈希但/etc/passwd无对应用户的行(需root权限)
- 比对ls -la /home/与getent passwd | cut -d: -f1,3,6,发现“有家目录却无账户记录”的可疑项
发现被隐藏的进程
隐藏进程不等于后台服务,而是通过内核模块(如LKM rootkit)、ptrace反调试、或直接hook系统调用(如sys_getdents64)从/proc和ps输出中抹除自身。常见迹象包括:ps aux与ls /proc/列出的PID数量明显不一致、top显示CPU/内存占用但ps找不到对应进程、或/proc/[pid]/下缺少exe、cmdline等符号链接。
建议操作:
- 执行ls /proc/[0-9]* 2>/dev/null | wc -l与ps aux --no-headers | wc -l对比,差值较大时需深入排查
- 用cat /proc/*/stat 2>/dev/null | awk '{print $3}' | sort | uniq -c | sort -nr | head查看状态异常(如Zombie过多)或进程状态码(第3字段)异常聚集
- 检查内核模块:运行lsmod比对已知安全基线,关注名称含hide、rootkit、ftrace或非常规字符的模块
- 使用volatility(配合内存镜像)或rekal检测内核级隐藏,适用于取证场景
建立账户与进程的关联审计
攻击者常以隐藏账户启动隐藏进程,形成持久化链路。单纯发现孤立的隐藏项意义有限,关键在于确认两者是否实际关联——例如某UID为999的账户是否正在运行一个不显示在ps中的网络监听进程。
建议操作:
- 提取所有进程的UID:ls -la /proc/[0-9]*/status 2>/dev/null | awk '/^Uid:/ {print $2,$0}' | sort -u,再与getent passwd | awk -F: '{print $3,$0}'交叉比对,定位未注册UID对应的进程
- 对可疑PID,手动检查/proc/[pid]/status中的Name、PPid、CapEff字段,并用readlink /proc/[pid]/exe尝试恢复路径(即使被unlink)
- 启用auditd持续监控敏感行为:添加规则-a always,exit -F arch=b64 -S execve -k suspicious_exec,捕获所有进程启动事件并关联uid、auid(登录原始UID)
- 定期导出ss -tulpn与lsof -i -P -n结果,结合/proc/[pid]/fd/内容,验证监听端口是否归属未知进程
加固与常态化监控要点
技术对抗是动态过程,重点不在“一次清零”,而在构建可验证的基线和快速响应能力。
- 禁用非必要内核模块加载:echo "install
/bin/true" >> /etc/modprobe.d/disable.conf ,并设置kernel.modules_disabled=1(需重启) - 部署aide或samhain对/etc/passwd、/etc/shadow、/proc/关键节点进行完整性校验
- 限制特权进程能力:用setcap替代root身份运行服务,降低提权后隐藏进程的可行性
- 将auditd日志推送至独立SIEM,设置告警规则:1小时内同一UID创建>5个异常进程,或出现cap_sys_admin能力提升事件










