作者: Palo Alto Networks(派拓网络)威胁情报团队Unit 42
最新博文摘要如下:
Palo Alto Networks (派拓网络)威胁情报团队Unit 42近日宣布发现一种新型加密挖矿蠕虫病毒,已有2000多台Docker主机因保护不力而受到感染。Unit 42将该病毒命名为Graboid,是向90年代电影《异形魔怪》致敬,其行为与电影中的沙虫相类似,移动速度较快但总体来讲相对笨拙。
尽管也发生过以蠕虫病毒形式传播的加密挖矿恶意事件,但这是我们首次在Docker Engine(社区版)中发现借助容器传播的加密挖矿蠕虫病毒。由于多数传统端点防护软件都不检测容器内的数据和活动,因此很难发现这一类型的恶意活动。攻击者首先通过不安全的Docker Daemon站稳脚跟,然后在受感染的主机上安装一个Docker镜像并运行。恶意软件从C2服务器上下载并部署完毕后,便开始挖矿寻找门罗币。此外,恶意软件会定期从C2服务器搜索新的带有漏洞的主机,然后随机选择下一个目标进行传播。我们的分析表明,挖矿病毒平均有63%的时间处于活跃状态,每个挖矿周期持续250秒。在Unit 42向Docker团队通报该情况后,Docker团队便迅速与Unit 42团队联手删除这些恶意镜像。
容器化加密挖矿蠕虫病毒
图1. 加密挖矿蠕虫病毒活动概览
Shodan的快速调查显示,有2,000多个Docker Engine以不安全的方式暴露于互联网。无需任何身份验证或授权,攻击者就可以完全控制Docker Engine(社区版)和主机。恰恰是抓住了这一入口,攻击者才会部署并传播这一蠕虫病毒。图1标明了该恶意软件的分发和传播方式。攻击者入侵了一个未受保护的Docker daemon,运行从Docker Hub中提取的恶意Docker容器,从C2服务器下载一些脚本和易受攻击的主机列表,并反复选取下个目标传播蠕虫。我们称为“Graboid”的恶意软件在容器内进行蠕虫传播和加密挖矿。它在每次迭代中随机选择三个目标,在第一个目标上安装蠕虫,在第二个目标上停止挖矿,在第三个目标上启动挖矿。这种行为导致挖矿行为极度随机。如果我的主机被入侵,恶意容器不会立即启动。相反,我必须等到另一台受感染的主机选择我的主机并启动我的挖矿过程。其他受感染的主机也可以随机停止我的挖矿过程。从本质上讲,每台受感染主机上的挖矿程序都由所有其他受感染主机随机控制。这种随机设计的动机尚不清楚,有可能是因为设计不当,规避技术(效果不佳),自我维持的系统或其他目的。
以下为具体操作步骤
- 攻击者选取某个不安全的docker主机作为攻击目标,然后远程发布指令下载并部署恶意Docker镜像pocosow/centos:7.6.1810. 该镜像含有一个用来与其他Docker主机通信的 docker client工具
- pocosow/centos 容器中的入口脚本/var/sbin/bash会从C2服务器下载4个shell脚本并逐个运行,这4个脚本分别是live.sh, worm.sh, cleanxmr.sh, xmr.sh
- 脚本live.sh将被攻击主机上的可用CPU数量发送至C2服务器
- 脚本worm.sh下载一个名为“IP”的文档,其中包含2000多个IP地址。这些IP地址便是那些有着不安全的docker API端点的主机。Worm.sh随机选取一个IP地址作为攻击对象,使用docker client工具远程获取并部署pocosow/centos container容器
- 脚本cleanxmr.sh随机选取IP文件中某个带有漏洞的主机,终止其上的加密挖矿容器。cleanxmr.sh终止的不仅是蠕虫部署的加密挖矿容器(gakeaws/nginx),也包含少数处于运行状态的xmrig容器
- 脚本xmr.sh随机选取IP文件中某个带有漏洞的主机,然后将镜像gakeaws/nginx部署于目标主机之上。gakeaws/nginx含有伪装成为nginx的二进制xmrig
步骤1-6每隔一段时间便会在每个受感染的主机上反复执行,刷新间隔时间设定为100秒。pocosow/centos 容器部署后,刷新间隔时间、shell脚本以及IP文档就会从C2服务器上下载。
在写入期间,如图2所示,Docker镜像pocosow/centos下载次数超过10000次,而gakeaws/nginx也超过6500次。此外,我们还注意到,同一个用户(gakeaws)发布了另外一个加密挖矿镜像gakeaws/mysql,其和gakeaws/nginx内容相同。只有在shell脚本下载并在容器内运行后,pocosow/centos镜像的不良企图才会被察觉。但通过其镜像创建历史,我们也可以轻松发现gakeaws/nginx 镜像的恶意企图。如图3所示,其只在创建时间栏(第7行)里将二进制xmrig重新命名为nginx。即便如此在创建时间里(第7行)付款地址也以硬编码的形式来应对不断变化的环境。
图4显示了IP地址文件中列出的2,034个易受攻击的主机位置——57.4%的IP地址来自中国,其次有13%来自美国。我们还注意到,在恶意软件使用的15台C2服务器中,有14台主机列在IP地址文件中,剩下的那1台主机有50多个已知漏洞。这表明攻击者可能破坏了这些主机并将其用作C2服务器。通过对Docker daemon的控制,可以轻松部署Web服务器容器(例如httpd、nginx)并将有效负载放置其上。
图2. Docker Hub上恶意Docker镜像
图3. gakeaws/nginx的镜像历史
图4. IP文档中漏洞主机的所在国家
蠕虫仿真
为了充分了解该蠕虫病毒的有效性及其整体挖矿能力,我们创建了一个简单的Python程序来模拟该蠕虫。假设在IP文档里有2000个主机,其中30%的主机在运行当中失效,设定刷新间隔时间为100秒,每台受感染主机配置一个CPU,该模拟实验时长为30天,我们希望能够找到:
- 对于蠕虫来讲,要感染全部Docker主机需要多长时间?
- 攻击者的挖矿能力如何?
- 每个挖矿程序在被感染的主机上的活跃时间多长?
图5左半部分显示了蠕虫的传播速度。覆盖全部1400台带有漏洞的主机大约用时60分钟(占2000多台主机的70%)。图5右半部分显示受感染主机的整体挖矿能力。任何时候,都会有900个活跃挖矿程序在运行。换句话说,攻击者拥有1400个节点挖矿集群,至少有900个CPU的挖矿能力。由于挖矿程序可以在受感染的主机上随机启动和关闭,挖矿程序的活跃时间只占其全部时间的65%,平均每个挖矿周期仅仅持续250秒。
图5. 蠕虫仿真
结论
尽管这种加密挖矿蠕虫病毒并不涉及复杂的战术、技术或过程,但它可以定期从C2服务器提取新脚本,因此可以轻松将其自身改造成为勒索软件或任何恶意软件,以彻底破坏主机,需引起重视。如果更强大的蠕虫出现并采用类似的传播方式,将会造成更大的破坏,因此组织必须保护其Docker主机。
以下是确保企业免受攻击的最佳实践清单:
- 如果没有合适的认证机制,切勿在互联网公开Docker daemon。请注意,缺省情况下,Docker Engine(社区版)不会暴露于互联网
- 使用Unix socket实现与Docker daemon的本地通信,或使用SSH连接到远程Docker daemon。
- 使用防火墙规则将流入较小资源的流量列入白名单
- 切勿从未知注册表或未知用户名称空间提取Docker镜像
- 经常检查系统中是否有未知的容器或镜像
- Prisma Cloud或Twistlock等云安全解决方案可以识别恶意容器并阻止加密采矿等活动
Palo Alto Networks(派拓网络)在本报告中与其他网络威胁联盟成员分享了其发现,包括文件样本和攻击指标。CTA成员使用此情报可快速为其客户部署保护措施,并系统地瓦解恶意网络参与者的入侵。有关网络威胁联盟的更多信息,请访问www.cyberthreatalliance.org。
攻击指标
Docker 镜像:
pocosow/centos:7.6.1810:
Digest: sha256:6560ddfd4b9af2c87b48ad98d93c56fbf1d7c507763e99b3d25a4d998c3f77cf
gakeaws/nginx:8.9:
Digest: sha256:4827767b9383215053abe6688e82981b5fbeba5d9d40070876eb7948fb73dedb
gakeaws/mysql:
Digest: sha256:15319b6ca1840ec2aa69ea4f41d89cdf086029e3bcab15deaaf7a85854774881
Monero Address: 45TwKEr1LjoEPuxnbfuPhaXCf138AoQvtSJ3jdqg1gPxNjkSNbQpzZrGDaFHGLrVT7AzM7tU9QY8NVdr4H1C3r2d3XN9Cty
C2 servers:
120.27.32[.]15
103.248.164[.]38
101.161.223[.]254
61.18.240[.]160
182.16.102[.]97
47.111.96[.]197
106.53.85[.]204
116.62.48[.]5
114.67.68[.]52
118.24.222[.]18
106.13.127[.]6
129.211.98[.]236
101.37.245[.]200
106.75.96[.]126
47.107.191[.]137