Watchdog 还是 TeamTNT?一例攻击归因刍议

Watchdog 是一个能够针对 Windows 与 Linux 平台发起攻击、主要进行门罗币挖矿的攻击团伙。从 2019 年起就十分活跃,根据分析人员估算 Watchdog 通过挖矿获取的利益已经能够达到数万美元。

TeamTNT 是一个非常高调的团伙,经常在 Twitter 上进行互动,甚至开发了对外的 Dashboard 来展示运行情况,如下所示。该团伙对 Docker 和 Kubernetes 格外感兴趣,经常更新升级技术手段。

这次的主角是 zzhreceive.top,有数据视角的肯定早就分析过它了,攻击已经持续了不短的时间。简单看下其攻击链,大体如下所示(注:为保证可读性有一些存在交错重合的部分脚本与关系并未完全显示):

攻击基础设施

IP

IP

AS ASN
组织 国家
107.189.3.150
PONYNET
53667
FranTech Solutions 卢森堡
159.75.18.13
Shenzhen Tencent Computer Systems Company Limited 45090
Shenzhen Tencent Computer Systems Company Limited 中国
194.36.190.30
Host Sailor Ltd 60117
Host Sailor Ltd 荷兰

mysql.zzhreceive.top 前一段时间先后绑定在 123.56.55.130 与 159.75.18.13 上,这两个 IP 地址似乎分别是阿里云和腾讯云的服务器。这一点上,与其他攻击团伙尽量将攻击基础设施部署在境外产生差异。

Domain

攻击者看起来似乎格外喜欢使用数据库名称用于域名命名,除了三月份刚刚启用的子域名 bbq.zzhreceive.top 非数据库相关,其余使用了 mysql、hbase、oracle 和 elastic。

样本分析

apa.jpg

