客户在福建泉州市晋江市做鞋服电商,有天早上发现服务器特别卡,SSH连上去敲命令都要等好几秒才有反应。用top一看,CPU使用率100%,有个进程名叫systemd-network占满了所有核心。
这个进程名字看起来像是系统进程,但正常情况下的systemd-network不会占用这么高的CPU。用ps aux | grep systemd-network看了一下进程路径,发现它运行在/tmp/.X11-unix/目录下,这个目录正常情况下是用来放X11套接字的,不是放可执行文件的地方。基本确定是被植入了挖矿木马。
排查入侵途径
先看这个木马是怎么进来的。检查了nginx访问日志,发现几天前凌晨三点多,有一个POST请求打到了/wp-admin/admin-ajax.php,payload里包含了文件写入的操作。客户的网站是WordPress,用的一个插件是旧版本,存在远程代码执行漏洞,黑客利用这个漏洞在服务器上写入了webshell,然后通过webshell下载并执行了挖矿脚本。
清除过程
第一步,杀掉挖矿进程。用kill -9把那个伪装的systemd-network进程杀掉,但没过几分钟它又自动启动了。说明有定时任务或者守护进程在持续拉起。
第二步,检查定时任务。用crontab -l看了一下,果然有一条不认识的定时任务,每五分钟执行一次/tmp/.X11-unix/run.sh。把这个定时任务删掉,然后把/tmp/.X11-unix/目录整个删除。
第三步,清理webshell。检查网站目录下的所有PHP文件,找那些最近被修改过的可疑文件。在/wp-content/uploads/目录下发现了一个2024.jpg,但用file命令查看发现它实际上是一个PHP文件,内容是base64编码的一句话木马。删除这个文件,同时检查了同目录下有没有其他隐藏的webshell,全部清掉。
第四步,排查系统层面的后门。检查了/etc/ld.so.preload和/etc/profile.d/目录下有没有异常文件,这些地方经常被用来做持久化。检查结果没有发现异常,说明入侵者只用了定时任务做持久化。
顺手加固的几个地方
木马清除之后,对服务器做了一些加固:
一是把WordPress插件全部更新到最新版。这次入侵就是通过一个旧版插件的漏洞进来的,更新之后漏洞就补上了。跟客户说明情况后,把所有能更新的插件都更新了一遍,不常用的插件直接停用或卸载。
二是改了网站后台的登录地址。WordPress默认的后台路径是/wp-admin,换成自定义路径,能挡掉大量自动扫描工具。
三是在宝塔面板里开启了网站防篡改功能。把核心目录的写入权限限制住,即使再有漏洞,攻击者也无法写入新的webshell。
四是修改了MySQL数据库密码。检查数据库里没有新增的异常用户,但还是顺手改了密码,确保数据库层面的安全。
客户那边的情况
客户在晋江做鞋服电商已经好几年了,网站主要用来展示产品和接受批发订单。他平时不怎么关注服务器,这次要不是CPU一直100%导致网站卡顿,可能还不知道被挖矿了。
他问这个挖矿脚本会不会把数据偷走,我说挖矿脚本主要是消耗CPU挖虚拟货币,不偷数据,但也说明服务器已经被入侵了,数据是否安全取决于入侵者有没有额外操作。建议他做好数据备份,以备不时之需。
后续观察
清理完之后继续观察了两天,CPU使用率恢复正常,挖矿进程没有再出现。把宝塔面板的防火墙规则重新梳理了一遍,只开放了必要的端口,关闭了不必要的服务。
客户问以后怎么防止再发生类似的事情。我说有几个最基本的:
一是定期更新软件版本,CMS、插件、框架、系统补丁都要保持最新。这次的事故如果插件及时更新了,根本不会发生。
二是尽量减少不必要的插件和第三方代码,每多一个插件就多一个潜在漏洞。
三是开启宝塔面板的自动备份功能,每天备份网站文件和数据库到云端,万一哪天需要恢复数据也能从容应对。
一点小结
挖矿木马不会直接破坏数据,但它占用大量资源,把正常业务拖垮。更严重的是,能被植入挖矿木马说明服务器存在漏洞,今天能进来挖矿,明天就能进来干别的。遇到这种情况,除了清理木马本身,一定要排查清楚入侵途径并堵上,不然清理了也没用。
如果你也遇到CPU异常升高的情况,可以先检查有没有不认识的可疑进程,看看定时任务里有没有异常的条目,再检查网站目录下有没有近期被修改过的可疑文件。这几个地方查一遍,大部分挖矿木马都能发现。
