Skip to content
返回

记一次服务器被挖矿病毒入侵的经历

太长不看版

能力有限,实在无法确定黑客是通过什么途径入侵的,所以只能亡羊补牢了,见服务器被入侵之后

经过这件事,收获很多:

愿大家的服务器都平平安安。🙏


12 月 7 号上午 11 点醒来,习惯性地打开手机查看消息,看到我的服务器厂商在凌晨 4 点给我发了条短信:检测到挖矿病毒,已删除。

当时心里一紧,但想着既然已经删了应该没事了吧?结果试了一下,我的服务崩了,SSH 连不上,云厂商的网页控制台也登不进去。看了一眼监控面板,凌晨 6 点的时候 CPU 从 2% 飙到 100%,内存从 84% 干到 97%,然后 6 点半开始就失联了。

我立刻意识到:这事儿没那么简单。

紧急应对

先重启了服务器,一切恢复正常。松了口气的同时,更多的疑问涌上心头:

  1. 黑客是怎么进来的?
  2. 我的数据有没有泄露?
  3. 还有没有留后门?

我首先联系了售后,得到的答复是 12 月 5 日下午 4 点半的时候有人执行了一条远程拉取病毒的命令,而我的备份是在这之前的,所以看来这台服务器是不能用了。

迁移数据到新服务器

被入侵的服务器是一台轻量数据服务器,不支持自动定时备份数据,而手动备份太麻烦,所以这一次我买了云服务器,然后把数据和服务迁移了过去。完事后测试了下,一切正常。

数据有没有泄漏?

分析了一下监控,可以看到这些异常波峰:

在近 7 天的监控数据中,公网出流量始终保持在正常水平。在 12 月 7 号凌晨 4 点资源占用量飙升的那一刻起到 7 点时,公网出流量还跟往常差不多,但 8 点开始,下降到只有每小时 1 MB 流出,直到 11 点我重启了服务器之后再次恢复正常水平。猜测我的服务是在 8 点中断的,然后出去的那几 MB 数据估计是病毒在往外发挖矿数据。

但好消息是,能看出来黑客并没有转移服务器内的数据(比如拖库),好像真的就只是进来挖了个矿。

艰难的排查之路

虽然黑客很有可能会清除自己的痕迹,但我还是检查了一下看看有没有可疑的记录。

第一个怀疑:SSH 密钥泄露了?

虽然我出售前做了还原,但会不会是旧电脑上的 SSH 私钥泄露了?

查看 SSH 登录记录:

last -f /var/log/wtmp | head -50

所有登录记录都是我自己的 IP,没有陌生地址。再看失败的登录尝试:

lastb -f /var/log/btmp | head -50

确实有大量的暴力破解尝试,但都失败了。

检查 authorized_keys,只有一个密钥,最后修改时间是 2024 年 10 月 3 日,一直没被动过。

第二个怀疑:数据库暴露在公网?

我的数据库没有设置密码(因为觉得在 Docker 内网里应该安全),会不会是端口不小心映射出去了?

docker port my_db  # 没有输出
netstat -tulnp | grep 10932    # 也没有

数据库的端口确实没有暴露到公网,只在 Docker 内网可访问。

第三个怀疑:有人创建了后门账户?

cat /etc/passwd | grep -E "/bin/bash$|/bin/sh$"

只有两个账户:rootlighthouse(应该是轻量应用服务器的监控用户),都是正常的。再看 sudo 权限配置,也没有异常。

第四个怀疑:定时任务被植入后门?

crontab -l

只有云厂商自己的定时任务:

*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'

检查了系统的各种定时任务目录,也没发现异常。

第五个怀疑:API 接口漏洞?

黑客似乎不是通过 SSH 或者后门进来的,但售后说 12 月 5 号下午 4 点半有人执行了恶意命令,而那段时间并没有人登录过 SSH,确认一下。

查看当天的 SSH 认证日志:

grep "Dec  5 16:" /var/log/secure | grep -E "Accepted|Failed"

16:30 前后确实没有任何 SSH 登录记录。难道黑客是通过我的 API 漏洞进来的?

排查过程中有个有意思的发现。我看到 12 月 5 日 16:02 有 SSH 登录和 Docker 容器操作的记录,心想:难道是黑客用我的密钥登录了?

仔细一看Docker镜像列表:

my-api    latest    2025-12-06 01:36:17 +0800 CST  ← 我 12 月 6 日部署的
<none>    <none>    2024-12-05 16:02:40 +0800 CST  ← 这是去年的!

虚惊一场,原来那是去年(2024年)12 月 5 日的记录,不是今年的。当时还以为自己记错了时间,差点把自己吓一跳。

前面都是在 Cherry Studio 跟 AI 对话的方式来一步步排查的,但是既然涉及到代码,我就转为使用 Claude Code 了。

Claude Code 先是检查了一遍我的代码,发现 npm audit 显示有几个 NPM 包有比较严重的漏洞,可能会导致这个问题发生,但是我让它生成一段代码来重现,却始终不能成功入侵我的服务器。

在这个过程中,我寻思是不是可以让 Claude Code 自己连上我的服务器做检查,试了一下还真可以。我就看着它一步步检查我之前在服务器内检查过的地方:SSH 日志、SSH 密钥、各个地方的定时任务、/temp 目录、Docker 日志等,context 都跑满了,但结论还是没有找到可疑的地方。

同时,我也抛出了自己的疑问:就算黑客是通过 API 接口入侵的,但是 API 服务运行在 Docker 当中,黑客是怎么跳出 Docker 在我的服务器上运行命令的?得到的回答是 Docker 本身也会有漏洞,导致黑客可以逃逸出来。


分享这篇文章:

上一篇
服务器被入侵之后
下一篇
opcode 运行终端命令时报错“command not found: npm”