攻击者基于 ziggystartux 的 IRC Bot (https://github.com/isdrupter/ziggystartux)继续开发,公开版本中的版本描述为“BadKarma v6 Feb 2017”,而攻击者标注其代码版本为“BadKarma v12 Feb 2021”。

其主要功能如下所示:

攻击者沿用了原作者的自定义加解密方式来保护 IRC 服务器的明文地址与密码,只是略有改动。解密的逻辑如下所示:

尽管与原始的程序相比略有修改,仍然很容易用 Python 写出简单解密脚本:

解密可以得到其加密的 IRC 服务器地址为 hbase.zzhreceive.top,频道为 #ntsett,密码为 JzHR0SRFfJ1M6KI9。这一点也可以在实际流量中得到验证:

IRC 的服务器端使用的是 Go 编写的 ergo 2.7.0 版本,服务器在 2022 年 1 月初开始上线运行。目前,该频道中有近 1500 个受害者。

b.sh/cronb.sh/dk.sh/dkb.sh/tmate.sh

攻击者会通过 URL 请求来在后台进行相关统计,例如用户身份为 root 的时候会发起如下请求:
http://xx/b2f628/idcheck/uid=0(root)。请求也不会有什么响应,应该只是为了在后台进行统计分析。

以及一些其他统计成功与否的请求:

禁用防火墙等安全措施,卸载云防护产品:

清除竞争对手的挖矿进程:

通过 base64 编码隐藏 tar 文件:

解压后为 Diamorphine Rootkit 的源码,再通过 insmod diamorphine.ko 进行安装。

下载 http://xx/hide/hide.jpg 解压 tar 文件是后续需要的一些 .so 文件:

写入指定位置的文件,内容如下:

增加用户 hilde,并写入 SSH 后门:

使用 post-exploitation 工具(https://github.com/r3vn/punk.py)收集失陷主机的用户名、SSH 秘钥和其他主机信息。

进行持久化:

横向平移:

优先使用 MoneroOcean 的 XMRig,备选标准的 XMRig:

配置文件并非一次到位,为规避检测后续还有修改:

修改完的配置文件 config_background.json

{    "api": {        "id": null,        "worker-id": null    },    "http": {        "enabled": false,        "host": "127.0.0.1",        "port": 0,        "access-token": null,        "restricted": true    },    "autosave": true,    "background": false,    "colors": true,    "title": true,    "randomx": {        "init": -1,        "mode": "auto",        "1gb-pages": false,        "rdmsr": true,        "wrmsr": true,        "numa": true    },    "cpu": {        "enabled": true,        "huge-pages": true,        "hw-aes": null,        "priority": null,        "memory-pool": false,        "yield": true,        "max-threads-hint": 50,        "asm": true,        "argon2-impl": null,        "astrobwt-max-size": 550,        "cn/0": false,        "cn-lite/0": false,        "kawpow": false    },    "opencl": {        "enabled": false,        "cache": true,        "loader": null,        "platform": "AMD",        "adl": true,        "cn/0": false,        "cn-lite/0": false    },    "cuda": {        "enabled": false,        "loader": null,        "nvml": true,        "cn/0": false,        "cn-lite/0": false    },    "donate-level": 0,    "donate-over-proxy": 0,    "log-file": null,    "pools": [        {            "algo": null,            "coin": "monero",            "url": "elastic.zzhreceive.top:1414",            "pass": "x",            "rig-id": null,            "nicehash": true,            "keepalive": false,            "enabled": true,            "tls": false,            "tls-fingerprint": null,            "daemon": false,            "socks5": null,            "self-select": null        },        {             "algo": null,             "coin": "monero",             "url": "oracle.zzhreceive.top:1414",             "pass": "x",             "rig-id": null,             "nicehash": true,             "keepalive": false,             "enabled": true,             "tls": false,             "tls-fingerprint": null,             "daemon": false,             "socks5": null,             "self-select": null         }     ],    "print-time": 60,    "health-print-time": 60,    "retries": 5,    "retry-pause": 5,    "syslog": true,    "tls": {        "enabled": false,        "protocols": null,        "cert": null,        "cert_key": null,        "ciphers": null,        "ciphersuites": null,        "dhparam": null    },    "user-agent": null,    "verbose": 0,    "watch": true,    "rebench-algo": false,    "bench-algo-time": 10}

攻击者使用自建矿池(elastic.zzhreceive.top:1414 与 oracle.zzhreceive.top:1414)。

为了逃避检测,钱包地址也不是开箱即用需要再二次处理,处理后钱包地址为 43Xbgtym2GZWBk87XiYbCpTKGPBTxYZZWi44SWrkqqvzPZV6Pfmjv3UHR6FDwvPgePJyv9N5PepeajfmKp1X71EW7jx4Tpz

攻击者使用最新版(2.4.0)的 tmate(https://github.com/tmate-io/tmate)作为另一重后门,URLTOKEN 会生成一个字符串,如 261342O26837。将该唯一标识通过 HTTP 请求上报,攻击者即可滥用 tmate 的服务连接失陷主机。攻击者的 APIKEY 为 tmk-4ST6GRXU6GPUjlXHfSlNe0ZaT2,滥用行为应该被封禁。

可以看出攻击者为规避检测做了大量的工作,并且使用或者定制修改了开源程序和滥用合法程序。值得注意的是,tmate 仍然被许多引擎认为是与 TeamTNT 有关(标记为 Hildegard),并且也有许多引擎识别出其为 tmate 仍然予以告警:

c.sh/dkis.sh

根据设备内存情况调整扫描强度:

base64 编码的字符画:

利用 masscan 和 zgrab 对 2375 端口和 2376 端口进行扫描,再利用 docker 远程访问写入定时任务进行入侵:

cf.jpg

矿机配置文件,使用的钱包地址与前述相同,改用公开矿池。

{    "api": {        "id": null,        "worker-id": null    },    "http": {        "enabled": false,        "host": "127.0.0.1",        "port": 0,        "access-token": null,        "restricted": true    },    "autosave": true,    "background": false,    "colors": true,    "title": true,    "randomx": {        "init": -1,        "mode": "auto",        "1gb-pages": false,        "rdmsr": true,        "wrmsr": true,        "cache_qos": false,        "numa": true,        "scratchpad_prefetch_mode": 1    },    "cpu": {        "enabled": true,        "huge-pages": true,        "hw-aes": null,        "priority": null,        "memory-pool": false,        "yield": true,        "max-threads-hint": 100,        "asm": true,        "argon2-impl": null,        "astrobwt-max-size": 550,        "cn/0": false,        "cn-lite/0": false,        "kawpow": false    },    "opencl": {        "enabled": false,        "cache": true,        "loader": null,        "platform": "AMD",        "adl": true,        "cn/0": false,        "cn-lite/0": false    },    "cuda": {        "enabled": false,        "loader": null,        "nvml": true,        "cn/0": false,        "cn-lite/0": false    },    "log-file": "/usr/share/[crypto].log",    "donate-level": 1,    "donate-over-proxy": 1,    "pools": [        {            "algo": null,            "coin": "monero",            "url": "xmr-asia1.nanopool.org:14444",            "user": "43Xbgtym2GZWBk87XiYbCpTKGPBTxYZZWi44SWrkqqvzPZV6Pfmjv3UHR6FDwvPgePJyv9N5PepeajfmKp1X71EW7jx4Tpz.dream",            "pass": "x",            "rig-id": null,            "nicehash": false,            "keepalive": true,            "enabled": true,            "tls": false,            "tls-fingerprint": null,            "daemon": false,            "socks5": null,            "self-select": null        },        {            "algo": null,            "coin": "monero",            "url": "xmr.f2pool.com:13531",            "user": "43Xbgtym2GZWBk87XiYbCpTKGPBTxYZZWi44SWrkqqvzPZV6Pfmjv3UHR6FDwvPgePJyv9N5PepeajfmKp1X71EW7jx4Tpz.dream",            "pass": "x",            "rig-id": null,            "nicehash": false,            "keepalive": true,            "enabled": true,            "tls": false,            "tls-fingerprint": null,            "daemon": false,            "socks5": null,            "self-select": null        }    ],    "retries": 5,    "retry-pause": 5,    "print-time": 60,    "health-print-time": 60,    "syslog": true,    "tls": {        "enabled": false,        "protocols": null,        "cert": null,        "cert_key": null,        "ciphers": null,        "ciphersuites": null,        "dhparam": null    },    "user-agent": null,    "verbose": 0,    "watch": true,    "pause-on-battery": false}

查询显示连接 nanopool 矿池的部分,其收益已经达到 8 个门罗币,查询时在线矿工 43 个。

cronis.sh/iss.sh

部署 masscan、pnscan 扫描程序。

cronscan/scan

设定持久化服务:

cronrs.sh/rss.sh

入侵 redis 所用:

随后利用 masscan 扫描其他 redis 服务器。

midd.jpg/father.jpg

为矿机与相应的配置文件:

归因疑云刍议

样本中经常使用与 TeamTNT 类似的实现方式,如使用了与 TeamTNT 相同的文件名(/usr/bin/bioset)、与 TeamTNT 一致的字符画:

攻击中与 TeamTNT 的相似是全方位的,包括原来未发现针对 Docker 的攻击,目前已经新增了这部分功能(注:这里指的 Watchdog 是这个攻击中的,不是此前传统的 Watchdog)。

根据 PaloAlto Networks 的跟踪分析,攻击者曾经使用新基础设施替换了原有的 Watchdog 的基础设施,但也保留了 Watchdog 原有的路径结构。

据此,姑且可以认为这是 Watchdog 做的。但令人讶异的是,IP 地址 199.19.226.117 先后被 TeamTNT 和 Watchdog 所使用:

并且研究人员在 TeamTNT 的恶意样本中发现了 b.sh,该脚本部署在 45.9.148.35 上。且该 IP 地址确认与 TeamTNT 有关:

脚本文件中不仅包含 Watchdog 的门罗币钱包,还指向了 TeamTNT 的域名 borg.wtf

如果说 Watchdog 模仿 TeamTNT 的话,能够解释攻击痕迹中对 TeamTNT 的亦步亦趋,但这无法解释在 TeamTNT 的基础设施中发现 Watchdog 的部分。这部分其实没有更多的数据支撑,比如发现的样本与其他 TeamTNT 样本的关联情况,具体样本的下载使用量是否很大等。只是目前披露的情况,难以表示二者间就存在关联。

不管怎么说,尽管攻击也未使用 Watchdog 传统的、带有大量 Exploit 的恶意样本,Palo Alto Networks 最后认为该攻击还是属于 Watchdog 模仿 TeamTNT 的。从目前的情况来看,我个人也倾向于这种判断,如果各位有更多的数据或者以前的分析欢迎指路和讨论。

Palo Alto Networks 在 2021 年 6 月份发布的报告原标题是“TeamTNT Using WatchDog Operations TTPs in Cryptojacking”。而 TeamTNT 在 Twitter 上予以回复“Das ist KEINE TeamTNT Kampagne!”(德文意为:“这不是 TeamTNT 的攻击行动!”)。

以 TeamTNT 高调的行事作风,也许不会抵赖自己的攻击行为。并且 TeamTNT 对这种拙劣的模仿非常不满,表示“TeamTNT 并不需要要抄 Watchdog 的垃圾”!

随后研究人员重新分析该攻击行动,发现是 WatchDog 模仿 TeamTNT 的攻击。但这后续的“反转”大家普遍都没有跟上,表述停留在 TeamTNT 使用 Watchdog 的 TTP 进行攻击:

中文世界的消息似乎也没有及时跟进,这样反转性质的攻击归因可能会带来极大的误导。

甚至某些安全厂商的威胁情报标签也没有对应更新。当然,不排除是大家对归因仍然存在分歧,所以这里不一一列举,感兴趣的可以自行查阅。(PS:标记了恶意和标记了归属之间的差异其实还是很大的,如果是公开采集而来的威胁情报,带有归属信息的情报最好还是二次校验为好,毕竟这可能是威胁情报最常见的应用场景。从另一个方面讲,这也是威胁情报中心会遇到的典型困境,高可信渠道来源都有可能存在“反转”的情况下,高质量的情报整合能力是极具价值的)。

总结

假旗(FALSE FLAGS)不仅被较高水平的 APT 组织所采用,现在也被黑产团伙盯上了。分析人员在给出归因结果时,一定要警惕 FALSE FLAGS 的存在,时刻牢记攻击归因是需要坚实的证据支撑的,否则有可能会被表面现象所蒙蔽。社区对此也要加强沟通讨论与数据共享,毕竟人多力量大嘛。卡巴斯基此前写过关于错误归因的博客,列举了攻击归因的审慎之处,可以参考此前翻译的版本进行拓展阅读。

错误归因

https://github.com/PolluxAvenger/Paper_Recording/blob/master/WAVE%20YOUR%20FALSE%20FLAGS%20DECEPTION%20TACTICS%20MUDDYING%20ATTRIBUTION%20IN%20TARGETED%20ATTACKS.md

IOC

哈希(MD5) 文件名
b66fe14854d5c569a79f7b3df93d3191 1.0.4.tar.gz
10ac30ebbed68584400f8ccd814e2a60 apa.jpg
61b9e621c7f5cccf7531df2960d1279a b.sh
84a5ad559fb6214ed41ab6d5148e6fa2 cf.jpg
33f3af3578a006c540a6d672018685a4 cronb.sh
f1c1406a1713f3213276aee6f2f4d0ee cronis.sh
49d08057803bc26d335a31d17aa6d516 cronrs.sh
95671392750cbf2beeded42dd4a8112b cronscan
32fc7480579c81080d58257bc0610ce2 c.sh
e0970e709cdf0724a8d923f9c300798b dkb.sh
acd107d13c46ecbfa9cb54af1ac4048f dkis.sh
46e66fb290f0c2c44cc224aa4c3e2767 dk.sh
a06f97d208b2dce7f5373538d840fe4f father.jpg
d7a454d9427ae6c980f892891d1f3f77 hide.jpg
9f337437314f3f3f37fb8ef46b3c5412 iss.sh
5739e2b0bf1962d2ac147aeca8763d36 jq
12b50559b634a77b48a193d48860521e midd.jpg
aacd7b3d0c4a2686d3291f02030696d9 p.tar
394fd351e83b997d7d7169792ed07ff0 rss.sh
fd679470a787f18534a614b100fa171c scan
1aeb95215a633400d90ad8cbca9bc300 tmate
7691c55732fded10fca0d6ccc64e41dc zgrab
41a7ce7b86f18a9d3ca21482d799393f tmate.sh


http://oracle.zzhreceive.top/b2f628/b.shhttp://oracle.zzhreceive.top/b2f628/cronis.shhttp://oracle.zzhreceive.top/b2f628/p.tarhttp://oracle.zzhreceive.top/b2f628/dkb.shhttp://oracle.zzhreceive.top/b2f628/father.jpghttp://oracle.zzhreceive.top/b2f628/cf.jpghttp://oracle.zzhreceive.top/b2f628/cronscanhttp://oracle.zzhreceive.top/b2f628/dkb.shhttp://oracle.zzhreceive.top/b2f628/cryptostarthttp://oracle.zzhreceive.top/b2f628/cryptonotfounthttp://oracle.zzhreceive.top/b2f628/authfailed http://oracle.zzhreceive.top/b2f628/authokhttp://oracle.zzhreceive.top/b2f628/dkis.shhttp://oracle.zzhreceive.top/b2f628/scanhttp://oracle.zzhreceive.top/b2f628/rss.shhttp://oracle.zzhreceive.top/b2f628/cronrs.shhttp://oracle.zzhreceive.top/b2f628/c.shhttp://oracle.zzhreceive.top/service/tmate.shhttp://bbq.zzhreceive.top/zgrabhttp://bbq.zzhreceive.top/midd.jpghttp://bbq.zzhreceive.top/jqhttp://oracle.zzhreceive.top/b2f628fff19fda999999999/dk.shhttp://oracle.zzhreceive.top/b2f628fff19fda999999999/b.shhttp://oracle.zzhreceive.top/b2f628fff19fda999999999/iss.shhttp://oracle.zzhreceive.top/b2f628fff19fda999999999/1.0.4.tar.gz
免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