起底GoldenJackal APT组织
2023-6-4 11:10:0 Author: www.4hou.com(查看原文) 阅读量:37 收藏

GoldenJackal是一家APT组织,自2019年开始活跃,通常针对中东和南亚的政府和外交机构。尽管他们早在几年前就开始了活动,但该组织似乎没有被详细介绍过。

卡巴斯基实验室的研究人员早在2020年中开始监测该组织,观察到这是一个极其专业的组织。该组织的主要开发.NET恶意软件、JackalControl、JackalWorm、JackalSteal、JackalPerInfo和JackalScreenWatcher等特定工具集,目的是:

· 控制受害者计算机;

· 在使用可移动驱动器的系统中传播;

· 从受感染的系统中窃取某些文件;

· 窃取凭据;

· 收集有关本地系统的信息;

· 收集有关用户网络活动的信息;

· 截取桌面的屏幕截图;

根据工具集和攻击者的行为,研究人员认为GoldenJackal APT组织的主要动机是间谍活动。

攻击途径

研究人员发现攻击者假冒Skype安装程序,使用恶意Word文档。

另一个已知的攻击途径是一个恶意文档,它使用远程模板注入技术下载恶意HTML页面,该页面利用了Follina漏洞。

1.png

这份文件被命名为 “Gallery of Officers Who Have Received National And Foreign Awards.docx”的文件似乎是合法的,旨在收集巴基斯坦政府授予勋章的官员的信息。值得注意的是,Follina漏洞是在2022年5月29日首次被公布,该文档似乎在发布两天后的6月1日进行了修改,并于6月2日首次被检测到。

该文档被配置为从合法且已被攻击的网站加载外部对象:

hxxps://www.pak-developers[.]net/internal_data/templates/template.html!

2.png

用于加载远程资源的代码段

远程网页是公共“概念证明”的修改版本,用于利用Follina漏洞。原始PoC可在GitHub上获得。攻击者将IT_BrowseForFile变量值替换为以下值:

3.png

利用Follina漏洞的代码段

解码后的字符串为:

4.png

解码脚本

该漏洞会下载并执行托管在合法受攻击网站上的可执行文件,并将其存储在以下路径中:“%Temp%\GoogleUpdateSetup.exe”。下载的文件是JackalControl恶意软件。

在其他情况下,研究人员没有发现真正的攻击途径,他们还观察到在横向活动进程中系统受到攻击。具体来说,研究人员观察到攻击者使用psexec实用程序启动恶意批处理脚本。

5.png

批处理脚本执行各种操作,例如安装 Microsoft .Net Framework 4、用JackalControl木马感染系统并收集有关系统的信息。

6.png

JackalControl

这是一种木马,允许攻击者通过一组预定义和支持的命令远程控制目标计算机。信息是通过HTTPS通信信道在恶意软件和C2服务器之间进行接收的,并且可以指示植入进行以下任何操作:

· 使用提供的参数执行任意程序;

· 下载任意文件到本地文件系统;

· 从本地文件系统上传任意文件;

在过去几年中,攻击者多次更新该工具,已出现了多种变体。接下来,我们将描述2023年1月观察到的最新版本(8C1070F188AE87FBA1148A3D791F2523)。

该木马是一个可执行文件,可以作为标准程序或Windows服务启动。

它需要一个参数,该参数可以等于以下一个值:

· /0:作为标准程序运行,只与C2服务器联系一次;

· /1:作为标准程序运行,并定期联系C2服务器;

· /2:作为Windows服务运行;

恶意软件参数和相关的恶意软件行为根据变体而变化。一些变体只提供两个参数:

· /0作为标准程序运行;

· /1作为Windows服务运行;

其他变体可以自我安装不同的持久性机制。恶意软件的执行流程由运行该恶意软件的命令行中提供的参数决定。

· /h0:将通过创建Windows计划任务使恶意软件获得持久性;

· /h1:将通过创建相应的注册表运行项使恶意软件获得持久性;

· /h2:将通过创建Windows服务使恶意软件获得持久性;

· /r0:作为标准进程运行(此参数由Windows计划任务指定);

· /r1:作为标准进程运行(此参数由生成的注册表运行项值指定)。

· /r2:作为服务运行(此参数由创建的Windows服务指定)。

攻击者已经将不同的变体进行了传播:有些包括用于维护持久性的代码,另一些则被配置为在不感染系统的情况下运行;并且感染进程通常由诸如上述批处理脚本之类的其他组件执行。

