关键要点
- SHELBY 恶意软件家族滥用 GitHub 进行命令和控制,窃取数据并检索命令
- 攻击者的 C2 设计存在一个严重缺陷:任何拥有 PAT 令牌的人都可以控制受感染的机器,这暴露了一个重大的安全漏洞
- 未使用的代码和动态有效载荷加载表明该恶意软件正在积极开发中,这表明未来的更新可能会解决当前版本的任何问题
总结
作为我们对新兴威胁的持续研究的一部分,我们分析了一封从伊拉克电信公司电子邮件地址发送并发送给同一家公司其他员工的潜在网络钓鱼电子邮件。
网络钓鱼电子邮件依赖于受害者打开附加的Details.zip
文件并执行其中包含的二进制文件JPerf-3.0.0.exe
。该二进制文件利用脚本驱动的安装系统Inno setup ,其中包含恶意应用程序:
%AppData%\Local\Microsoft\HTTPApi
:HTTPApi.dll
(谢尔比2)HTTPService.dll
(谢尔比装载机)Microsoft.Http.Api.exe
Microsoft.Http.Api.exe.config
已安装的Microsoft.Http.Api.exe
是良性的 .NET 可执行文件。其主要目的是侧载恶意HTTPService.dll
。一旦加载, HTTPService.dll
就会充当加载器,启动与 GitHub 的通信以进行命令和控制 (C2)。
加载程序从 C2 检索特定值,该值用于解密后门负载HTTPApi.dll
。解密后,后门通过反射作为托管程序集加载到内存中,从而无需写入磁盘即可执行,从而逃避传统的检测机制。
截至撰写本文时,该后门程序和加载程序在 VirusTotal 上的检测率都很低。
SHELBYLOADER代码分析
混淆
加载程序和后门均使用开源工具Obfuscar进行混淆,该工具采用字符串加密作为其功能之一。为了绕过这种混淆,我们可以利用带有自定义参数的de4dot 。Obfuscar 使用对字符串解密函数的调用来替换字符串,但通过将该函数的令牌提供给 de4dot,我们可以有效地对代码进行反混淆。使用参数--strtyp
(字符串解密器的类型,在我们的例子中为delegate
)和--strtok
(字符串解密方法的标记),我们可以用相应的明文值替换这些函数调用,从而显示代码中的原始字符串。
沙盒检测
SHELBYLOADER 利用沙盒检测技术来识别虚拟化或监控环境。一旦执行,它将结果发送回C2。这些结果被打包为日志文件,详细说明每种检测方法是否成功识别了沙盒环境,例如:
技术 1:WMI 查询系统信息
该恶意软件执行 WMI 查询( Select * from Win32_ComputerSystem
)来检索系统详细信息。然后,它会检查制造商和型号字段以查找虚拟机的指标,例如“VMware”或“VirtualBox”。
技术2:进程枚举
该恶意软件会扫描正在运行的进程以查找已知的与虚拟化相关的服务,包括:
vmsrvc
vmtools
xenservice
vboxservice
vboxtray
这些进程的存在告诉恶意软件它可能在虚拟化环境中运行。
技术3:文件系统检查
该恶意软件会搜索与虚拟化软件通常相关的特定驱动程序文件的存在,例如:
C:\Windows\System32\drivers\VBoxMouse.sys
C:\Windows\System32\drivers\VBoxGuest.sys
C:\Windows\System32\drivers\vmhgfs.sys
C:\Windows\System32\drivers\vmci.sys
技术 4:磁盘大小分析
恶意软件检查C:
卷的大小。如果大小小于 50 GB,则可能推断该环境是沙盒的一部分,因为许多虚拟机为了测试目的都配置了较小的磁盘大小。
技术5:父进程验证
该恶意软件检查其父进程。如果父进程不是explorer.exe
,则可能表示在自动分析环境中执行,而不是典型的用户驱动场景中执行。
技术6:睡眠时间偏差检测
该恶意软件采用时间检查来检测其睡眠或延迟功能是否正在加速,这是沙箱用来加速分析的常用技术。预期睡眠时间的显著偏差可能会揭示沙盒环境。
技术 7:视频控制器的 WMI 查询
该恶意软件运行 WMI 查询(SELECT * FROM Win32_VideoController)来检索有关系统视频控制器的信息。然后,它将视频控制器的名称与与虚拟机相关的已知值进行比较: virtual
或vmware
或vbox
。
核心功能
恶意软件的加载器代码首先初始化其主类构造函数中的几个变量。这些变量包括:
- GitHub 帐户名称
- 私有存储库名称
- 用于验证和访问存储库的个人访问令牌 (PAT)
此外,该恶意软件还设置了两个计时器,用于以预定义的时间间隔触发特定操作。
其中一个计时器配置为执行后 125 秒触发特定方法。当调用时,该方法通过向 Windows 注册表项SOFTWARE\Microsoft\Windows\CurrentVersion\Run
添加新条目来在受感染的系统上建立持久性。一旦该方法被触发,并且持久化机制被成功执行,那么计时器将停止进一步触发。
该方法使用整型变量来指示其操作的结果。下表描述了每个可能的值及其含义:
ID | 描述 |
---|---|
1 | 持久性设置成功 |
2 | 持久性已设定 |
8 | 无法在密钥中添加条目 |
9 | 磁盘上未找到二进制文件 |
该整数值在首次向 C2 注册时被报告回 C2,从而允许攻击者监视受感染系统上的持久性机制的成功或失败。
第二个计时器配置为触发负责加载后门的方法,该方法在恶意软件启动后 65 秒执行。首先,恶意软件根据系统特定信息的组合生成 MD5 哈希。用于创建哈希的数据格式如下,每个组件用斜杠( /
)分隔:
- 系统上可用的处理器数量。
- 机器的名称(主机名)。
- 与用户帐户关联的域名。
- 当前登录用户的用户名。
- 系统中存在的逻辑驱动器总数。
然后提取该哈希的子集并将其用作受感染机器的唯一标识符。该标识符可帮助攻击者追踪和管理其基础设施内受感染的系统。
生成唯一标识符后,恶意软件使用 HTTPS 请求将新的提交推送到 myToken 存储库。该提交包含一个以唯一标识符命名的目录,其中包含一个名为Info.txt
的文件。该文件存储了有关受感染系统的以下信息:
- 与用户帐户关联的域名。
- 当前登录用户的用户名。
- 沙盒检测结果日志详细说明了哪些技术成功或失败。
- 持久性标志(如上表所述)指示持久性机制的结果。
- 信标事件的当前日期和时间
恶意软件首先尝试在不使用代理的情况下将提交推送到存储库。如果初次尝试失败,它将恢复使用系统配置的代理进行通信。
在受害者首次发出信标并成功注册后,恶意软件会尝试访问它之前创建的相同 GitHub 存储库目录并下载名为License.txt
的文件(我们在检查间隔内没有观察到任何抖动,但服务器可以处理这个问题)。如果存在,该文件包含一个 48 字节的值,用于生成 AES 解密密钥。仅当验证恶意软件未在沙盒环境中运行时,攻击者的后端才会上传此文件。这确保只有经过验证的感染才能接收密钥并将执行链升级到后门。
该恶意软件根据License.txt
的内容生成 AES 密钥和初始化向量(IV)。它首先使用 SHA256 对 48 字节值进行哈希处理,然后使用生成的哈希值作为密钥,并使用前 16 个字节作为 IV。
它继续解密包含后门负载的文件HTTPApi.dll
。解密后,恶意软件使用Assembly.Load
方法将后门反射加载到内存中。这种技术可以让恶意软件直接执行解密的后门,而无需将其写入磁盘。
基于 DNS 的密钥机制
SHELBYLOADER 的另一个变体使用不同的方法进行注册和检索用于生成 AES 密钥和 IV 的字节序列。
首先,恶意软件执行相同的反沙盒方法,根据是否检测到每种技术的沙盒来创建1
或0
字符串。
为了进行 C2 注册,恶意软件在arthurshelby.click
下构建了一个包含三部分的子域名:第一个子域名是一个静态字符串( s
),第二个子域名是使用 Base32 编码的唯一标识符,第三个子域名是使用 Base32 编码的格式为DomainName\HostName >> Anti-Sandboxing Results >> Persistence Flag
连接字符串。
例如,完整的域名可能看起来像 s.grldiyrsmvsggojzmi4wmyi.inevyrcfknfvit2qfvcvinjriffe6ib6hyqdambqgaydambahy7cama.arthurshelby.click
随后,恶意软件对arthurshelby.click
的子域执行多个 DNS 查询。这些查询返回的 IP 地址被连接成一个字节序列,然后按照前面描述的相同过程用于生成用于解密后门的 AES 密钥。
子域名遵循以下格式:
- 第一个子域是
l<index>
,其中索引对应于 DNS 调用的顺序(例如l1
、l2
等),确保字节序列正确组装。 - 第二个子域名是Base32编码的唯一标识符。
SHELBYC2代码分析
后门首先重新生成由加载程序创建的相同唯一标识符。它通过计算之前使用的精确系统特定字符串的 MD5 哈希值来实现这一点。然后,后门会创建一个互斥锁,以确保只有一个恶意软件实例在受感染的机器上运行。互斥锁的命名方式是将字符串Global\GHS
添加到唯一标识符。
65 秒后,后门将执行一个方法,收集以下系统信息:
- 当前用户身份
- 操作系统版本
- 恶意软件的进程ID
- 计算机名称
- 当前工作目录
有趣的是,这些收集到的信息既不在本地使用,也不会被泄露到 C2 服务器。这表明该代码可能是开发过程中遗留的死代码,或者恶意软件仍在积极开发中,并可能计划在未来版本中利用这些数据。
然后,恶意软件将当前时间戳上传到其唯一目录(使用系统的唯一标识符命名)中的 myGit 存储库中名为 Vivante.txt 的文件。该时间戳作为最后的信标时间,使攻击者能够监视恶意软件的活动并确认受感染的系统仍然处于活动状态。“Vivante”一词在法语中翻译为“活着” ,这反映了该文件作为受感染机器的心跳指示器的作用。
接下来,恶意软件尝试下载文件Command.txt
,其中包含操作员发出的在受感染系统上执行的命令列表。
如果Command.txt
不包含任何命令,恶意软件将在另一个名为Broadcast.txt
的文件中检查命令。与Command.txt
不同,该文件位于恶意软件目录之外,用于同时向所有受感染的系统广播命令。这种方法允许攻击者同时在多台受感染的机器上执行操作,从而简化大规模控制。
命令处理表:
Command.txt
文件中的命令可以是处理命令,也可以是使用 Powershell 执行的系统命令。以下是每个处理命令的描述。
/下载
此命令将文件从 GitHub 存储库下载到受感染的机器。它需要两个参数:
- 存储在 GitHub 存储库中的文件的名称。
- 文件在受感染机器上的保存路径。
/上传
此命令将文件从受感染的机器上传到 GitHub 存储库。它需要一个参数:要上传的文件的路径。
/dlextract
此命令从 GitHub 存储库下载一个 zip 文件(类似于/download
),提取其内容,并将其保存到机器上的指定目录中。
/唤起
该命令用于反射加载.NET二进制文件;它需要两个参数:第一个参数是先前下载到受感染机器的 AES 加密的 .NET 二进制文件的路径,第二个参数是用于派生 AES 和 IV 的值,类似于加载器加载后门的方式。
此命令反射性地加载.NET二进制文件,类似于SHELBYLOADER加载后门的方式。它需要两个参数:
- 先前下载到受感染机器的 AES 加密 .NET 二进制文件的路径。
- 用于派生 AES 密钥和 IV 的值。
系统命令
任何不以上述内容开头的命令都将被视为 PowerShell 命令并相应执行。
沟通
该恶意软件不使用后端的Git 工具来发送提交。相反,它制作 HTTP 请求来与 GitHub 进行交互。它使用具有以下结构的 JSON 对象向存储库发送提交:
{
"message": "Commit message",
"content": "<base64 encoded content>",
"sha": "<hash>"
}
恶意软件为请求设置特定的 HTTP 标头,包括:
- 接受:
application/vnd.github.v3+json
- 内容类型:
application/json
- 授权:
token <PAT_token>
- 用户代理:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
请求发送到 GitHub API 端点,构造如下:
https://api.github.com/repos/<owner>/<repo>/contents/<unique identifier>/<file>
访问私有存储库所需的个人访问令牌 (PAT) 嵌入在二进制文件中。这使得恶意软件无需使用标准 Git 工具链即可对存储库进行身份验证并执行操作。
恶意软件的设置方式意味着任何拥有PAT(个人访问令牌)的人理论上都可以获取攻击者发送的命令并访问任何受害机器的命令输出。这是因为 PAT 令牌嵌入在二进制文件中,任何获得它的人都可以使用。
SHELBY家族结论
虽然 C2 基础设施设计得非常奇特,但攻击者忽视了这种方法的重大风险和影响。
我们认为,无论是由授权的红队还是恶意行为者使用这种恶意软件,都构成渎职行为。它使任何受害者能够利用嵌入式 PAT 武器化并控制所有活动感染。此外,如果受害者将样本上传到 VirusTotal 或 MalwareBazaar 等平台,任何第三方都可以访问与感染相关的数据或完全接管感染。
REF8685 活动分析
Elastic 安全实验室通过对第三方数据源的常规收集和分析发现了 REF8685。在研究 REF8685 入侵时,我们发现了一个加载器和一个 C2 植入物,我们认为它们是新型的,这促使我们发布了这份详细的恶意软件和入侵分析。
恶意负载通过目标组织内部发送的高度针对性的网络钓鱼电子邮件传送到位于伊拉克的一家电信公司。电子邮件内容是工程师之间关于管理网络的技术细节的讨论。根据电子邮件的内容和上下文,此诱饵不太可能是外部制作的,这表明工程师端点、邮件服务器或两者都受到了损害。
Dears,
We would appreciate it if you would check the following alarms on Core Network many (ASSOCIATION) have been flapped.
Problem Text
*** ALARM 620 A1/APT "ARHLRF2SPX1.9IP"U 250213 1406
M3UA DESTINATION INACCESSIBLE
DEST SPID
2-1936 ARSMSC1
END
Problem Text
*** ALARM 974 A1/APT "ARHLRF1SPX1.9IP"U 250213 1406
M3UA DESTINATION INACCESSIBLE
DEST SPID
2-1936 ARSMSC1
END
…
该电子邮件包含解决网络警报的行动号召和一个名为details.zip
的压缩附件。该 zip 文件中有一个文本文件,其中包含电子邮件中提到的日志和 Windows 可执行文件 ( JPerf-3.0.0.exe
),该文件启动执行链,导致 SHELBYC2 植入物的投放,从而提供对环境的远程访问。
虽然在 REF8685 入侵中没有观察到,但应该注意的是,VirusTotal 显示JPerf-3.0.0.exe
( feb5d225fa38efe2a627ddfbe9654bf59c171ac0742cd565b7a5f22b45a4cc3a ) 包含在单独的压缩档案 ( JPerf-3.0.0.zip
) 中,并且也是从伊拉克提交的。目前尚不清楚这是否是同一受害者或是此次活动中的其他受害者。文件相似性搜索还识别出一个名为Setup.exe
的第二个植入物,其中有一个附加压缩档案( 5c384109d3e578a0107e8518bcb91cd63f6926f0c0d0e01525d34a734445685c )。
对这些文件( JPerf-3.0.0.exe
和Setup.exe
)的分析表明,它们使用了 GitHub 的C2
和 AES 密钥检索机制(有关更多信息,请参阅恶意软件分析部分)。用于 REF8685 恶意软件的 Github 帐户( arthurshellby
和johnshelllby
)是恶意的,已被 Github 关闭。
值得注意的是,亚瑟和约翰谢尔比是英国犯罪剧电视连续剧《浴血黑帮》中的角色。该节目从 2013 开始制作,直至 2022 年。
域arthurshelby[.]click
指向 2.56.126[.]151
,这是由 Stark Industries (AS44477) 托管的服务器。该VPS托管服务提供商曾在其他大规模网络攻击中提供代理服务。该服务器具有重叠的分辨率:
arthurshelby[.]click
[REDACTED]telecom[.]digital
speed-test[.]click
[REDACTED]airport[.]cloud
[REDACTED]airport[.]pro
其中一个 SHELBYLOADER 样本的压缩档案和 C2 域以伊拉克电信公司 [REDACTED] Telecom 命名。[删除]的覆盖地图主要集中在该国北部和东部的伊拉克库尔德斯坦地区。
“Sharjaairport”表明可能是第三个目标受害者。[删除]国际机场([删除])是阿拉伯联合酋长国一家专门从事空运的国际机场。距迪拜国际机场 (DXB) 14.5 英里(23.3 公里)。
[REDACTED]airport[.]cloud
已解析至新服务器2.56.126[.]157
,运行时间为 1 月21日2025天。随后,它指向 Google DNS、合法的 [REDACTED] 机场服务器,最后指向 Namecheap 停放地址。由斯塔克工业公司 (AS44477) 托管的2.56.126[.]157
服务器也托管着[REDACTED]-connect[.]online
,[删除] 是 [删除] 国际机场的代码。
域 [REDACTED]airport[.]cloud
有一个子域portal.[REDACTED]airport[.]cloud
,该子域在 1 月 23 日到25 、 2025期间短暂指向2.56.126[.]188
。随后,它将流量引导至172.86.68[.]55
,直至撰写本文时。
横幅哈希透视显示了额外的服务器域组合: 195.16.74[.]138
, [REDACTED]-meeting[.]online
。
172.86.68[.].55
服务器还托管mail.[REDACTED]tell[.]com
,这显然是一个针对我们原始受害者的钓鱼域。
网络登录页面托管于hxxps://portal.[REDACTED]airport[.]cloud/Login
( VirusTotal )。
我们评估攻击者利用这两个子域名来获取云登录凭据。一旦这些凭证得到保护(在 [REDACTED] Telecom 的案例中),攻击者就会访问受害者的云电子邮件,并通过利用正在进行的内部电子邮件线程来制作高度针对性的网络钓鱼。
这种武器化的内部电子邮件被用来再次攻击受害者终端。
与此活动相关的所有域名均已采用 ZeroSSL 认证,并已纳入 Stark Industries 基础设施。
入侵分析的钻石模型
Elastic Security Labs 利用钻石模型来描述对手、能力、基础设施和入侵受害者之间的高级关系。虽然钻石模型最常用于单一入侵,并利用活动线程(第 8 节)作为在事件之间建立关系的方式,但以对手为中心(第 7.1.4 节)该方法允许生成单个钻石,尽管有些混乱。
REF8685 和 MITRE ATT&CK
Elastic 使用MITRE ATT&CK框架来记录高级持续性威胁针对企业网络使用的常见策略、技术和程序。
战术
策略代表了技术或子技术的原因。 这是对手的战术目标:采取行动的原因。
技术
技术代表对手如何通过采取行动来实现战术目标。
YARA 规则
Elastic Security 已创建 YARA 规则来识别此活动。以下是用于识别 SHELBYC2 和 SHELBYLOADER 恶意软件的 YARA 规则:
rule Windows_Trojan_ShelbyLoader {
meta:
author = "Elastic Security"
creation_date = "2025-03-11"
last_modified = "2025-03-25"
os = "Windows"
arch = "x86"
category_type = "Trojan"
family = "ShelbyLoader"
threat_name = "Windows.Trojan.ShelbyLoader"
license = "Elastic License v2"
strings:
$a0 = "[WARN] Unusual parent process detected: "
$a1 = "[ERROR] Exception in CheckParentProcess:" fullword
$a2 = "[INFO] Sandbox Not Detected by CheckParentProcess" fullword
$b0 = { 22 63 6F 6E 74 65 6E 74 22 3A 20 22 2E 2B 3F 22 }
$b1 = { 22 73 68 61 22 3A 20 22 2E 2B 3F 22 }
$b2 = "Persist ID: " fullword
$b3 = "https://api.github.com/repos/" fullword
condition:
all of ($a*) or all of ($b*)
}
rule Windows_Trojan_ShelbyC2 {
meta:
author = "Elastic Security"
creation_date = "2025-03-11"
last_modified = "2025-03-25"
os = "Windows"
arch = "x86"
category_type = "Trojan"
family = "ShelbyC2"
threat_name = "Windows.Trojan.ShelbyC2"
license = "Elastic License v2"
strings:
$a0 = "File Uploaded Successfully" fullword
$a1 = "/dlextract" fullword
$a2 = "/evoke" fullword
$a4 = { 22 73 68 61 22 3A 20 22 2E 2B 3F 22 }
$a5 = { 22 2C 22 73 68 61 22 3A 22 }
condition:
all of them
}
观察结果
所有可观察数据均可通过组合 zip 包以 ECS 和 STIX 格式下载。
本研究讨论了以下可观察的结果。
可观测 | 类型 | 名称 | 参考 |
---|---|---|---|
0e25efeb4e3304815f9e51c1d9bd3a2e2a23ece3a32f0b47f829536f71ead17a | SHA-256 | details.zip | 诱饵 zip 文件 |
feb5d225fa38efe2a627ddfbe9654bf59c171ac0742cd565b7a5f22b45a4cc3a | SHA-256 | JPerf-3.0.0.exe | |
0354862d83a61c8e69adc3e65f6e5c921523eff829ef1b169e4f0f143b04091f | SHA-256 | HTTPService.dll | 谢尔比装载机 |
fb8d4c24bcfd853edb15c5c4096723b239f03255f17cec42f2d881f5f31b6025 | SHA-256 | HTTPApi.dll | 谢尔比C2 |
472e685e7994f51bbb259be9c61f01b8b8f35d20030f03215ce205993dbad7f5 | SHA-256 | JPerf-3.0.0.zip | 诱饵 zip 文件 |
5c384109d3e578a0107e8518bcb91cd63f6926f0c0d0e01525d34a734445685c | SHA-256 | Setup.exe | |
e51c6f0fbc5a7e0b03a0d6e1e1d26ab566d606b551c785bf882e9a02f04c862b | SHA-256 | 诱饵 zip 文件 | |
github[.]com/johnshelllby | URL | GitHub 帐户名称 - C2 | |
github[.]com/arturshellby | URL | GitHub 帐户名称 - C2 | |
arthurshelby[.]click | 域名 | DNS 域 | |
speed-test[.]click | 域名 | ||
2.56.126[.]151 | ipv4 | ||
2.56.126[.]157 | ipv4 | ||
2.56.126[.]188 | ipv4 | ||
172.86.68[.]55 | ipv4 | ||
195.16.74[.]138 | ipv4 |