背景
Arctic Wolf Labs 一直在跟踪最近的两次入侵,其中威胁行为者利用了一种新的基于 Go 的恶意软件下载器(我们称之为“CherryLoader”),该下载器允许他们在不重新编译代码的情况下交换漏洞。加载程序的图标和名称伪装成合法的CherryTree笔记应用程序来欺骗受害者。在我们调查的入侵中,CherryLoader 用于删除两个权限升级工具PrintSpoofer或JuicyPotatoNG 之一,然后运行批处理文件以在受害设备上建立持久性。
要点
Arctic Wolf 观察到一种名为“CherryLoader”的新加载器,它是用 Go 编写的,在最近的入侵中使用。
该加载程序包含模块化功能,允许威胁行为者交换漏洞而无需重新编译代码。
CherryLoader 删除了两个公开的权限升级漏洞。
CherryLoader 的攻击链利用进程重影,允许威胁行为者提升权限并在受害者计算机上建立持久性。
技术分析
根据事件响应数据和其他分析,威胁行为者最初利用 IP 地址 141.11.187[.]70 为受害者 CherryLoader 和相关文件提供服务。从该 IP 下载了两个文件,一个受密码保护的 rar 文件 (Packed.rar) 和一个用于解压 Packed.rar 的可执行文件 (main.exe)。
Packed.rar文件包含一个 Golang 二进制文件(cherrytree.exe) 以及三个附加文件NuxtSharp.Data 、Spof.Data和Juicy.Data。 Cherrytree.exe 被剥离并破坏了其导入地址表,以阻碍分析工作。
通过静态分析,找到了该项目的独特参考,揭示了作者的原始项目名称“XorRunPeGoler”。
从 .rar 文件中提取 CherryLoader 及其关联文件后,威胁参与者使用以下命令调用 CherryLoader:
Cherrytree.exe 405060EEw@! NuxtSharp.Data Spof.Data
执行时,二进制文件会检查传递给它的参数,并将第一个参数(密码)与硬编码的 MD5 密码散列进行比较。如果哈希值匹配,则二进制文件将继续下一步,如果不匹配,CherryLoader 将退出。
然后,二进制文件分配内存来读取和解密通过第二个参数 (NuxtSharp.Data) 传递的文件。然后使用简单的 XOR 算法对该文件进行解密。
为了启动 XOR 循环,CherryLoader 复制 XOR 密钥“Kry”并为解密数据分配内存。然后,它逐字节迭代NuxtSharp.Data文件,并将字节与对应于 [“K”、“r”、“y”] 中索引的字母进行异或。该索引的模数限制为 3,以避免越界访问。
值得注意的是,解密算法不依赖于输入的密码,因此可以对其进行修补,从而使密码参数变得无用。密码检查可能是为了阻止对文件的分析。可以在此处找到演示解密过程的 python 脚本。
XOR 循环完成并且文件 (NuxtSharp.Data) 已在内存中解密后,使用 GetProcAddress 动态定位 CreateFileW,后者将解密的文件作为 File.log 保存在 %TEMP% 目录中。
将File.log保存到磁盘后,该示例将动态定位CreateProcessW函数来运行cmd.exe,而 cmd.exe 又将File.log作为其子进程运行:
cmd.exe /c File.log Spof.Data 123 12.log
运行cmd.exe进程后,它会动态定位并调用DeleteFileW和RemoveDirectoryW来删除%TEMP%目录中的任何证据。
File.log(又名 NuxtSharp.Data)
File.log 是一个用 C 编写的 PE 文件,似乎包含引用名为 NuxtSharp 的原始项目的符号。 File.log 代表攻击链的下一阶段,该阶段从解密 Spof.Data 开始。
解密欺骗者
CherryLoader 将File.log作为带有三个附加参数的进程运行。File.log可执行文件的主函数将有助于将参数传递给函数,该函数稍后将解密并从内存加载二进制文件。
File.log首先创建一个名为12.log(命令行上指定的最后一个参数)的文件。然后 File.log 打开加密的Spof.Data文件(第一个参数)并将数据读入缓冲区以进行解密。
Spof.Data使用 AES ECB (Rijndael) 进行加密;键“123”作为初始命令行中的第二个参数传递。
值得注意的是,使用 CherryLoader 发现的其他文件之一Juicy.Data使用了相同的加密算法和密钥。 Arctic Wolf 创建了一个 Python 脚本,可以帮助解密Spof.Data和Juicy.Data ,该脚本可以在此处的附录中找到。
Evasion Attempt (Process Ghosting)
一旦File.log完成了Spof.Data的解密,它就会尝试使用称为“进程重影”的无文件技术创建一个名为12.log的新进程。该技术采用模块化设计,允许威胁行为者利用其他漏洞利用代码来代替Spof.Data。在这种情况下,包含不同漏洞的Juicy.Data可以在不重新编译File.log 的情况下进行交换。
进程重影技术首先使用CreateFile API 创建一个文件,并将DELETE标志设置为其dwDesiredAccess参数。
然后,它使用NtSetInformationFile API 设置指向FILE_DISPOSITION_INFORMATION结构的FileInformation参数;该结构有一个布尔参数,称为DeleteFile,设置该参数后,操作系统会在关闭文件时删除该文件。
然后File.log使用WriteFile API将解密的二进制文件写入新创建的文件中,然后使用NtCreateSection创建一个图像部分:
创建图像部分后,它会使用CreateFileMappingA和MapViewOfFile将创建的文件映射到内存中。
创建文件映射后,它会关闭映射文件的句柄,从而删除先前创建的文件。
然后File.log利用先前映射的部分创建一个新进程。
创建的进程完成后,它会使用CreateEnvironmentBlock检索环境变量,并使用RtlCreateProcessParameters函数设置新创建进程的参数和环境。
在创建新的执行线程之前,File.log会使用VirutalAllocEx为新创建的进程分配内存,并调用WriteProcessMemory和ReadProcessMemory函数将基址、进程参数和环境数据设置到新分配的内存中。
最后,它使用新创建进程的句柄创建一个新线程,并使用NtCreateThreadEx函数开始执行12.log进程。
成功创建线程后,它会向终端打印“Success – Threat ID”,其中具有讽刺意义的是单词“ Threat ”的拼写错误,而不是Thread。
权限提升
新创建的进程12.log (Spof.Data) 链接到一个名为PrintSpoofer的公开权限提升工具,该工具滥用Windows 10 和 Server 2016/2019 上的SeImpersonatePrivilege。二进制文件中的字符串包含PrintSpoofer工具的作者姓名。
同样,根据文件的字符串,Juicy.Data 是另一个公开可用的权限升级工具,名为 JuicyPotatoNG。
加密的Spof.data和Juicy.data可执行文件有三个共同点:
它们都是公开的权限升级工具
命名约定遵循原始项目名称:
他们都在成功升级权限后尝试运行 user.bat。
Persistence
成功升级权限后,Spof.data和Juicy.data将尝试运行名为user.bat 的批处理文件脚本。批处理文件脚本不会被混淆,并将执行以下操作:
首先,它创建一个管理员帐户,其用户名Administrator拼写错误,密码102030TTYG@
将Microsoft Defender 中的exe进程列入白名单( Ngrok 是反向代理,可用于连接到不向外部公开或允许通过外部防火墙的内部服务)
在 Windows Defender 中设置.exe文件的排除
禁用 Microsoft Defender AntiSpyware(有效禁用 Windows Defender)
启用远程连接并添加防火墙规则以允许端口 3389上的RDP连接
重新启动windows服务termservice(远程桌面服务)
此阶段的目标是在受害者的机器上建立持久性。
结论
CherryLoader 是新发现的多阶段下载器,它利用不同的加密方法和其他反分析技术,试图引爆替代的、公开可用的权限升级漏洞,而无需重新编译任何代码。
加密方法包括简单的XOR以及AES;反分析技术包括密码提供和进程重影;分析的包中的漏洞包括 PrintSpoofer 和 JuicyPotatoNG。
Arctic Wolf 致力于消除网络风险,当发现主动入侵时,我们会迅速保护我们的客户。为了应对入侵,Arctic Wolf 进行了检测,以针对 CherryLoader 及其随附模块发现的恶意活动发出警报。
客户可以通过确保定期修补软件、限制创建或审核管理员帐户创建的能力、审核防火墙修改、审核 Windows Defender 的禁用、审核远程桌面服务以及反向代理的使用来进一步保护其系统像 ngrok 这样的工具。
附录
NuxtSharp.Data 的异或解密脚本
以下 Python 脚本执行与Cherrytree.exe相同的解密功能。它将每个字节与 [“K”, “r”, “y”] 数组中的三个字符之一进行异或:
from pathlib import Path
key = "Kry"
file = Path("NuxtSharp.Data")
with file.open("rb") as enc_file:
dec_file = Path("dec_NuxtSharp")
file_content = enc_file.read()
kry_index = 0
with dec_file.open('wb') as decrypted_file:
for enc_byte in file_content:
dec_byte = bytes([enc_byte ^ ord(key[kry_index])])
decrypted_file.write(dec_byte)
kry_index = (kry_index + 1) %3
得出相同结论的另一种方法是通过对文件的数据分析,因为 XOR 键会用相应的字母覆盖空字节,如下图所示:
Spof.Data 和 Juicy.Data 的 AES 解密脚本
以下 Python 脚本执行与File.log相同的解密功能。它使用 AES ECB 算法和提供的 AES 密钥来执行此操作。
#command line to decrypt Spof.Data
decrypt_file.py -f Spof.Data -k 123
#command line to decrypt Juicy.Data
decrypt_file.py -f Juicy.Data -k 123
from Crypto.Cipher import AES
from pathlib import Path
import click
@click.command()
@click.option("-k", "--key", required=True, help="AES Key for ECB Decryption")
@click.option("-f", "--file", required=True, help="File to decrypt")
def decrypt(file, key, output):
file = Path(file)
if not file.exists():
print("[!] File does not exist.")
output_file_name = "decrypted_" + file.name
output_file = Path(output_file_name)
key = bytes(key, 'utf-8').ljust(16, b' ')
ecb = AES.new(key , AES.MODE_ECB)
with file.open('rb') as encrypted_file:
妥协指标 (IOC)
参考链接: https://cloudsecurityalliance.org/blog/2024/01/24/exploring-fbot-python-based-malware-targeting-cloud-and-payment-services/
图片来源网络目标可联系删除