引言
StripedFly,它是一个加密货币挖矿软件,躲在一个支持Linux和Windows的复杂模块化框架后面。它配备内置的TOR网络隧道,用于与指挥(C2)服务器联系,还有通过可信赖的服务(如GitLab、GitHub和Bitbucket)进行更新和交付的功能,这一切使用自定义加密归档。攻击者煞费苦心来构建这个框架,披露的真相颇为惊人。
它是如何开始的?
2022年,在Equation恶意软件中发现的旧代码的WININIT.EXE进程中遇到了两个惊人的发现,随后的分析揭示了可追溯到2017年的早期可疑代码。在此期间,它成功逃避了分析,之前被误归类为加密货币挖矿软件。然而,这不是其主要目标。
我们决定全面分析收集的样本,只想排除任何不确定因素,这个加密货币挖矿软件是一个极庞大实体的一部分。该恶意软件使用了定制的EternalBlue SMBv1漏洞来渗入受害者的系统。重要的是,我们的调查剖析了二进制时间戳,表明这个漏洞是在2017年4月之前创建的。值得一提的是,EternalBlue漏洞是Shadow Brokers组织于2017年4月14日公开披露的。
这个特殊蠕虫与其他使用EternalBlue的恶意软件的区别在于其独特的传播模式。它悄无声息地传播,因而避免了大多数安全解决方案的检测。本文现在简要概述我们的发现结果。
感染
第一个检测到的shellcode位于WININIT.EXE进程中,该进程能够从bitbucket[.]org下载二进制文件,并执行PowerShell脚本。最初检测出来时,感染途径是未知的;然而,随着调查逐步深入开展,我们发现了一个与EternalBlue非常相似的SMBv1漏洞。
内核shellcode通过漏洞利用代码将另外的shellcode注入到用户空间中,然后部署载荷,其中包括一个具有插件式可扩展功能的框架以及一个超轻量级的TOR网络客户软件。一旦这个过程完成,大门被永久封住,恶意软件进而禁用了受感染系统上的SMBv1协议。
蠕虫功能试图在本地网络中传播,不仅仅依赖漏洞,还依赖SSH协议,使用在受害者机器上找到的密钥。
图1. Windows主机上的感染流程
实现持久性
为了实现持久性,恶意软件采用了各种方法。其行为取决于PowerShell解释器的可用性和授予该进程的特权。该恶意软件通常在通过漏洞安装时以管理权限运行,而在通过Cygwin SSH服务器投放时以用户级权限运行。
如果PowerShell不存在,恶意软件用MZ-PE加载程序生成一个隐藏文件,其随机名称位于%APPDATA%目录中。该加载程序包括system.img的副本,并随后在Windows注册表项Software\Microsoft\Windows\CurrentVersion\Run中以类似GUID的名称注册。
如果安装了PowerShell,其行为将因是否有管理访问权而异。如果有管理权限,它执行一个PowerShell脚本,该脚本创建两个具有类似GUID的名称和不同触发器的任务调度器项。这些任务的动作由PowerShell加载脚本运行。
如果没有管理权限,PowerShell脚本加载程序(开头和末尾被数千个空格包围)被放置在HKCU\Software\Microsoft\Windows\CurrentVersion\Applets注册表项中,然后使用以下命令将其注册到HKCU\Software\Microsoft\Windows\CurrentVersion\Run项中:
图2
在PowerShell存在的两种情况下,恶意软件归档本身的主体存储在注册表项Software\Microsoft\Windows\CurrentVersion\Shell中,Base64编码,由数百个空格包围,并由上述PowerShell启动
在Linux主机上,恶意软件进程隐藏在名称(sd-pam)下。有众多方法来实现持久性:可以是系统或用户systemd服务、自动启动的.desktop文件,或在合适的/etc/rc*、profile、bashrc或inittab文件中的另一行。恶意软件可执行文件以随机名称放置在/tmp目录下。
Bitbucket存储库
为了力求初始漏洞利用工具小巧化,所有可卸载的内容都封装在加密和压缩的自定义二进制归档中。这个归档谨慎地托管在合法网站上,巧妙地伪装成神秘设备的标记为"m100"的固件二进制文件。
Bitbucket存储库于2018年6月21日由Julie Heilman的帐户创建,它仍然是与该配置文件相关的唯一存储库。
图3. Bitbucket存储库的内容
存储库只有一个README.md文件,内含项目名称。值得注意的是,Downloads文件夹(通常包含编译后的项目二进制文件)包含五个二进制文件:delta.dat、delta.img、ota.dat、ota.img和system.img。
图4. 存储库的Downloads文件夹
该文件夹没有任何版本控制,下载计数器仅反映自上次文件更新以来的下载次数。尤其是,system.img文件充当真实的载荷归档,用于初始的Windows系统感染。该文件的下载计数器准确反映了自上次更新以来的新感染数量。在我们分析期间,文件上一次更新是在2022年2月24日,截至2022年6月,初始感染数量为16万。然而截至2023年9月,这个数字自2023年4月上一次更新以来已降至6万。
文件ota.img和delta.img用于更新恶意软件,其中ota.img对应Windows版本,而delta.img对应Linux版本。有意思的是,system.img和ota.img功能上一样,不过ota.img包含用于完整性验证的补充元数据,而delta.img充当了通过SSH被Windows版本感染的Linux主机的初始感染载荷。
文件ota.dat和delta.dat以及版本文件都是恶意软件检查新更新可用性的工具。然而值得一提的是,ota.img和delta.img的下载计数器并未准确反映当前感染受害者的数量,这是由于恶意软件主要从其C2服务器获取更新,仅在C2服务器没有响应时才从存储库下载更新文件。
在我们分析期间,约100万更新从存储库获得。截止本文撰稿时,Windows系统只有8次更新,Linux系统只有4次更新,这表明了两种场景:要么活跃感染极少,要么C2服务器保持活跃,并对所有受感染的受害者做出响应。
C2服务器位于TOR网络中,其.onion地址为gpiekd65jgshwp2p53igifv43aug2adacdebmuuri34hduvijr5pfjad[.]onion:1111。
为了与C2联系,恶意软件采用了自定义的轻量级方法来实现TOR客户软件。有趣的是,这种实现似乎并不是基于任何已知的开源TOR实现,显然缺少许多标准的TOR特性,比如路由、目录列表、中继、出口节点模式以及对控制协议的支持。
恶意软件会定期启动与C2服务器的TCP连接,发送含有受害者独特ID的问候信息。然后,它每分钟发送一个空信标消息。
这项功能表明了攻击者旨在不惜一切代价隐藏C2服务器,促使攻击者开发了一个独特而耗时的项目:创建自己的TOR客户软件。这种方法在APT和犯罪软件开发者当中并不常见,这个醒目的例子强调了这种恶意软件相比许多其他恶意软件具有的复杂性。其功能的复杂性和优雅性使我们想起了实现延迟容忍Equation通信网络及其他库的优雅代码,因而它被归类为高度先进的威胁。
模块
恶意软件载荷本身的结构是一种单体式二进制可执行代码,旨在支持可插入模块,以扩展或更新功能。这种架构方法是APT恶意软件的标志,每个模块负责实现和注册回调函数,该回调函数在与C2服务器的连接建立或中断时触发,或者在从C2服务器接收消息时触发。这些模块中的功能分为两类:服务模块和扩展功能模块。
1. 服务模块
配置存储
该模块通过在Windows版本的HKCU\Software\Classes\TypeLib项中创建一个类似GUID的注册表项,安全地存储AES加密的恶意软件配置。Linux版本将该信息隐藏在位于用户主目录中的随机隐藏文件夹中。
升级/卸载
当与C2服务器的初始连接建立时,服务模块生成一个8字节的受害者ID,存储它,然后与所用的system.img文件的散列一起重用它,用于向服务器返回报告。该模块旨在实现两个特定的命令:
o服务器发送system.img的新版本,升级过程由生成的脚本或生成的可执行文件来执行。
o执行全面卸载
如果C2服务器脱机时间超过20分钟,并且这种情况持续存在,模块将尝试下载ota.dat文件(Linux版本是delta.dat),然后验证其完整性。如果文件版本发生了变化,模块通过下载适当的.img文件:面向Windows的ota.img和面向Linux的delta.img来触发升级过程。
反向代理
该模块授予访问受害者网络的权限,并允许代表受害者执行远程操作。
2. 功能模块
杂项命令处理程序
该模块包含一系列命令,用于与受害者的文件系统交互、捕获屏幕截图、检索系统版本,并获得Linux上的活跃X11显示内容(默认值是Windows上的WinSta0)。它还包含一个能够执行从C2服务器收到的shellcode的命令。
凭据收集程序
该模块运行一个专用线程,每两小时定期扫描一次。在扫描过程中,它从所有活跃用户收集一系列敏感信息,这些信息包括网站登录用户名及密码,以及个人自动填写数据,比如姓名、地址、电话号码、公司和职衔。它还获取已知的Wi-Fi网络名称和相关密码,以及来自流行的软件客户软件(如FileZilla、Cyberduck和WinSCP)的SSH、FTP和WebDav凭据。
值得一提的是,Web浏览器对凭据收集的支持不仅限于Chrome、Firefox和Internet Explorer等知名浏览器,还包括一些不太知名的浏览器,比如Nichrome、Xpom、RockMelt、Vivaldi、SaMonkey、Epic Privacy和Brave。
在Linux版本中,它还收集存储在$HOME/.ssh中的OpenSSH密钥,将来自$HOME /.ssh/known_hosts的主机整理成表,并包括从Libsecret保管库检索秘密信息的功能。然而,这项特殊的功能目前有缺陷,因为链接的musl libc库中没有dlopen API实现。
可重复的任务
该模块拥有几个内置的功能任务,这些任务可以执行一次,也可以在可重复的调度基础上执行,条件是特定窗口必须可见,这些任务才会继续处理。
下面简要描述任务:
·获取屏幕截图,列出那一刻可见的所有窗口。
·使用某个命令行执行进程,重定向输出,并使用正则表达式加以过滤。
·记录麦克风输入。
·该任务收集具有特定扩展名的文件列表,比如与图像、文档、声音、视频、归档、数据库、证书、源代码文件相关的文件及其他关键的用户数据文件。该进程扫描所有本地驱动器和网络共享区,系统文件夹除外。这是在恶意软件的Linux版本中运行的唯一任务。
侦察模块
该模块汇集大量的系统信息,并在连接时将其传输到C2服务器。收集的数据包含众多详细信息,包括操作系统版本、计算机名称、硬件MAC地址列表、Windows系统的当前用户名、Linux系统的/etc/passwd文件、机器的IP地址、当前连接的TOR网络出口节点的IP地址、系统启动时间、恶意软件正常运行时间、时间及时区,总内存/可用内存量、用户管理权限以及特定的Windows相关信息,比如UI语言和键盘布局、存在的防病毒软件、NetBIOS名称、DNS域、机主的Windows许可证详细信息以及存在的PowerShell命令解释器。
SMBv1和SSH感染程序
有两个模块专门负责恶意软件的渗透能力,它们构成了核心的蠕虫功能。
一旦凭据收集模块完成任务,SSH感染程序就开始发威,它过滤结果寻找SSH密钥和凭据,如果找到,就激活专用线程。该线程的随机超时中断时间从10分钟到2小时不等,启动渗透进程。
首先,它从缓存或直接从bitbucket[.]org检索delta.dat和delta.img。然后,它进而验证这些文件的完整性,从delta.img动态加载libay库、zlib库和libssh2库。下一步是尝试连接到远程SSH服务器。如果连接成功,它调用并解析/bin/sh -c ' uname -nmo '命令的输出;如果远程系统受支持,恶意软件将其二进制文件以随机名称上传到远程的/tmp文件夹,并以命令/bin/sh -c 'cat > %s; chmod +x %s; nohup sh -c "%s; rm %s" &>/dev/null'执行该文件。这个方法确保了与x86、amd64、arm和aarch64 Linux CPU等架构兼容,并使用生成的MZ-PE加载程序与Cygwin x86和amd64远程主机兼容。
SMBv1感染模块使用自定义的EternalBlue漏洞利用代码,充当Windows受害者的主要渗透工具。初始执行后,它通过修改受害者系统上的HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters注册表项,立即禁用SMBv1协议。然后,它启动两个专用线程来执行定期的蠕虫活动。
第一个线程负责检查网络适配器的IP地址和子网掩码,然后试图在整个局域网子网内引起感染。相比之下,第二个线程定期尝试选择一个随机的互联网IP地址,以下地址排除在外:
obogon网络,比如0.0.0.0/8、10.0.0.0/8、100.64.0.0/10、 127.0.0.0/8、172.16.0.0/12、192.168.0.0/16、198.18.0.0/15、224.0.0.0/4和240.0.0.0/4。
o169.255.0.0/16--主要指南非。这可能是一个bug,开发者可能意指169.254.0.0/16--bogon网络列表中缺失的部分。
o3.0.0.0/8、15.0.0.0/8、16.0.0.0/8、56.0.0.0/8--亚马逊、惠普和美国邮政部等。
o6.0.0.0/8和55.0.0.0/8--美国陆军信息系统司令部。
o7.0.0.0/8、11.0.0.0/8、21.0.0.0/8、22.0.0.0/8、26.0.0.0/8、 28.0.0.0/8、29.0.0.0/8、30.0.0.0/8、33.0.0.0/8、214.0.0.0/8和215.0.0.0/8--美国国防部网络信息中心。
受支持的Windows版本包括Windows Vista、Windows 7、Windows Server 2008 R2、Windows 8、Windows Server 2012和Windows 10(直至build 14392)。
门罗加密货币挖矿模块
Monero挖矿模块如虎添翼。它在一个单独的进程中运行,巧妙地伪装成位于Google\Chrome\Application\Services目录中的chrome.exe进程,这可以在公共或本地AppData目录中找到。这种欺骗性手段甚至包括对伪装的可执行文件的版本信息和进程图标进行更改。主模块中的恶意软件功能定期监视木偶挖掘进程,必要时重新启动它,它还向C2服务器如实报告哈希率、工作时间、发现的错误和错误统计信息。
池服务器的DNS解析被巧妙地隐藏在针对Cloudflare DoH(DNS over HTTPS)服务的DNS over HTTPS请求的后面,为其活动增添了隐蔽性。
我们强烈怀疑这个模块是恶意软件能够长时间逃避检测的主要原因,它的存在主要是出于巧妙伪装的需要。值得一提的是,该模块挖掘的门罗币在2017年徘徊在10美元左右后于2018年1月9日达到了542.33美元的高位。截至2023年,成交价约150美元。虽然这个模块肯定有利可图,但它不一定是这种恶意软件最赚钱的用途。比如说,寻找未加密的二进制钱包或钱包凭据可能牟取更高的利润。
此外,恶意软件代码中存在与挖矿相关的未加密字符串,这从侧面证明了其潜在的辅助用途。
ThunderCrypt
我们偶然发现了该恶意软件的早期版本,这促使我们发现了一个相关的勒索软件变体:ThunderCrypt。事实证明,这两种恶意软件有着同样的底层代码库,更重要的是,它们与位于ghtyqipha6mcwxiz[.]onion:1111的同一台C2服务器进行联系。
与StripedFly相比,ThunderCrypt勒索软件展现了惊人相似的功能和模块,这包括TOR客户软件、配置存储、升级/卸载和侦察模块,值得注意的一处例外是没有SMBv1感染模块。有意思的是,该勒索软件使用可重复任务模块的文件列表组件作为其勒索加密进程的必要部分。
遥测数据显示,ThunderCrypt首次出现在2017年4月23日,活动的主要高峰期出现在随后的5月,它因一起相当有趣的事件而引起了台湾新闻网的注意。一名台湾网民因无法支付0.345比特币的勒索赎金以换取解密内容,决定通过提供的支持电子邮件地址与攻击者联系。他在邮件中坦率地解释了面临的困境,提到月收入只有400美元。令许多人吃惊的是,攻击者回复承认高估了台湾民众的收入,这次攻击被认为彻底失败。
图5. 台湾新闻网关于ThunderCrypt的报道
EternalBlue
我们认为EternalBlue漏洞与StripedFly背后的开发者存在共同点。我们的假设依赖PE时间戳的准确性,虽然不可能验证初始EternalBlue模块时间戳的真实性,但恶意软件的后续更新含有与遥测数据大致匹配的时间戳,因此初始时间戳很可能也是准确的。我们重新构建的时间线如下:
o2016年4月9日:PE时间戳表明,StripedFly最早的已知版本包含EternalBlue。
o2016年8月:Shadow Brokers组织首次泄露信息。
o2017年3月14日:微软发布安全公告MS17-010,附有EternalBlue漏洞的补丁。
o2017年4月14日:Shadow Brokers发布了含有EternalBlue漏洞的泄露信息。
o2017年4月15日:第一个包含EternalBlue的勒索软件ExPetr出现。
o2017年4月20日:出现了最早版本的ThunderCrypt勒索软件(不含EternalBlue)。
o2017年4月23日:首次在遥测数据中检测到了ThunderCrypt。
o2017年5月12日:WannaCry勒索软件攻击利用了EternalBlue。
o2017年6月27日:ExPetr攻击使用了EternalBlue。
o2017年8月24日:在初始PE时间戳给出的日期一年后,我们的遥测数据首次检测到StripedFly。
综上所述,这些不同的数据表明了与Equation恶意软件相似,不过没有直接证据表明它们存在关联。与Equation恶意软件家族相关的特征便于发现了该恶意软件,编码风格和方法与SBZ恶意软件颇为相似。
结论
StripedFly是很久以前编写的,多年来它成功地逃避了检测,无疑实现了其预期目的。许多瞩目和复杂的恶意软件已被调查过,但这个软件很特别,确实值得关注。
真正的目的是什么?这仍然是个谜。虽然ThunderCrypt勒索软件表明开发者出于商业动机,但它提出了一个问题:为什么他们不选择可能更有利可图的途径?勒索软件团伙基本上旨在获取匿名赎金,而这个案例似乎一反常态。
问题仍然存在,但只有那些设计这个神秘恶意软件的人知道答案,如此复杂且专业设计的恶意软件只想达到这种微不足道的目的,实在让人费解。
攻陷指标
C2服务器
gpiekd65jgshwp2p53igifv43aug2adacdebmuuri34hduvijr5pfjad[.]onion ghtyqipha6mcwxiz[.]onion
ajiumbl2p2mjzx3l[.]onion
URL
bitbucket[.]org/JulieHeilman/m100-firmware-mirror/downloads/
bitbucket[.]org/upgrades/um/downloads/
bitbucket[.]org/legit-updates/flash-player/downloads
gitlab[.]com/JulieHeilman/m100-firmware-mirror/raw/master/
gitlab[.]com/saev3aeg/ugee8zee/raw/master/
github[.]com/amf9esiabnb/documents/releases/download/
tcp://pool.minexmr[.]com:4444
tcp://mine.aeon-pool[.]com:5555
tcp://5.255.86[.]125:8080
tcp://45.9.148[.]21:80
tcp://45.9.148[.]36:80
tcp://45.9.148[.]132:8080
system.img
b28c6d00855be3b60e220c32bfad2535
155Jq5pu3245d4418M19YnRvau7Rc14hVB
2cdc600185901cf045af027289c4429c
54dd5c70f67df5dc8d750f19ececd797
d32fa257cd6fb1b0c6df80f673865581
c04868dabd6b9ce132a790fdc02acc14
c7e3df6455738fb080d741dcbb620b89
d684de2c5cfb38917c5d99c04c21769a
a5d3abe7feb56f49fa33dc49fea11f85
155Jq5pu3245d4418M19YnRvau7Rc14hVB
delta.dat
00c9fd9371791e9160a3adaade0b4aa2
41b326df0d21d0a8fad6ed01fec1389f
delta.img
506599fe3aecdfb1acc846ea52adc09f
6ace7d5115a1c63b674b736ae760423b
ota.dat
2e2ef6e074bd683b477a2a2e581386f0
04df1280798594965d6fdfeb4c257f6c
ota.img
abe845285510079229d83bb117ab8ed6
090059c1786075591dec7ddc6f9ee3eb
ThunderCrypt
155Jq5pu3245d4418M19YnRvau7Rc14hVB
d64361802515cf32bd34f98312dfd40d
文章翻译自:https://securelist.com/stripedfly-perennially-flying-under-the-radar/110903/如若转载,请注明原文地址