引 言
想象一下这样的场景:容器僵尸爆发,一旦某个容器被感染,它就会在互联网上扫描暴露的 Docker API,并“咬”上去——也就是加以利用,通过创建新的恶意容器并接管正在运行的容器,将它们变成新的“僵尸”。这些僵尸容器会为 Dero 加密货币进行挖矿,并继续“咬”向新的受害者。整个传播过程中不需要命令与控制(C2)服务器,仅靠数量不断增长的受感染系统,就能自动扩散感染。这正是最新 Dero 挖矿攻击活动的运作方式。
在一次近期的入侵检测项目中,我们发现多个正在运行的容器存在恶意行为。其中一部分容器已被公开识别,另一些则是首次发现。通过对这些容器的取证分析,我们确认攻击者通过利用未加保护的 Docker API 接口,成功获得了对目标容器化基础设施的初始访问权限。这不仅导致原有容器被入侵,还导致攻击者创建了新的恶意容器,不仅劫持受害者的资源进行加密货币挖矿,还对外发起攻击,将感染扩散到其他网络。下图展示了这一攻击路径:
感染链
整个攻击链完全由两个恶意植入程序自动执行:一个是此前未知的传播恶意软件 nginx ,另一个是 **Dero 加密货币挖矿程序**。这两个样本均使用 Golang 编写,并使用 UPX 工具进行了打包。卡巴斯基产品已能够检测到这些恶意程序,并给予如下判定:
nginx: Trojan.Linux.Agent.gen;
Dero 加密矿工:RiskTool.Linux.Miner.gen.
nginx: the propagation malware
nginx:传播恶意软件
该恶意软件负责维持加密矿工的持续存在,并将其进一步传播到外部系统。它被设计为尽可能减少与操作者的交互,不依赖命令与控制(C2)服务器进行投送。只要还有用户在互联网上不安全地公开其 Docker API,nginx 就能持续进行传播。
该恶意程序之所以被命名为 “nginx”,是为了伪装成知名的合法 nginx Web 服务器软件,从而绕过用户或安全工具的检测。在本文中,我们将此恶意程序称为 “nginx”。
在对该恶意程序进行解包之后,我们解析了 Go 二进制文件的元数据,并确认了其在编译时所使用的 Go 源代码文件路径: “/root/shuju/docker2375/nginx.go”。
Nginx 源码文件
Infecting the container
感染容器
该恶意软件首先在路径 “/var/log/nginx.log” 下创建一个日志文件,以此作为其活动的记录起点。
日志文件创建
该日志文件随后将用于记录恶意软件的运行活动,包括以下信息:被感染机器的列表、在这些机器上创建的恶意容器名称,以及在出现错误时的退出状态码等数据。
恶意操作日志
随后,恶意软件会在一个新进程中运行名为 main.checkVersion 的函数。该函数会无限循环,持续检查被感染容器内路径 “/usr/bin/version.dat” 中的文件内容是否为 1.4。如果该文件的内容被更改,函数就会将其重写为 1.4,从而确保版本标识不被篡改,用于维持恶意软件的状态一致性或作为其存在的标记。
确保 version.dat 存在且内容为 1.4
如果 version.dat 文件不存在,恶意函数会创建该文件,并写入内容 1.4。随后,程序会休眠 24 小时后再进行下一轮检查。这一机制可用于标记感染状态,同时通过延迟循环降低被安全工具检测的概率。
创建 version.dat(若不存在)
恶意软件使用 version.dat 文件来识别已经被感染的容器,我们将在后文详细介绍其用途。
接着,nginx 样本会在一个新进程中执行名为 main.monitorCloudProcess 的函数,该函数会无限循环,确保名为 cloud 的进程(即 Dero 挖矿程序)始终在运行。
首先,恶意软件会检测 cloud 进程是否存在。如果未检测到该进程,nginx就会调用 main.startCloudProcess 函数以启动该挖矿程序,从而持续利用受害容器的资源进行加密货币挖矿。
监控并执行 cloud 挖矿进程
为了执行挖矿程序,main.startCloudProcess 函数会尝试在路径 **“/usr/bin/cloud”** 查找挖矿程序。如果该路径下存在该可执行文件,恶意软件就会运行它,从而启动 Dero 挖矿操作,持续占用被感染容器的计算资源。
执行挖矿程序
传播感染
Host search
主机搜索
接下来,nginx 恶意软件会进入一个无限循环,利用 main.generateRandomSubnet 函数随机生成 IPv4 /16 网络子网,然后对这些子网进行扫描,试图入侵更多的网络,实现更大范围的传播和感染。
网络子网生成和扫描的无限循环
生成的子网及其对应的 IP 范围会被传递给 main.scanSubnet 函数,利用恶意软件安装在容器中的端口扫描工具 masscan 进行扫描,具体细节我们将在后文详细介绍。扫描器通过执行以下命令对生成的子网进行扫描,寻找互联网上暴露且不安全的 Docker API 接口以进行利用:masscan -p 2375 -oL – –max-rate 360.
通过 masscan 扫描生成的子网
masscan 的输出通过正则表达式进行解析,以提取打开默认 Docker API 端口 2375 的 IPv4。然后,提取的 IPv4 将传递给 main.checkDockerDaemon 函数。它会检查具有匹配 IPv4 的主机上的远程 dockerd 守护程序是否正在运行且具有响应性。为此,恶意软件尝试通过执行 docker -H PS 命令列出远程主机上所有正在运行的容器。如果失败,nginx 将继续检查下一个 IPv4。
远程列出运行中的容器
Container creation
容器创建
在确认远程的 dockerd 守护进程正在运行且响应正常后,nginx 会生成一个由 12 个随机字符组成的容器名称,并使用该名称在远程目标主机上创建一个恶意容器。
容器名称生成
恶意容器通过命令docker -H run -dt –name –restart always ubuntu:18.04 /bin/bash.创建。恶意软件使用 –restart always 参数,确保新创建的容器在退出后能够自动重启。
新主机上创建恶意容器
随后,nginx 通过执行命令 docker -H exec apt-get -yq update更新软件包,为后续安装依赖做好准备。
更新容器软件包
接下来,恶意样本使用命令 docker -H exec apt-get install -yq masscan docker.io 在容器中安装 masscan 和 docker.io,这些是恶意软件与 Docker 守护进程交互以及执行外部扫描以感染其他网络所依赖的组件。
远程在新创建的容器内安装恶意软件依赖
然后,它通过执行命令 docker -H cp -L /usr/bin/ :/usr/bin 将两个恶意程序 nginx 和 cloud 传输到容器内的 `/usr/bin` 目录。
将 nginx 和 cloud 传输到新创建的容器
恶意软件通过将传输的 nginx 二进制文件添加到 /root/.bash_aliases来保持持久性,确保在 shell 登录时自动执行。此操作是通过执行以下命令完成的:docker -H exec bash –norc -c 'echo "/usr/bin/nginx &" > /root/.bash_aliases'
将 nginx 恶意软件添加到 .bash_aliases 以实现持久化
Compromising running containers
入侵正在运行的容器
到目前为止,恶意软件只创建了新的恶意容器。接下来,它将尝试入侵基于 ubuntu:18.04 的正在运行的容器。样本首先执行 main.checkAndOperateContainers 函数,检查远程易受攻击主机上的所有运行容器,判断两个条件:容器是否基于 ubuntu:18.04 镜像,以及容器内是否不存在 version.dat 文件(该文件是容器是否曾被感染的标志)。
列出并入侵远程目标上的现有容器
如果满足上述条件,恶意软件会执行main.operateOnContainer 函数,按照之前描述的攻击路径对正在运行的容器进行感染。感染链不断重复,劫持容器资源以扫描并入侵更多容器,同时进行 Dero 加密货币的挖矿。
通过这种方式,恶意软件无需依赖命令与控制(C2)服务器,只要存在可被利用的不安全 Docker API,就能持续入侵运行中的容器并创建新的恶意容器,保持其活动状态。
cloud — Dero 挖矿程序
执行并维护 cloud 挖矿程序是 nginx 恶意软件的主要目标。该挖矿程序同样使用 Golang 编写,并经过 UPX 打包。解包该二进制文件后,我们确认它来源于 GitHub 上的开源项目 DeroHE CLI 挖矿程序。攻击者将该 DeroHE CLI 挖矿程序封装进了cloud 恶意软件,并内置了硬编码的挖矿配置,包括一个钱包地址和一个 DeroHE 节点(derod)地址。
如果执行时未传入任何地址参数(本次攻击即如此),cloud 恶意软件会使用硬编码的加密配置作为默认配置。该配置以 Base64 编码字符串形式存储,解码后得到一个通过 AES-CTR 加密的 Base64 编码钱包地址数据块,恶意软件通过 main.decrypt 函数进行解密。
配置加密表明威胁行为者试图增强恶意软件的复杂度和隐蔽性,这在之前的攻击活动中尚未见到。
解密加密货币钱包地址
解码该字符串后,我们发现了明文形式的钱包地址:dero1qyy8xjrdjcn2dvr6pwe40jrl3evv9vam6tpx537vux60xxkx6hs7zqgde993y.
解密函数的行为分析
然后,恶意软件通过名为 main.sockz 的函数解密另外两个硬编码的 AES-CTR 加密字符串,以获取 Dero 节点地址。
解密地址的函数调用
节点地址的加密方式与钱包地址相同,但使用了不同的密钥。解密后,我们获得了以下地址:
d.windowsupdatesupport[.]link和 .wiNdowsupdatesupport[.]link.
内存中的解码地址
之前在一场针对开启了 Kubernetes API 匿名认证的 Kubernetes 集群的攻击活动中,也观察到了相同的钱包地址和 derod 节点地址。与本次活动不同的是,威胁行为者没有将恶意软件传输到被攻陷的容器中,而是从 Docker Hub 拉取了一个名为 pauseyyf/pause:latest 的恶意镜像,该镜像内含挖矿程序,并用它来创建恶意容器。
与当前活动相比,此前的攻击方式更加隐蔽,攻击者没有尝试进行横向移动或扫描互联网以感染更多网络。这类攻击在 2023 年和 2024 年间持续出现,技术上只有细微的变化。
总结要点
尽管针对容器的攻击频率低于其他系统,但其危害性丝毫不容小觑。在我们分析的案例中,容器化环境被一款已知的挖矿程序和一个新型样本共同攻破,后者不仅创建了恶意容器,还感染了现有容器。这两个恶意程序无需依赖命令与控制(C2)服务器即可传播,使任何拥有容器化基础设施且 Docker API 不安全暴露于互联网的网络都成为潜在目标。
对 Shodan 的分析显示,2025 年 4 月全球共有 520 个 Docker API 通过 2375 端口公开暴露。这凸显了该威胁可能带来的破坏性后果,强调了对容器环境进行全面监控和保护的必要性。
全球通过 2375 端口公开暴露的 Docker API(2025 年 1 月至 4 月,数据可下载)
仅使用已知的正规镜像构建容器化基础设施并不能保证安全。和其他系统一样,容器化应用也可能在运行时被攻破,因此使用高效的监控工具(如卡巴斯基容器安全)对容器化基础设施进行监控尤为重要。该工具能够检测配置错误,监控镜像仓库,确保容器环境的安全。
我们还建议主动进行威胁狩猎,以发现那些隐蔽的恶意活动和可能未被注意到的安全事件。卡巴斯基的妥协评估服务不仅能帮助您检测此类事件,还能协助进行修复,并提供即时且有效的事件响应支持。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...