
你删除了网站上的WebShell,改掉了所有密码,以为安全了。几天后,黑客又来了,用同一个账号登录了你的服务器。你开始怀疑:是不是有什么后门没清理干净?
攻击者通常会在服务器上留下不止一种后门,其中最常见的是隐蔽的用户账户和你不知道的SSH公钥。这些后门很难被日志记录捕捉到,却能持续存在很久。
今天讲怎么排查这两类后门。
先看一个数据
在入侵排查过程中,找到可疑用户是常见的发现之一。其中一部分是直接从系统用户中发现的,其余是通过SSH authorized_keys文件或sudoers提权配置发现的。这些后门不是通过漏洞进来的,而是攻击者在进入后主动留下的。
清除WebShell是治标,清除这些账户后门才是治本。
排查一:检查系统用户文件
攻击者想长期控制服务器,最直接的方式是创建一个新用户,或者把一个普通用户提权成管理员。
检查/etc/passwd
这个文件记录所有系统用户。每一行代表一个用户,格式为用户名:密码占位符:UID:GID:描述:家目录:登录Shell。
bash
cat /etc/passwd
重点关注:
- UID为0的用户(root权限)。正常只有
root:x:0:0这一行。如果出现hacker:x:0:0之类的,立即处理 - 最近添加的用户。查看
/etc/passwd文件的修改时间:ls -l /etc/passwd。如果你最近没有添加用户,但文件被修改了,这就是可疑信号 - 登录Shell不是
/sbin/nologin或/bin/false的普通用户。这些用户可能有登录权限
检查/etc/shadow
这个文件存储加密后的密码哈希和密码过期信息。
bash
cat /etc/shadow
/etc/passwd是人人可读的,但/etc/shadow通常只有root可读,安全级别更高。如果攻击者修改了某个用户的密码哈希,你从/etc/passwd是看不出来的。关注最近修改的记录和异常的密码状态。
检查/etc/sudoers
bash
cat /etc/sudoers # 或 cat /etc/sudoers.d/*
/etc/sudoers定义了哪些用户可以使用sudo获得root权限。关注是否有不认识的用户被加入了ALL=(ALL) ALL或NOPASSWD:ALL。攻击者可能把普通用户加入sudoers而不创建新用户,这样他用那个普通用户登录后,直接sudo就能获得root权限。检查/etc/sudoers.d/目录下是否有额外配置文件。
排查二:检查SSH公钥
SSH密钥登录比密码登录更隐蔽。攻击者会把自己的公钥添加到~/.ssh/authorized_keys文件中,这样即使你改了密码,他仍然能用密钥登录。
bash
cat /root/.ssh/authorized_keys cat /home/*/.ssh/authorized_keys
查看每个用户的authorized_keys:
bash
for user in $(getent passwd | cut -d: -f1); do
if [ -f /home/$user/.ssh/authorized_keys ]; then
echo "=== $user ==="
cat /home/$user/.ssh/authorized_keys
fi
done
# 别忘了root
if [ -f /root/.ssh/authorized_keys ]; then
echo "=== root ==="
cat /root/.ssh/authorized_keys
fi
检查SSH配置是否允许密钥登录:
bash
grep "PubkeyAuthentication" /etc/ssh/sshd_config
如果攻击者把PubkeyAuthentication no改成了yes,即使你关了密钥登录,他也能重新开启。每行公钥通常以ssh-rsa、ssh-ed25519、ecdsa-sha2-nistp256开头,后面跟着一串字符,最后是注释(通常是邮箱或主机名)。
你如果不认识某个公钥对应的注释,把它删掉。
排查三:检查进程和网络连接
有些后门不是账户,而是进程。攻击者会运行一个监听端口的程序,你连接上去就能获得Shell。
bash
# 查看所有监听端口的进程 netstat -tunlp ss -tunlp # 查看所有进程 ps auxf
重点关注:
- 监听在非常用端口(如4444、5555、31337)的进程
- 进程名是随机字符串,或者伪装成常见系统进程(如
[kworker]但不在/proc下有对应文件) - 连接到外部IP的进程,方向为ESTABLISHED
排查四:检查定时任务
攻击者会在定时任务里留下后门,定期执行恶意脚本或重新下载木马。
bash
# 查看所有用户的定时任务
for user in $(getent passwd | cut -d: -f1); do
echo "=== $user ==="
crontab -u $user -l 2>/dev/null
done
# 查看系统级定时任务
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
如果看到陌生的定时任务,比如从某个IP下载脚本并执行,立即删除并检查对应脚本。
排查五:检查系统日志
最后一步是检查系统日志,找出攻击者什么时候进来的。
bash
# SSH登录日志
grep "Accepted" /var/log/auth.log | grep "ssh"
# 或
grep "Accepted" /var/log/secure | grep "ssh"
# 查看哪个IP尝试登录
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr
真实案例
在一个被入侵的WordPress服务器上,清理了WebShell后,黑客仍能登录。排查发现,攻击者在/etc/passwd中添加了一个名为sysadmin的用户,UID为0,并把自己生成的SSH公钥添加到了/root/.ssh/authorized_keys中。删除这两个后门后,攻击才真正停止。
最后一句
攻击者在成功入侵后,通常不会只留一个后门。他们会保留一个能随时访问的入口——可能是你不知道的用户,也可能是你忽略的SSH公钥。定期检查/etc/passwd、/etc/sudoers和每个用户的authorized_keys文件,是保持服务器安全的重要习惯。
如果你已经清理了WebShell,但怀疑还有后门,就从这些文件开始检查。它们通常都是被忽视的“安全盲区”。




