服务器被植入后门:隐藏用户与SSH密钥排查

服务器被植入后门:隐藏用户与SSH密钥排查

你删除了网站上的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) ALLNOPASSWD: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-rsassh-ed25519ecdsa-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,但怀疑还有后门,就从这些文件开始检查。它们通常都是被忽视的“安全盲区”。

知识库

Linux文件查找命令对比:find、locate、which、whereis怎么用?

2026-6-24 14:34:25

实操指南知识库

服务器生命周期管理:从部署到退役的最佳实践

2025-1-17 16:06:48

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