恶意软件通过生成BOT_ID开始其活动,这是用于识别受攻击系统的唯一值。此值源自其他几个基于主机的值:

从以下WMI查询中获得的UUID值:

7.png

从以下注册表项获取的计算机GUID:

8.png

从另一个WMI查询中获得的额外驱动器的列表,这反过来允许他们确定' PHYSICALDRIVE0 '的' SerialNumber ':

9.png

收集到的信息被连接在一个字节数组中,然后用MD5哈希,MD5被用作创建BOT_ID的种子。用于生成后者的算法只是对结果MD5哈希中每两个连续字节求和,并将所得字节(模数256)作为最终BOT_ID的单个字节。下面的代码片段描述了这种逻辑,它取自恶意软件。

10.png

用于生成BOT_ID的代码段

生成的BOT_ID还用于初始化DES密钥和IV,然后用于加密与C2的通信。

恶意软件使用HTTP POST请求进行通信,其中数据参数将以编码形式作为请求主体的一部分进行传播。然后,整个请求结构将显示如下:

11.png

一个有效的响应应该以以下方式形成:

12.png

响应使用base64进行解码:生成的有效负载是一个字符串数组,其中使用的分隔符是标准的Windows新行序列-“\r\n”。每一行都用base64再次解码,用DES解密,并用GZIP算法解压缩。

每个命令都具有以下结构:

13.png

命令结构

00:执行——使用指定的参数执行任意程序。如果攻击者将NoWait标志设置为False,则恶意软件会重定向进程输出,读取数据并将其转发给C2;

01:下载——从本地系统读取文件并将其上传到服务器;

02:上传——使用攻击者指定的文件路径将接收到的数据保存到本地系统。

命令数据字段旨在携带有关命令参数的信息,并且对于每种操作类型具有不同的结构,如下所述:

14.png

命令结果通常被组成一条消息,该消息还包括底层命令类型和命令ID的值,该值唯一地标识向恶意软件发出的命令的示例。这三个值用GZIP压缩,用DES加密,并用base64编码。

生成的有效负载使用“|”字符与BOT_ID连接,再次使用base64编码,然后使用上述POST请求格式将其上传到远程服务器。

安装程序模式

一些变体可以感染系统,在特定位置创建恶意软件的副本,并保证其持久性。

恶意软件位置是通过特定进程选择的,它枚举CommonApplicationData中的所有子目录,并随机选择一个子目录保存其副本。生成的文件名将以子目录的名称作为后缀,并附加另一个静态值Launcher.exe,如下所示:

15.png

如果操作成功,它还会更改新的文件时间戳,并使其与所选子目录的时间戳相同。

如果操作失败,它会随机选择另一个目录,并再次尝试复制恶意软件。

如果对所有子目录的操作都失败,它将尝试使用硬编码目录名列表:

· Google

· Viber

· AdGuard

· WinZip

· WinRAR

· Adobe

· CyberLink

· Intel

如果所有尝试都失败了,它将尝试在以下位置使用相同的进程:

· ApplicationData

· LocalApplicationData

· Temp

持久性能力

恶意软件的持久性通常通过以下机制来保证:

· 服务安装;

· 创建新的Windows注册表项值;

· 创建新的计划任务;

该服务通常由恶意软件在执行Windows sc.exe实用程序时安装。

16.png

注册表值等于复制的恶意软件文件名,不带扩展名,并存储在以下各项中:

17.png

计划任务是使用硬编码的XML模板创建的,该模板在运行时被修改,并使用相同的恶意软件文件路径在文件系统释放,但扩展名不同,为.XML而不是.exe。

然后将生成的XML文件与Windows schtasks.exe实用程序一起使用来创建任务。

例如:

18.png

任务和服务描述会根据变体而变化。

JackalSteal

JackalSteal是另一种植入程序,通常部署在一些受感染的计算机上,用于在目标系统中查找感兴趣的文件,并将其窃取至C2服务器。

此工具可用于监控目标系统中的可移动USB驱动器、远程共享和所有逻辑驱动器。恶意软件可以作为标准流程或服务来工作。它无法维护持久性,因此必须由另一个组件安装。

JackalSteal通过解析参数开始执行。

19.png

选项说明

· -n:配置文件的唯一标识符值;

· -p:要检查的目录路径;

· -s:请求文件的最大大小;

· -d:自上次写入请求文件以来的天数;

· -m:使用正则表达式在配置的目录中查找以逗号分隔的字符串掩码列表;

