Pensive Ursa(又名Turla)使用新研发的Kazuar后门进行攻击活动
导语:Kazuar的开发者正在增强器隐形操作能力,他们使用各种先进的反分析技术,并通过有效的加密和混淆实践来保护恶意软件代码。
在追踪Pensive Ursa(又名Turla, Uroburos)的迭代中,Unit 42的研究人员发现了Kazuar一个新的升级变体——一个先进而隐秘的 .NET后门,Pensive Ursa通常将其用作第二级有效负载。
“Pensive Ursa”是一个总部位于俄罗斯的攻击组织,至少从2004年开始活动,与俄罗斯联邦安全局(FSB)有联系。
乌克兰CERT在2023年7月报告说,这个版本的Kazuar是针对乌克兰国防部门的,背后攻击组织的目标是敏感数据,比如Signal消息、源代码控制和云平台数据。
自从Unit 42在2017年发现Kazuar以来,研究人员只在野外看到过几次,主要针对欧洲政府和军事部门的组织。由于代码相似,Sunburst后门与Kazuar联系在一起,这表明了它非常复杂。自2020年底以来,研究人员没有在野外看到新的Kazuar样本,但有报道称Kazuar正在不断开发中。
正如Kazuar升级版的代码所揭示的那样,Kazuar的开发者正在增强器隐形操作能力,他们使用各种先进的反分析技术,并通过有效的加密和混淆实践来保护恶意软件代码。
Kazuar概述
Kazuar是一种先进的、隐秘的.NET后门,Pensive Ursa通常将其作为第二阶段的有效负载,与攻击组织通常使用的其他工具一起传播。
最近乌克兰CERT报告的活动揭示了Kazuar的多阶段传播机制,以及其他工具,如新的Capibar第一阶段后门。研究人员对这个新版本的技术分析显示,它的代码结构和功能都有了显著的改进。
这篇文章将详细介绍以前未记录的功能,包括:
全面的系统分析:广泛的数据收集。
窃取云和其他敏感应用程序的凭证:窃取云应用程序帐户、源代码控制和信号消息传递应用程序。
扩展命令集:总共支持45个命令,从另一个Kazuar节点或命令和控制(C2)服务器接收。
增强的任务自动化:攻击者可以打开/关闭的一系列自动化任务。
可变加密方案:不同加密算法和方案的实现。
注入模式:多种注入模式,允许Kazuar从不同的进程运行并执行不同的功能。
至少从2018年开始,Kazuar的变体改变了它们的混淆方法,一些变体使用ConfuserEx混淆器加密字符串,其他变体使用自定义方法。
本文分析的Kazuar变体实现了多个自定义字符串加密方法,与以前的变体不同,该变体只关注Windows操作系统。
在分析Kazuar的代码时,研究人员使用dnSpy将代码导出到集成开发环境(IDE)中,并使用自定义脚本解密字符串。这允许研究人员编辑单独的.cs文件,并将一些方法名称编辑成有意义的名称。研究人员已经解释了屏幕截图中出现的方法名。
最新Kazuar变体的详细技术分析
元数据
其他研究机构的报告显示,至少从2018年开始,Kazuar的开发者就在操纵他们样本的时间戳。这个新变体的编译时间戳是星期四,2008年11月20日10:11:18 AM GMT。与其他公开可用的变体不同,这是开发者第一次回溯到2008年伪造时间戳。
Kazuar还包含代理版本和BuildID的硬编码、哈希标识符以及代理标签。这些可以用作变体标识符,如下图所示。
Kazuar样本基本配置信息
初始化
执行程序集检查
在执行Kazuar时,它使用Assembly.Location 属性来接收自己的文件路径并检查其名称。只有当返回的值为空字符串时,Kazuar才会继续执行,如图所示。从字节数组加载文件时,Assembly.Location属性返回一个空字符串。
这种检查似乎是反分析机制的一种简单形式,以确保恶意软件的执行是由预期的加载程序完成的,而不是通过其他方式或软件完成的。
Kazuar执行后,如果它的文件名匹配一个特定的硬编码哈希名称(使用FNV算法)。这种行为可能是为了调试目的,让开发者避免在每次调试恶意软件时使用加载程序。
检查Kazuar变体的配置名称
创建操作根目录
Kazuar创建一个新目录来存储它的配置和日志数据,它使用%localappdata%作为主存储路径,并从硬编码路径列表中确定其根目录。
Kazuar根据设备全局唯一标识符(GUID)选择要使用的根目录、文件夹名、文件名和文件扩展名,如下图所示。虽然这些名称乍一看似乎是随机生成的,但GUID的使用意味着它们将在同一台受攻击的设备上每次执行恶意软件时保持相同的名称。
负责返回路径数组索引的方法
与以前的变体一样,Kazuar使用结构化目录方案来保存其日志文件和其他数据,如单个配置文件和键盘记录器数据。目录命名是伪随机的,是根据哈希选择的。示例包括在前面的变体中看到的FNV哈希算法的自定义实现,以及对GUID值的其他操作。
值得一提的是,在代码中有一个当前未引用的选项,用于创建一个名为wordlist的文件。这个文件可以为研究人员提供一个尚未实现的功能的线索,也许是使用目录、文件名或密码暴力破解的单词列表。
配置文件
恶意软件创建一个单独的主配置文件,其中包含以下数据:
C2服务器;
注入模式;
其他运行配置数据;
下图显示了下面这个文件的一个片段,你可以在附录中找到Kazuar配置文件的加密方法。
配置文件的片段
互斥锁名称生成
Kazuar正在使用互斥锁来检查其注入到另一个进程中。Kazuar通过异或处理当前进程ID和硬编码值0x4ac882d887106b7d来生成它的互斥锁名,然后用设备的GUID 异或处理它,如下图所示。这意味着几个Kazuars可以在同一设备上串联操作,只是不注入到同一过程中。
互斥对象名称生成
体系结构
设置Kazuar的注入模式
新版本的Kazuar使用了它在配置中描述的“注入模式”,如表所示,默认模式为inject:
Kazuar注入模式和描述
在zombify模式下,Kazuar被注入到用户的默认浏览器中,并有一个回退机制,在默认浏览器的查询失败时将自己注入到svchost.exe中。下图显示了Kazuar的开发者通常使用zombify一词来处理进程注入:
Kazuars在zombify模式下的代码注入片段
多线程模型
Kazuar以多线程模式运行,而Kazuar的每个主要功能都作为自己的线程运行。换句话说,一个线程处理来自其C2的接收命令或任务,而求解线程处理这些命令的执行。这个多线程模型使Kazuar的开发者能够建立一个异步和模块化的流控制。任务解析流如下:
Kazuar的任务解决机制图
任务解析器组件:Kazuar的 Puppeteer
Kazuar接收新任务,解决它们并将输出写入结果文件。求解线程正在处理从C2服务器或另一个Kazuar节点接收到的新任务。然后对任务内容进行加密,并将其写入磁盘的任务文件中。
每个任务文件实现一个混合加密方案:
1.使用RNGCryptoServiceProvider生成两个包含随机数的字节数组,它们分别是16和32字节。1.1使用第一个数组作为AES (Rijndael)初始化向量(IV)。使用第二个数组作为AES密钥。
2.在将结果加密并写入磁盘之前,基于内存中的result 内容生成HMACMD5哈希,使用上面第一个项目中描述的数组作为密钥。
3.用硬编码的RSA密钥加密HMACMD5哈希、AES密钥和IV,并将加密后的BLOB写到文件的开头。通过使用快速的AES算法来加密较大的对象,例如结果的内容,并使用较慢的RSA加密来隐藏AES密钥和IV, Kazuar提高了其性能。这还禁用了仅从磁盘恢复受攻击文件的选项,因为对称密钥是使用非对称密钥加密的。
4.使用AES加密来加密result 文件的内容。
如下图所示,任务完成后,生成的结果文件将保存到磁盘上:
Kazuar加密和写入结果文件方法片段
除了上述加密数据外,Kazuar还将以下字段写入结果文件的开头:
1.四个零字节(研究人员认为这是一种分隔符);生成的结果标识符;
2.加密GUID的长度,使用与初始化部分相同的异或算法(这里的加密消息是“System info at [datetime] (-07)”);
3.加密的GUID本身;
4.RSA加密HMACMD5哈希, IV以及AES密钥;
5.AES加密后的任务内容。
下图显示了来自磁盘的加密结果文件内容:
来自磁盘的加密结果文件内容
字符串加密
Kazuar的代码包含大量与功能和调试相关的字符串。当以纯文本形式显示时,它们揭示了Kazuar的内部工作原理和功能。为了避免研究人员创建基于字符串的指示YARA和检索规则,Kazuar的字符串是加密的,它在运行时解密每个字符串。
Kazuar使用恺撒密码(Caesar cipher)的变体作为字符串加密/解密算法。在这个算法中,Kazuar实现了一个简单地交换每个成员的密钥和值的字典。最近的Kazuar变体只实现了一个字典,而新的变体实现了多个字典,每个字典包含80对字符,如下图所示。
包含用于字符串解密的字典类
下图显示了在给定字符串上迭代的循环,并检查给定字符的序数值是否在相关类的字典键中。如果是,Kazuar交换键和值,并将其附加到精心制作的字符串。否则,它将保持原来的字符。
除了字符串混淆之外,开发者还为代码中的类和方法提供了无意义的名称,以使分析更加困难。
创建反混淆字符串的循环
Kazuar解码的其中一个字符串返回值“Invalid pong response”,如下图所示。似乎有一个恶意软件的编码员忘了把俄语中的C换成英语中的S。
" response "字符串中的错别字
核心功能
为了避免宕机,Kazuar使用被劫持的合法网站作为其C2基础设施,这是Pensive Ursa的典型做法。此外,正如在注入模式一节中提到的,Kazuar还支持通过命名管道进行通信。它使用这两种机制来接收远程命令或任务(如代码中所述)。
支持的C2命令
Kazuar支持从C2接收的45种不同任务,如下表所示。相比之下,Kazuar在2017年分析的第一个变体仅支持26个C2命令。
研究人员将Kazuar的命令分为以下几类:
主机数据收集;
扩展取证数据收集;
文件处理;
任意命令执行;
与Kazuar的配置交互;
注册表查询和操作;
脚本执行(VBS, PowerShell, JavaScript);
自定义网络请求;
窃取凭证和敏感信息;
Kazuar支持的C2命令
云、源代码管理和消息应用程序凭证盗窃
Kazuar能够通过接收来自C2的窃取或无人参与命令,尝试从受攻击计算机中的许多工件中窃取凭证。这些工件包括多个众所周知的云应用程序。
Kazuar可以尝试窃取包含这些应用程序凭证的敏感文件。Kazuar针对的工件包括Git SCM(一种在开发人员中流行的源代码控制系统),以及Signal(一种用于私人即时消息的加密消息服务)。
Kazuar可能试图窃取的Git SCM凭证的代码片段
全面的系统评测
当Kazuar最初生成一个唯一的解析线程时,它自动执行的第一个任务是对目标系统进行广泛的收集和分析,Kazuar的开发者将其命名为first_systeminfo_do。Kazuar将收集有关受攻击计算机的大量信息,并将其发送给C2。这包括有关操作系统、硬件和网络的信息。
Kazuar将这些数据保存到info.txt文件中,并将执行日志保存到logs.txt文件中。如任务解析部分所述,我们可以在内存中看到结果。在本文的样本中,它是一个存档,如下图所示。
内存中first_systeminfo_do压缩的结果
除了前面提到的两个文本文件之外,作为该任务的一部分,恶意软件还会截取用户的屏幕截图。下图显示了在加密并发送到C2之前将所有这些文件压缩到一个文件中的过程:
加密前first_systeminfo_do存档提取内存的结果
创建自动任务(auto)
Kazuar能够设置以指定间隔运行的自动任务,以从受攻击的计算机收集信息。下图显示了Kazuar配置中记录的该功能的一个示例。
这些自动化任务包括:
收集系统信息;
屏幕截图;
窃取凭证;
获取取证数据;
获取自动运行数据;
正在从指定的文件夹中获取文件;
获取LNK文件列表;
使用MAPI窃取电子邮件;
Kazuar的Autos函数配置
监控活动窗口(Peeps)
Kazuar有能力让攻击者在配置中设置他们所谓的“peep rules” 。虽然Kazuar没有自带这些规则,但根据恶意软件的代码,似乎这个功能使攻击者能够监控指定进程的窗口。这使得攻击者可以跟踪受攻击设备上感兴趣的用户活动。
与C&C的通信
HTTP
在与C2服务器建立通信之前,除了上述反分析检查外,Kazuar还检查配置数据发送时间间隔,该检查包括确定是否应该在周末发送数据。
在首次通信时,Kazuar以XML格式发送收集到的数据,并期望获得带有新任务的XML结构化响应。
Kazuar使用硬编码值169739e7-2112-9514-6a61-d300c0fef02d转换为字符串,并将Base64编码为cookie。
HTTP POST命令,其正文中包含发送到C2的XML
Kazuar为XML生成密钥名,Base64在将内容发送到C2之前对其进行加密。XML的内容包括:
结果文件的加密内容;
结果标识符;
伪随机的4字节数,可能是另一种类型的标识符;
一个基于设备GUID伪随机生成的值数组;
硬编码GUID连接字符串169739e7-2112-9514-6a61-d300c0fef02d;
设备的唯一GUID。
使用命名管道进行通信
除了与C2进行直接HTTP通信外,Kazuar还具有代理功能,可以向受攻击网络中的其他Kazuar代理接收和发送命令,它通过命名管道进行代理通信,根据设备的GUID生成它们的名称。
Kazuar使用这些管道在不同的Kazuar实例之间建立点对点通信,将每个实例配置为服务器或客户端。命名管道通信支持表3所示的远程请求。
使用命名管道的Kazuar请求和响应
反分析检查
Kazuar使用了基于一系列详细检查的多种反分析技术,以确保它不被分析。开发者对Kazuar进行了编程,使其要么在安全的情况下继续运行,要么在调试或分析时保持空闲状态并停止所有C2通信。研究人员可以将这些检查分为三大类:蜜罐、分析工具和沙盒。
反转储
因为Kazuar不是作为一个独立的进程运行,而是被注入到另一个进程中,所以可以从被注入进程的内存中转储它的代码。为了防止这种情况发生,Kazuar使用了.NET的一个强大功能,即System.Reflection命名空间。这使Kazuar能够收集有关其程序集、方法等的实时元数据。
Kazuar检查它是否将antidump_methods设置为true,然后覆盖指向其自定义方法的指针,同时忽略通用的 .NET方法,实际上是将它们从内存中清除(正如Kazuar的日志消息所述)。这最终阻止了研究人员转储完整版本的恶意软件。
蜜罐检查
Kazuar专门搜索的第一件事就是设备上是否存在卡巴斯基蜜罐工件。它使用特定进程名和文件名的硬编码列表来实现这一点。
如果Kazuar发现超过5个这样的文件或进程,它将记录它发现了卡巴斯基蜜罐。下图显示了这些文件名。
Kazuar查找卡巴斯基蜜罐的文件名
分析工具检查
Kazuar列出了不同流行分析工具的硬编码名称,例如:
Process Monitor;
X32dbg;
DnSpy;
Wireshark;
它遍历正在运行的进程列表,如果其中一个工具正在运行,Kazuar将记录它找到的分析工具。
沙盒检查
Kazuar有一个硬编码的已知沙盒库列表。它检查是否存在属于不同沙箱服务的某些dll。如果恶意软件发现这些文件,它确定它正在实验室中执行。
事件日志监控器
Kazuar从Windows事件日志中收集和解析事件,下图显示Kazuar专门从以下杀毒/安全供应商处查找事件:
卡巴斯基终端安全;
赛门铁克终端保护客户端;
Microsoft Windows Defender;
Doctor Web(俄罗斯信息安全产品厂商);
与检查卡巴斯基的蜜罐一样,这些安全产品在受害者中很受欢迎。
Kazuar从特定安全产品收集的事件日志
发表评论