freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

watchdogs变种挖矿木马分析
2019-09-09 14:52:25

深圳站-620.jpg

自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 ,内容为下载链接和加密方式。

1568011780_5d75f604d2cb1.png

利用Base64解密URL: https://pastebin.com/raw/tqJjUD9d中的内容得到如下Shell脚本,

1568011785_5d75f609e3903.jpg

1568011793_5d75f6110edd8.jpg

该Shell脚本的作用为:

1)     设置环境变量

2)     写入crontab 定时任务

3)     删除本机器内其他挖矿程序或者木马程序

4)     下载相对应内核版本的执行文件

5)     利用chattr -i  解除文件锁定属性,防止在写入文件或者更改文件出现问题。

6)     读取.ssh 目录下Known_hosts中连接过的机器,尝试免密登录进行传播。

7)     清除相关的操作,比如公钥和日志文件。

2.  二进制样本主体分析

Shell脚本中的执行文件链接是一个jpg格式的图片,并且简单加壳,直接下载upx 利用 upx -d  进行脱壳,如下:

1568011801_5d75f6193572a.jpg

在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端口进行暴力破解,为传播途径之一。

1568011808_5d75f62000a39.jpg

在函数中判断/usr/local/lib/libioset.so文件是否存在,存在则只写/etc/ld.so.proload,不存在则两个文件全部写入。

1568011814_5d75f62602eff.jpg

后面两个函数为主要函数,cron函数写了四个crontab定时任务,具体写入的文件目录和内容见后面分析。KsoftirqdsWriteRun函数释放并运行挖矿。

1568011820_5d75f62c9413a.png

KsoftirqdsWriteRun函数释放名为ksoftirqds的矿机,和挖矿的配置文件config.json。

1568011825_5d75f631aadbf.png

并用bash执行,然后删除矿机主机和配置文件。

1568011831_5d75f637792f3.jpg

 

开始挖矿后继续执行github_com_hippies_LSD_LSDA_Ago函数,此函数会调用一系列redis函数对其他主机的6379端口进行暴力破解,为传播途径之二。

1568011837_5d75f63d2581d.jpg

最后会执行样本更新函数,并再次写入定时任务,清除其他挖矿的进程,然后退出。

更新请求的地址为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

1568011852_5d75f64c1ecf9.jpg

1568011856_5d75f650a2b23.jpg

样本在服务器产生的文件:

/tmp/watchdogs (启动之后自删)

/tmp/.lsdpid

/usr/sbin/watchdogs

/tmp/ksoftirqds

/usr/local/lib/libioset.so

1568011862_5d75f6560123a.jpg

在linux操作系统的动态链接库加载过程中,动态链接器会读取LD_PRELOAD环境变量的值和默认配置文件/etc/ld.so.preload的文件内容,并将读取到的动态链接库进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD环境变量和/etc/ld.so.preload配置文件中指定的动态链接库依然会被装载,它们的优先级比LD_LIBRARY_PATH环境变量所定义的链接库查找路径的文件优先级要高。

将编译好的busybox加入环境变量中。

1568011869_5d75f65d6ad29.png

利用busybox查看/etc/ld.so.preload文件,发现里面加载一个动态库,一般没有正常需求,文件为空。

1568011874_5d75f66276828.png

查看ls命令调用的动态链接库,增加了/usr/local/lib/libioset.so,正常命令 ls 是不加载这个链接库。

1568011879_5d75f66739f6f.jpg

1568011884_5d75f66c9ad70.jpg

直接利用命令ls去查看/usr/local/lib目录,发现已隐藏。中招之后系统中大部分命令都预先加载/etc/ld.so.preload中的动态链接库。

1568011890_5d75f67288647.png

用IDA打开libioset.so,查看字符串,发现恶意定时任务和其他几个进程名,查看流程发现每次执行命令都会将所有包含恶意程序相关的结果过滤掉,并重新写入crontab。

1568011895_5d75f677eadaa.jpg

利用busybox 中的top查看CPU占用率高的进程,为/tmp/ksoftirqds,此即挖矿进程。

1568011902_5d75f67e24524.jpg

利用 busybox lsof -p PID,样本执行之后自删文件,

1568011907_5d75f683ae777.jpg

直接kill -9 命令杀掉进程,发现过一会又出现,而定时任务无法删除,原因是由于libsetio.so的存在,当使用正常命令会再写crontab规则到相关目录。

1568011912_5d75f688f06ec.jpg

查看网络连接同样也发现样本通过爆破局域网中 Redis和ssh进行横向传播。

1568011918_5d75f68e0c9bc.jpg

 

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客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者