· -w:配置Profile的连续目录扫描之间的时间间隔(以秒为单位);

· -e:从扫描活动中排除路径;

· /0:作为标准进程运行;

· /1:作为服务运行;

这些选项允许攻击者指定“概要文件”,该文件定义了攻击者感兴趣的文件。该配置文件由一个ID和一个模式列表组成。每个模式都包含一个具有以下属性的选项列表:

· Path:目标路径;

· Credentials:用于访问远程共享的凭据用户和密码;

· Masks:包含通配符和掩码字符的掩码字符串,可用于使用正则表达式匹配任何一组文件;

· MaxSize:文件的最大大小;

· Days:自上次写入文件以来的天数;

· Interval:两次连续路径扫描之间的时间间隔

· Exclude:扫描活动期间必须排除的路径;

用于配置JackalSteal组件的命令如下:

20.png

唯一标识符“-n”通常与JackalControl木马程序生成的BOT_ID相同。

在参数处理之后,恶意软件将数据序列化为XML,使用由带有“-n”选项传递的ID生成的密钥用DES加密它们,并将生成的有效负载存储在以下位置:“%ApplicationData%\SNMP\cache\%Filename]”,其中%Filename%是由攻击者指定的唯一标识符的MD5生成的GUID。

恶意软件通常使用“/0”或“/1”选项和“-n”选项执行,该选项用于加载获得的配置文件ID。在第二种情况下,它从前面提到的位置加载配置文件,并启动 ‘Watchers’。

Watcher是在具有相同名称的类中定义的对象,该对象在不同的线程中运行,并根据指定的选项扫描位置。该模式可以表示:

· 本地文件系统中的简单路径;

· 远程共享上的路径;

· 常量字符串all;

· 常量字符串usb。

当模式等于“all”时,恶意软件会枚举所有逻辑驱动器,并为每个驱动器创建一个新的Watcher对象。当模式为“usb”时,它会侦听与在系统上创建新的可移动驱动器的操作相对应的系统事件。当检测到新的驱动器时,它会创建一个新的Watcher对象。

每次添加新的Watcher时,恶意软件都会通知日志该事件,并使用HTTP Post请求将信息发送到远程C2。

该日志是使用以下字符串作为模板创建的:

21.png

并上传到包含以下信息的加密有效负载中:

22.png

为每个请求生成AES_Key和AES_IV,嵌入在代码中的密钥使用RSA算法进行加密。生成的有效负载也使用GZIP算法进行压缩。

“Agent_id\\Log_path.log”和“Log”内容数据采用AES算法加密,并使用GZIP压缩。

Watcher对象负责扫描活动,当Watcher启动时,它会枚举目录及其子目录中的所有文件。扫描仪还可以解析.lnk链接。当扫描程序检测到与定义的属性(掩码、天数、最大大小)匹配的文件时,它会计算文件内容哈希,检查结果值是否存在于存储在本地缓存目录中的哈希表中,如果不存在,则添加该值。当检测到新文件时,恶意软件会使用上述相同的逻辑将该文件和相关的文件路径上传到加密有效负载中。

在这种情况下,加密的有效负载包含以下信息:

23.png

“Agent_id\\Local_file_path”和“File”内容数据采用AES算法加密,并使用GZIP压缩。

JackalWorm

这种蠕虫是为了传播和感染使用可移动USB驱动器的系统而开发的。该程序被设计为一种灵活的工具,可以用来感染任何恶意软件的系统。

它的行为会随着父进程而变化。

· 当恶意软件在被感染的系统上工作,并且父进程是taskeng.exe或services.exe时:

· 监控可移动USB驱动器;

· 连接设备后,将隐藏最后修改的目录,并将其替换为蠕虫的副本;

用于监控可移动USB驱动器的代码与JackalSteal中观察到的代码相同。它创建了一个ManagementEventWatcher对象,允许它订阅与给定WQL查询相对应的事件通知,并在拦截时发出回调。恶意软件使用的查询指示系统每五秒钟检查一次逻辑可移动磁盘创建事件:

24.png

当恶意软件检测到一个可移动的USB存储设备时,它会自我复制到该设备。它将复制到的路径是通过列出所有目录并选择最后修改的目录来确定的。它将使用相同的目录名在驱动器根目录上创建自己的副本,并将目录的属性更改为“hidden”。这将导致实际目录被隐藏,并替换为具有目录名的恶意软件副本。此外,JackalWorm使用一个模仿Windows目录的图标,诱使用户在试图访问目录时执行恶意软件。

