自2月21日起,青藤实验室监测到多家用户处出现了利用redis未授权访问和SSH密码登录在内网传播的恶意门罗币挖矿程序,其主要体征为系统负载升高但使用ps、top等命令排查无明显异常进程,系统netstat命令丢失,使用ss命令查看网络连接发现存在大量6379或22端口连接行为,主机关键日志被清空,crontab指向pastebin.com的规则定期执行,且无法修改或删除,青藤实验室安全团队已对相关挖矿样本进行分析。
0x01 样本介绍
Watchdogs挖矿木马通过Redis未授权访问漏洞对服务器进行入侵,然后植入挖矿程序并下载内网扫描爆破程序,通过爆破局域网中的ssh、Redis服务器或者遍历服务器.ssh/known_hosts文件中的主机实现免密登录进行横向传播。
0x02 样本特征
此木马有较强的自我隐藏能力,不易发现。主要特征为crontab中存在恶意的定时任务且无法删除;服务器明显卡顿但找不到占用CPU的进程;ldd命令查看ls等命令加载的动态链接库,加载了/usr/local/lib/libioset.so;存在恶意样本主文件/usr/sbin/watchdogs。
0x03 样本攻击流程
1. 攻击脚本
访问URL: https://pastebin.com/raw/sByq0rym ,内容为下载链接和加密方式。
利用Base64解密URL: https://pastebin.com/raw/tqJjUD9d中的内容得到如下Shell脚本,
该Shell脚本的作用为:
1) 设置环境变量
2) 写入crontab 定时任务
3) 删除本机器内其他挖矿程序或者木马程序
4) 下载相对应内核版本的执行文件
5) 利用chattr -i 解除文件锁定属性,防止在写入文件或者更改文件出现问题。
6) 读取.ssh 目录下Known_hosts中连接过的机器,尝试免密登录进行传播。
7) 清除相关的操作,比如公钥和日志文件。
2. 二进制样本主体分析
Shell脚本中的执行文件链接是一个jpg格式的图片,并且简单加壳,直接下载upx 利用 upx -d 进行脱壳,如下:
在IDA 查看脱壳之后的执行文件,发现为去除符号表的ELF文件,查看汇编特征发现是go语言编写,使用idapython执行go语言函数名还原脚本,还原出函数名,查看程序具体流程。
直接在函数列表搜索main函数,找到main_main函数,查看流程:
二进制文件首先对一系列文件进行了删除操作,包括/etc/ld.so.preload,/tmp/watchdogs,/tmp/ksoftirqds,/tmp/config.json等等。
删除后执行了Libiosetwrite函数,将libioset.so写入到/usr/local/lib下。
后面执行了github_com_hippies_LSD_LSDA_Bbgo_ptr函数,此函数会对内网主机的22端口进行暴力破解,为传播途径之一。
在函数中判断/usr/local/lib/libioset.so文件是否存在,存在则只写/etc/ld.so.proload,不存在则两个文件全部写入。
后面两个函数为主要函数,cron函数写了四个crontab定时任务,具体写入的文件目录和内容见后面分析。KsoftirqdsWriteRun函数释放并运行挖矿。
KsoftirqdsWriteRun函数释放名为ksoftirqds的矿机,和挖矿的配置文件config.json。
并用bash执行,然后删除矿机主机和配置文件。
开始挖矿后继续执行github_com_hippies_LSD_LSDA_Ago函数,此函数会调用一系列redis函数对其他主机的6379端口进行暴力破解,为传播途径之二。
最后会执行样本更新函数,并再次写入定时任务,清除其他挖矿的进程,然后退出。
更新请求的地址为https://pastebin.com/raw/**ZhQFrH。
样本写入的定时任务、创建的文件以及动态链接库功能如下。
3. 主机现象分析
样本会在服务器以下文件写入定时任务:
/var/spool/cron/root
/var/spool/cron/crontabs/root
/etc/cron.d/root
/etc/rc.d/init.d/watchdogs
样本在服务器产生的文件:
/tmp/watchdogs (启动之后自删)
/tmp/.lsdpid
/usr/sbin/watchdogs
/tmp/ksoftirqds
/usr/local/lib/libioset.so
在linux操作系统的动态链接库加载过程中,动态链接器会读取LD_PRELOAD环境变量的值和默认配置文件/etc/ld.so.preload的文件内容,并将读取到的动态链接库进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高。
将编译好的busybox加入环境变量中。
利用busybox查看/etc/ld.so.preload文件,发现里面加载一个动态库,一般没有正常需求,文件为空。
查看ls命令调用的动态链接库,增加了/usr/local/lib/libioset.so,正常命令 ls 是不加载这个链接库。
直接利用命令ls去查看/usr/local/lib目录,发现已隐藏。中招之后系统中大部分命令都预先加载/etc/ld.so.preload中的动态链接库。
用IDA打开libioset.so,查看字符串,发现恶意定时任务和其他几个进程名,查看流程发现每次执行命令都会将所有包含恶意程序相关的结果过滤掉,并重新写入crontab。
利用busybox 中的top查看CPU占用率高的进程,为/tmp/ksoftirqds,此即挖矿进程。
利用 busybox lsof -p PID,样本执行之后自删文件,
直接kill -9 命令杀掉进程,发现过一会又出现,而定时任务无法删除,原因是由于libsetio.so的存在,当使用正常命令会再写crontab规则到相关目录。
查看网络连接同样也发现样本通过爆破局域网中 Redis和ssh进行横向传播。
0x04 样本清除方法
样本利用动态链接库预加载型技术,在预加载配置文件/etc/ld.so.preload中加入动态链接库libioset.so,这个库的作用是对常见命令进行修改,比如运行ls、top、netstat等命令时会过滤或者隐藏和恶意样本相关文件,导致无法查看到文件或者进程。此时只能利用busybox来进行查看和删除相关文件。(busybox是一个编译好不需要外部的动态链接库工具)。
相关命令:所有命令都利用busybox 执行
清除加载库:
#busybox rm -f /etc/ld.so.preload
#busybox rm -f /usr/local/lib/libioset.so
清除异常进程:
# busybox ps -ef | busybox grep -v grep | busyboxegrep 'ksoftirqds' | busybox awk '{print $1}' | busybox xargs kill -9
# busybox ps -ef | busybox grep -v grep | busyboxegrep 'watchdogs' | busybox awk '{print $1}' | busybox xargs kill -9
清除相关文件:
#busybox rm -f /tmp/watchdogs
#busybox rm -f /tmp/.lsdpid
#busybox rm -f /tmp/ksoftirqds
#busybox rm -f /usr/sbin/watchdogs
清除定时任务
先停止定时任务服务:
# service crond stop
#busybox rm -f /etc/cron.d/root
#busybox rm -f /var/spool/cron/crontabs/root
#busybox rm -f /var/spool/cron/root
#busybox rm -f /etc/rc.d/init.d/watchdogs
#busybox rm -f /etc/cron.d/tomcat
# ldconfig //修改动态链接库之后需要用执行动态库执行命令
再次执行异常进程清除:
# busybox ps -ef | busybox grep -v grep | busyboxegrep 'ksoftirqds' | busybox awk '{print $1}' | busybox xargs kill -9
# busybox ps -ef | busybox grep -v grep | busyboxegrep 'watchdogs' | busybox awk '{print $1}' | busybox xargs kill -9
清理开机启动项:
# busybox ps -ef | busybox grep -v grep | busyboxegrep 'ksoftirqds' | busybox awk '{print $1}' | busybox xargs kill -9
# busybox ps -ef | busybox grep -v grep | busyboxegrep 'watchdogs' | busybox awk '{print $1}' | busybox xargs kill -9
再开启定时任务服务:
# service crond start
重启机器:
# reboot
0x05 WatchDogs挖矿木马防御及修复
1. Redis未授权访问控制:
-
设置Redis密码,添加密码验证,并重启Redis服务。
-
仅限本机及业务相关机器访问访问 Redis,并重启Redis服务。
2. 如需将连接机器的私钥存放在服务器上,建议添加密码。
3. 修改SSH弱口令,加强密码强度。
来源:freebuf.com 2019-09-09 14:52:25 by: 青藤云安全
请登录后发表评论
注册