矿机排查实战
研发小伙伴反馈,他手里的服务器出问题了,负载高居不下。查看进程,发现一个进程名为 spreadQlmnop,CPU占用 395%,这是什么鬼?我告诉他,你被挖矿了。
接下来,就一步一步拆解,找到母体。
准备工作
查看进程启动路径,为 /tmp/spreadQlmnop,进程中有一个网址:pool.supportxmr.com ,先把它隔离:
echo 127.0.0.1 127.0.0.1 pool.supportxmr.com >>/etc/hosts
通过ps命令查看进程pid为13893:
ps -ef | grep spreadQlmnop
查看进程占用的资源:
lsof -p 13893
发现进程还连着一个域名的服务,继续隔离:
echo 127.0.0.1 unassigned.psychz.net >>/etc/hosts
杀掉进程:
pkill -9 -f spreadQlmnop
这就完事了?哪有这么简单,这么简单就不会给这么多人造成麻烦了。
不出意外,他一会还会启动这个进程。
要挖掉矿机,就必须找到母体,否则就会不停的下崽儿。
通常矿机的母体无外乎一下几个渠道:
- 设置开机启动
- 设置系统服务,自启
- 设置cron定时任务扫描进程,启动矿机
逐一检查吧。
查找母体
首先检查 cat /etc/crontab,就会发现:
/etc/sshd
/etc/cnet2
/etc/sshd
/etc/cnet2
*/1 * * * * /etc/wget
这是什么鬼?记住,/etc 里边没有可执行文件。接下来,马上将这几项注释掉(先别删,要不然一会你不知道要清理那些文件了)
其次,检查自启配置文件 /etc/rc.local
/etc/wget
/etc/sshd
/etc/cnet2
/etc/wget
/etc/sshd
/etc/cnet2
又是这鬼东西,前面已经使用注释保留了文件信息,这里直接删除吧。
查看init文件目录: /etc/init.d,发现一个文件:/etc/init.d/DbSecuritySpt
,奇怪的名字,打开看看:
/etc/cnet2
删掉吧。
rm /etc/init.d/DbSecuritySpt
清理现场
除了前面的母体,没有再发现其他的了,接下来清理现场:
pkill -9 -f /tmp/spreadQlmnop
pkill -9 -f /etc/wget
pkill -9 -f /etc/sshd
pkill -9 -f /etc/cnet2
删除文件:
rm -rf /tmp/*
rm /etc/wget
rm /etc/sshd
rm /etc/cnet2
当删除sshd的时候提示删除失败,去掉系统属性再试:
chattr -i /etc/sshd
rm /etc/sshd
还是提示无法删除,检查进程,发现一个可疑进程 ./sshd
,查看./sshd 的pid为1352,查看 /proc/1352/exe 这个软链,指向的目标是 /etc/sshd
,杀掉它再试:
kill -9 1352
rm /etc/sshd
cnet2 也一样:
chattr -i /etc/cnet2
rm /etc/cnet2
完事了吗?
清理完成,检查进程,还有可疑之处:
/usr/bin/.sshd
对linux比较熟悉的同学应该知道sshd进程正确的位置是 /usr/sbin/sshd(不知道也没关系,可以找一台正常的机器进行对比)。
还是有猫腻呀。(事实上母体已除,暂时安全,不过还是要尽快的清除掉才好)
pkill -9 -f /usr/bin/.sshd
rm /usr/bin/.sshd
结束战斗
检查系统状态,系统负载已经下来了,load average 等几分钟,也会慢慢下来。
Linux服务器管理建议:
不要允许使用用户名和密码登录,尤其是弱口令,简直就是天然肉鸡,取而代之使用更安全的ssh登录方式,至少也要使用 pem 密钥登录。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- IE11出现"__doPostBack”未定义
- latex()、ploy2sym()、symsum()的妙用
- 性能最佳实践:MongoDB数据建模和内存大小调整
- 节省你生命的一个小技术No.193
- K8S 生态周报| Traefik v2.3.0-rc2 发布
- 如何从 Notion 批量导出 Markdown?
- 【LeetCode】1518. 换酒问题
- OBS推流工具使用说明
- Python多进程
- app反编译遇到360加固,傻瓜式脱壳
- Java底层-本地接口(JNI)
- 如何从最坏、平均、最好的情况分析复杂度?
- 利用Python进行MR栅格数据处理
- 利用Sql处理MR栅格数据
- Netty组件之Channel注册