在以下示例中,可移动驱动器“E:”被恶意软件感染,它将自我复制为Folder1.exe,并更改Folder1的属性以将其隐藏:

25.png

受感染的设备

当恶意软件在干净的系统上启动时,父进程是explorer.exe,文件位于可移动驱动器中,其行为如下:

· 打开隐藏目录;

· 执行配置文件中指定的操作;

· 蠕虫感染系统;

配置文件是包含XML数据的嵌入式资源,可用于命令蠕虫执行一些操作:

· 释放程序并保证它与计划任务的持久性;

· 释放程序并使用指定的参数执行它;

· 使用指定的参数执行现有程序;

有效的配置文件如下所示:

26.png

在这种情况下,蠕虫被配置为安装存储在另一个资源“rcdata02”中的PE文件,并将其保存为扩展名.exe,最后创建一个计划任务,每隔15分钟运行一次。

其他示例有:

27.png

释放存储在“%TEMP%\test.exe”中的另一个资源“rcdata02”中的PE文件并执行它。

28.png

使用参数“1.1.1.1”执行程序“%WINDIR%\system32\ping.exe”。

目前研究人员只观察到第一个示例,该恶意软件被配置为安装JackalControl木马。

安装进程选择恶意软件位置的方式与上述的进程大致相同。它与另一个不同,因为它只枚举CommonAppData中的子目录,并使用与另一静态值upd.exe连接的子目录名称复制文件。

如果失败,它会尝试使用一个硬编码的目录名列表,这与上述的进程有点不同。

· Google

· Mozilla

· Adobe

· Intel

· [Random GUID]

蠕虫通过使用在运行时动态修改的硬编码XML模板创建计划任务来保持其持久性。安装后,蠕虫会使用批处理脚本从可移动驱动器中自我删除。该脚本将以随机名称放入本地Temp目录:

29.png

连接的可移动驱动器将再次感染JackalWorm

同样值得一提的是,这个工具似乎正在开发中。研究人员通过分析文件5DE309466B2163958C2E12C7B02D8384的嵌入式.NET资源来推断这一点。它们的大小为193973字节,比实际内容大得多:

· Rcdata01–XML配置–大小:67字节;

· Rcdata02–JackalControl木马程序–大小:27136字节;

这意味着有166770字节的未知数据。其中大多数是合法的notepad.exe Windows实用程序的一部分,特别是第一个0x6A30字节被覆盖。在合法的notepad.exe映像之后,我们还发现了以下XML配置:

30.png

第一个XML显示了一个新的类型值:“scheduler”,该值未在代码中指定。第二个XML显示此特定资源用于测试目的,攻击者试图运行cmd.exe在桌面的文本文件%USERPROFILE%\desktop\TEST.txt中写入单词“TEST”。

JackalPerInfo

该恶意软件的开发目的是收集有关受攻击系统的信息,以及一组特定的文件,这些文件可能用于检索存储的凭据和用户的网络活动。攻击者将其命名为“perinfo”,这是程序主类名PersonalInfoContainer的缩写。

它的行为会根据执行进程中提供的参数数量而变化。具体来说,当只使用一个参数执行时,恶意软件会收集一组预定义的信息,并将其存储在用GZIP压缩的二进制文件中。文件名是在提供的参数中指定的。当使用两个参数执行时,恶意软件使用第一个参数加载先前生成的二进制文件,并将所有信息提取到第二个参数指定的目录中。

默认情况下,该程序应使用一个参数执行。一旦执行,恶意软件就会开始使用特定函数GetSysInfo收集有关系统的信息:

31.png

在第一个JackalControl变体中也观察到了这种特定函数,但从较新的变体中删除了。

恶意软件通过枚举系统上的逻辑驱动器来继续其操作,对于每个文件,它都枚举根路径中的文件。收集的信息包括最后一次写入时间、文件名和文件大小。

然后,它枚举系统驱动器中的用户目录,通常为C:\Users\,它列举了以下目录的内容:

· 桌面;

· 文件;

· 下载;

AppData\Roaming\Microsoft\Windows\Recent;

它还尝试获取以下文件:

32.png

该恶意软件试图窃取受害者浏览器数据库中存储的凭据,以及其他信息,如可用于访问网络服务的cookie。

最后,它将收集的信息序列化为二进制格式,使用GZIP算法压缩所有数据,并将所有内容存储在攻击者提供的第一个参数指定的文件中。

JackalScreenWatcher

该工具用于收集受害者桌面的截图,并将图片发送到远程硬编码的C2服务器:

