在一个安静的下午,突然手机上面接收到云服务器厂商发的一条短信。短信内容为服务器疑似被木马病毒入侵,监测到病毒文件。然后我就使用FinalShell登录服务器准备进去看一看,刚登陆进去FinalShell左边监控程序显示cpu占用100%。服务器正常来说cpu只会在3%~9%之间,突然这个CPU占用率这么高,我就知道服务器真的被黑客入侵了。
发现被入侵之后,首先需要做的就是查看系统中哪一个程序占用的cpu较高。所以需要通过Linux的 top
命令进行查看。
top -c
输入上面命令,发现第一行的程序文件运行cpu占用特别大
通过上面可以清楚看到程序的运行目录,然后我发现这个程序文件是我没有见过的,也就是说我的服务器遭到黑客入侵后他在 /tmp/.local/.-/
目录里面给我植入了病毒脚本文件。然后我就进入 /tmp
目录下面查看
通过 ls
命令查看,目录中没有发现上面那个 .local
文件。这里就要注意了,在Linux中创建一个新的文件夹,并在文件夹的名称前面加上一个点(.),例如前面的 ".local"。这样该文件夹就会被视为隐藏文件夹了,所以我们要使用 ls -a
命令把隐藏文件也查看出来。重新输入命令:
ls -la
通过执行上面命令就可以发现 .local
文件夹了,然后就一鼓作气直接进入存放文件的目录。
进入之后发现有两个文件,通过名字可以看出应该一个是运行程序,另一个是配置文件。查看一下文件大小:
发现是一个大小在6.7兆的程序文件和一个几KB的配置文件,先把文件下载到本地。下载下来后我们后面在查看文件内容。目前我们首先需要把cpu占用率降下来确保服务器可以正常运行。
通过问题排查我们已经找到了黑客存放在服务器里面的病毒文件了。接下来就可以直接把 .local
文件目录删除掉,通过删除命令进行删除:
rm -rf /tmp/.local
执行命令后,再次查看 /tmp
目录。发现文件已经别删除了。
删除之后,然后在杀死该程序的运行进程。执行命令:
kill -9 30737 #30737 PID 使用top -c 命令可以查看
杀死进程后,通过 top
命令再次查看下是否还有cpu占用高的进程。
可以发现cpu占用率都不高,已经降下来了。这就说明病毒已经被处理掉了。然后在通过FinalShell左边查看CPU占用率一直稳定在 4%~6%之间。
通过上面的处理服务器已经可以正常访问了。最后还需要检查一下linux的定时任务配置信息看看黑客是否修改了定时任务脚本让程序周期性的下载病毒文件。通过 crontab
查看配置信息:
crontab -l
如果输出内容为空,说明黑客没有新增新的定时任务。下面输出的是云服务器自带的安全监控工具,没有影响。
通过上面的排查和处理病毒已经被清理干净了。接下来来看看下载到本地的病毒文件java程序和conf.json文件。java程序是经过加密过的所以看不到植入的程序内容,但是conf.json配置文件没有经过加密,是以明文方式显示的。内容如下:
{
"api": {
"id": null,
"worker-id": null
},
"http": {
"enabled": false,
"host": "127.0.0.1",
"port": 0,
"access-token": null,
"restricted": true
},
"autosave": true,
"background": true,
"colors": true,
"title": true,
"randomx": {
"init": -1,
"init-avx2": -1,
"mode": "auto",
"1gb-pages": false,
"rdmsr": true,
"wrmsr": true,
"cache_qos": false,
"numa": true,
"scratchpad_prefetch_mode": 1
},
"cpu": {
"enabled": true,
"huge-pages": true,
"huge-pages-jit": false,
"hw-aes": null,
"priority": null,
"memory-pool": false,
"yield": true,
"asm": true,
"argon2-impl": null,
"argon2": [0, 1],
"cn": [
[1, 0],
[1, 1]
],
"cn-heavy": [
[1, 0],
[1, 1]
],
"cn-lite": [
[1, 0],
[1, 1]
],
"cn-pico": [
[2, 0],
[2, 1]
],
"cn/upx2": [
[2, 0],
[2, 1]
],
"ghostrider": [
[8, 0],
[8, 1]
],
"rx": [0, 1],
"rx/wow": [0, 1],
"cn-lite/0": false,
"cn/0": false,
"rx/arq": "rx/wow",
"rx/keva": "rx/wow"
},
"log-file": null,
"donate-level": 1,
"donate-over-proxy": 1,
"pools": [
{
"algo": null,
"coin": null,
"url": "3.34.130.68:8080",
"user": null,
"pass": null,
"rig-id": "proxied-miner",
"nicehash": false,
"keepalive": false,
"enabled": true,
"tls": false,
"sni": false,
"tls-fingerprint": null,
"daemon": false,
"socks5": null,
"self-select": null,
"submit-to-origin": false
}
],
"retries": 5,
"retry-pause": 5,
"print-time": 60,
"dmi": true,
"syslog": false,
"tls": {
"enabled": false,
"protocols": null,
"cert": null,
"cert_key": null,
"ciphers": null,
"ciphersuites": null,
"dhparam": null
},
"dns": {
"ipv6": false,
"ttl": 30
},
"user-agent": null,
"verbose": 0,
"watch": true,
"pause-on-battery": false,
"pause-on-active": false
}
虽然说配置内容是明文的json格式,但是我也看不懂什么意思。然后就随便找几个字段值通过百度搜索了一下,然后就发现了一个新的知识盲区 " 门罗币-XMR ":
通过搜索发现这个病毒是一个挖矿脚本,服务器竟然被别人挖矿了... 然后就找到了一篇关于门罗币挖矿脚本的说明是B站上一个UP主写的。
以防万一后面找不到,把配置说明写到下面,原文访问地址连接:https://www.bilibili.com/read/cv8021937/
{
"api": { //请注意json是数据文件,如果没必要只填地址和矿池端口就可以了。 //双斜杠是注释。
"id": null, //Windows可用管理员模式开启挖矿软件,算力会有一定程度上的提升。
"worker-id": null // 本人为门罗技术爱好者,希望可以和大家共同进步。
},
"http": {
"enabled": false, //启用hhtp与否
"host": "127.0.0.1",
"port": 0, //端口
"access-token": null, //访问令牌
"restricted": true //受限制
},
"autosave": true, //自动保存
"background": false, //挖矿是可以选择是否隐藏窗口
"colors": true, //颜色
"title": true, //标题
"randomx": {
"init": -1, //初始化
"mode": "auto", //模式自动
"1gb-pages": true, //1g大页面
"rdmsr": true, //读寄存器
"wrmsr": true, //写寄存器
"cache_qos": false, //缓存
"numa": true,
"scratchpad_prefetch_mode": 1 //草稿行预取模式
},
"cpu": {
"enabled": true, //开启CPU与否
"huge-pages": true, //大页面
"hw-aes": null,
"priority": null, //优先级
"memory-pool": true, //内存池
"yield": true, //返回数值
"asm": true,
"argon2-impl": null, //密钥导出函数
"astrobwt-max-size": 550, //strobwt算法最大值
"astrobwt-avx2": false, //高级矢量扩展集
"rx/keva": "rx/wow"
},
"opencl": { //opencl和cuda都是显卡挖矿,显卡挖门罗不划算,显卡建议挖以太币
"enabled": false, //启用显卡与否
"cache": true,
"loader": null,
"platform": "AMD", //AMD平台
"adl": true,
"cn/0": false,
"cn-lite/0": false
},
"cuda": {
"enabled": false, //启用显卡与否
"loader": null,
"nvml": true, //英伟达平台
"cn/0": false,
"cn-lite/0": false
},
"donate-level": 0, //捐赠等级
"donate-over-proxy": 0, //委托捐赠
"log-file": null, //日志文件
"pools": [ //矿池
{
"algo": null, //算法
"coin": null, //币种
"url": "mine.c3pool.com:13333", //矿池及端口
"user": "8B5mvT1wDJXQK8o9gL1NABd1AyCpK7fZ6bpAADjG6ZqMKTuJ4q44JZSPyPZzcoXohXcXGDVUsY2LU8w7Tt6AwAjt83Y1HFe", //自己钱包地址
"pass": "4710~rx/0", //挖矿机器名字 ~rx/0为固定门罗算法挖矿 ~之前是机器名字,之后是币种算法
"rig-id": null,
"nicehash": false,
"keepalive": false, //保持在线
"enabled": true,
"tls": false, //传输层安全
"tls-fingerprint": null, //传输层安全指纹
"daemon": false,
"socks5": null, //代理
"self-select": null //自选项
}
],
"print-time": 60, //60秒显示一次在cmd里面
"health-print-time": 60, //正常显示算力
"retries": 5, //重试
"retry-pause": 5, //重试暂停
"syslog": false, //系统日志
"tls": { //传输层安全
"enabled": false, //启用传输层安全与否
"protocols": null, //协议
"cert": null, //证书
"cert_key": null, //证书密钥
"ciphers": null, //密码
"ciphersuites": null, //密码套件
"dhparam": null //密钥交换
},
"user-agent": null, //用户代理
"algo-perf": { //各个币种算法的算力大小
},
"pause-on-battery": false //使用电池时是否暂停
}
然后我们根据脚本说明来看上面的conf.json文件。然后就发现了矿池及端口:
通过使用IP查询软件我们查看下IP地址所在地区,然后发现:
通过上图可以看到这个IP地址在韩国,虽说知道了IP地址。但是...然后呢,然后就没有然后了,到这里病毒排查过程就结束了。
希望上面的内容对大家有所帮助,通过遇到的这个问题,让我也得到反思。以后在项目开发的同时也需要去关注如何增加服务器的安全性,以防止这些病毒的再次入侵。这次之所以让病毒入侵我觉得很大的可能是服务器开放了一些比较固定的一些中间件和软件端口号导致的。所以我们在部署中间件的时候最好要改一下中间件启动的默认端口号,或者不把任何端口号暴漏在公网下面。