服务器被入侵后的急救记录
前言
记录一次服务器被入侵后的急救记录。第一次遇上服务器被入侵的事,觉得惊吓、紧张又有趣,一开始手足无措,依靠 AI 和社区相关博客,顺利处理完成,也得到了很重要的经验教训。
发现问题
最近发现服务器的部分服务明显卡顿,使用 top 命令观察进程:
1top -c
2PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
34135357 root 30 10 723224 146032 0 S 99.9 30.9 462:10.61 /root/.local/start/xmrig
这个名为 xmrig 的进程 CPU 占用经常达到 99%,查询得知 xmrig 是一个加密货币挖矿程序,通常用于挖掘 Monero (XMR)。可见服务器已经被入侵,被用来进行非法挖矿,这类攻击称为“加密劫持”(Cryptojacking)。这个入侵者以 root 身份执行了程序,因此要么是 root 密码在某些地方泄露了,要么是自己通过 root 跑的服务代码有病毒,当然也有可能单纯是密码被穷举出来了。
回忆后发现很久之前使用了通过 AppStore 下载的某些手机服务器管理软件管理这个服务器,在软件上输入了服务器账密,很大可能被某个软件的开发者泄漏了。
以后要非常小心不要在任何无法保证数据安全的地方输入密码,也尽量不要使用 root 账户登录 Linux 服务器。另外即使是 AppStore 下载的软件,可能也是不安全的,最好还是使用经过社区验证过的开源软件。
如果是密码泄露,那值得庆幸的是,入侵者并没有直接修改掉原始密码,或者很明显地破坏我的服务器。但是从另一个角度看,这确实让我在短时间内无法发现自己的服务器被入侵了,挖坑病毒在服务器上跑了快一个月了!之后最好得加一个服务器监控告警程序在服务器上面。
如果不是密码泄露的问题,那就是某些代码有病毒,这个比较难发现,只能在清理完病毒后持续观察了。
继续通过 top 命令观察进程,发现还有另外一个怪异的进程,CPU 占用也经常达到 99%:
1PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2518 root 20 0 10808 208 204 S 99.9 0.0 2:42.28 arpd
在正常情况下,arpd 是 Linux 上的一个合法工具,作用是缓存 ARP 表项以减少 ARP 请求,也可用于 ARP 代理,属于 iputils 套件。
个人怀疑 arqd 是否会消耗这么多资源,AI 也认为合法的 arpd 几乎不应该消耗这么多资源,可能是伪装成合法程序的恶意进程(命名为 arpd 来掩盖身份)。
重置密码
发现密码泄漏,必须马上重置密码,防止被远程自动程序继续入侵。
首先修改 root 密码:
1passwd
检查公钥列表:
1cat /root/.ssh/authorized_keys
发现确实有陌生的密钥,立马删除。
查看是否有其他陌生用户:
1cut -d: -f1 /etc/passwd
并没有发现。如果有,删除掉。
检查哪些用户有登录权限:
1grep -vE '(/false|/nologin)' /etc/passwd
没有发现陌生用户。如果有,删除掉。
如果服务器上某些文件包含了密码明文,需要及时重置,这里省略。
清除病毒
首先删除掉 xmrig 二进制执行文件,然后再 kill 掉 xmrig 进程:
1rm /root/.local/start/xmrig
2kill -9 4135357
直接 kill 会无效,因为有自启动的病毒程序在运行,所以一定要先删除 xmrig 执行文件。
接着检查 arpd 执行文件:
1dpkg -S /usr/sbin/arpd
2
3# iproute2: /usr/sbin/arpd
说明 arpd 文件确实来自于系统的官方软件包 iproute2,这在形式上是合法的。
即使它来自官方包,arpd 正常情况下几乎不会运行、也不会占用接近 100% 的 CPU。这行为极不正常,仍可能有二进制被替换或篡改的风险,攻击者可能保留了原有包元数据,但替换了实际文件内容,仅靠 dpkg -S 输出无法确认安全性。
还是直接重新安装 arpd:
1apt-get install --reinstall iproute2
这样会用官方版本覆盖掉现在的 arpd。
接着 top 持续观察,发现已经基本正常,舒服了。
检查后门
现在还不能松懈,继续检查病毒是否留有后门,比如某些自动程序可能会自动下载 xmrig 并执行。
检查相关启动文件是否有问题:
1# .*shrc
2# .*profile
3# /etc/rc.local
4
5find /root /home -type f \( -name ".bashrc" -o -name ".profile" -o -name ".zprofile" -o -name ".zshrc" \) -exec grep -i xmrig {} \;
6cat /etc/rc.local | grep xmrig
检查是否有可疑的服务:
1systemctl list-units --type=service | grep xmrig
2# grep -r xmrig /etc/systemd/system
发现有一个陌生服务 “thenorth.service”:
1ExecStart=/root/.local/start/xmrig -c /root/.local/start/config.json
可见 thenorth.service 就是攻击者伪装的 systemd 服务,执行的是 xmrig 挖矿程序。虽然 xmrig 执行文件已经删除了,但是这里还是将其删除:
1systemctl disable thenorth.service
2rm /etc/systemd/system/thenorth.service
3systemctl daemon-reload
4# 如果删除文件后,服务仍然显示存在,可以尝试清除所有 systemd 的缓存,并强制更新其配置:
5# systemctl reset-failed
检查定时任务:
1crontab -l | grep xmrig
上述步骤可能考虑不到所有地方,因此也许无法根除病毒,所以需要持续观察。
经验教训
- 不要在任何无法保证数据安全的地方输入密码;
- 尽量不要使用 root 账户登录服务器;
- 禁用密码登录服务器,只认公钥:
PasswordAuthentication no
,防止密码被穷举; - 尽量使用经过社区验证的开源软件;
- 设置服务器监控程序,及时告警;
- 要非常清楚自己服务器上跑的任何一个服务,最好列个清单;
- 最好不要在服务器上面放置过于重要或私密的东西。