hxxps://tahaherbal[.]ir/wp-includes/class-wp-http-iwr-client.php

这个特定的网页也被用作JackalSteal组件的C2,这表明这些工具可能是一个独特框架的一部分。

恶意软件可以处理一些可选的参数,并且可以作为输入提供:

· -r分辨率(默认值为1.0);

· -i间隔(默认为10秒)

· -n指定自定义代理id。默认情况下,此值等于%Hostname%\%Username%;

该程序的主要功能包括运行一个线程,该扫描系统上的所有显示器,检查它们的尺寸。然后,它启动一个无限循环,定期检查用户是否在系统上处于活动状态。每当恶意软件检测到用户活动时,它就会捕获屏幕截图并将其发送到远程服务器。

通过监控光标的位置并检查其自上次记录的位置以来是否发生了变化来检测用户活动。上传屏幕截图后,它会等待指定的时间间隔,然后再重新启动循环。

屏幕截图使用HTTP Post请求上传到加密的有效负载中。

加密的有效负载与JackalSteal使用的有效负载相似,包含以下信息:

33.png

AES_Key和AES_IV使用RSA算法使用嵌入在代码中的密钥进行加密,生成的有效负载也使用GZIP算法进行压缩。

远程文件名和屏幕截图数据使用AES算法加密,并使用GZIP压缩。RSA密钥与在其他JackalSteal组件中观察到的密钥相同。

基础设施

GoldenJackal活动的特点是使用受攻击的WordPress网站作为托管C2相关逻辑的方法。研究人员认为攻击者上传了一个恶意的PHP文件,该文件被用作将web请求转发到另一个C2服务器的中继。

目前,还没有任何证据表明这些网站存在漏洞。然而,我们确实观察到,许多网站都在使用过时版本的WordPress,有些网站也被之前上传的web shell感染,这可能是由于低调的黑客活动或网络犯罪活动。远程网页通常会回复一个虚假的“未找到”页面。HTTP响应状态代码为“200”,但HTTP正文显示“未找到”网页。

34.png

在特定情况下,攻击者会提供带有命令列表的有效响应。在这些情况下,前面的正文后面是一长串标准Windows新行序列—“\r\n”,最后是前面提到的分隔符:

35.png

研究人员目前无法将GoldenJackal与任何已知的演员联系起来。

研究人员观察到GoldenJackal和Turla之间有一些相似之处,除此之外,研究人员还发现受害者UID生成算法中的代码相似性与Kazuar使用的算法有些重叠。

具体来说,Kazuar获取预定义字符串的MD5哈希值,然后将其与计算机中的四字节唯一“种子”进行异或。种子是通过获取安装操作系统的卷的序列号来获得的。

37.png

JackalControl使用MD5+SHIFT算法。它从计算机中收集一组信息,包括安装操作系统的卷的序列号,以使用MD5算法生成唯一的种子。然后,它使用生成的字节数组,从生成的MD5哈希中每两个连续字节求和,并将生成的字节(模数256)作为构建最终BOT_ID的序列。

38.png

用于生成BOT_ID的代码段

此外,使用.NET开发的工具和受攻击的WordPress网站作为C2是一种常见的Turla TTP。

这两个组织对相同的目标有共同的兴趣,在一个特定的示例中,研究人员观察到一台受害者计算机在GoldenJackal感染前两个月感染了Turla开发的恶意软件。

尽管有这些相似之处,但GoldenJackal和Turla之间还是不一定存在联系,因为这两者都不是Turla独有的。使用受攻击的WordPress网站并不是唯一的TTP。其他组织也在活动中观察到这种技术,例如BlackShadow,另一个活跃在中东的使用.NET恶意软件的APT。代码的相似性与.NET程序中的单个函数有关,该函数可以通过反编译器轻松复制。GoldenJackal可能将该算法用作错误标识。另一种假设是JackalControl背后的开发人员受到Turla的启发,决定复制UID生成算法。最后,对同一目标的共同兴趣很容易解释为受害者是备受瞩目的目标,不同的攻击者可能会认为这些目标很有趣。

总结

GoldenJackal是一个少为人知的APT组织,尽管其于2019年6月就已经被发现,但知道该组织的人并不多。

该组织可能试图通过限制受害者人数来降低其影响力,目标数量非常少,其中大多数与政府或外交机构有关。

本文翻译自:https://securelist.com/goldenjackal-apt-group/109677/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/6xBL
如有侵权请联系:admin#unsafe.sh