赞
踩
在2022年,LockBit是全球规模最大的勒索软件变种,且在2023年继续肆虐。自2020年1月以来,使用LockBit的附属机构已针对各个规模的关键基础设施领域的组织进行了攻击,包括金融服务、食品和农业、教育、能源、政府和紧急服务、医疗保健、制造和交通等。LockBit勒索软件运营采用了勒索软件即服务(RaaS)模式,招募合作伙伴利用LockBit勒索软件工具和基础设施进行勒索软件攻击。由于这一行动中存在大量未连接的附属机构,观察到的LockBit勒索软件攻击在策略、技术和程序(TTP)方面呈现出明显的差异。这种观察到的勒索软件TTP差异给致力于维护网络安全和防范勒索软件威胁的组织带来了重大挑战。
对于安全研究人员来说,LockBit 3.0 是一个挑战,因为每个恶意软件实例都需要一个独特的密码才能运行,没有这个密码,分析将变得极其困难或不可能。此外,该恶意软件受到严格的分析保护,并利用大量未记录的内核级 Windows 函数。
然而,在 2022 年 9 月,Twitter 用户 3xp0rtblog 宣布该勒索软件的构建器已被 ali_qushji 泄露,可以从 GitHub 上下载。
"招募合作伙伴":是指LockBit勒索软件运营者主动寻找和吸纳其他人或组织作为合作伙伴或下属(关键基础设施领域的组织的员工),共同参与勒索软件攻击活动。
一旦提取完成,构建器将包含图2中展示的文件,其中Build目录是空的。通过运行Build.bat文件(包括图3中展示的内容),可以自动执行构建过程,并使用勒索软件的独特实例填充Build目录。生成的文件将呈现为图4所示。
构成 Build.bat 的命令,清除 Build 目录,然后调用 keygen 以生成公钥和私钥加密密钥。builder.exe构建工具提供各种命令行选项,生成不同版本的 LockBit 3.0 勒索软件。
在Build.bat文件中,可以使用以下命令来实现:
清除Build目录:
del /s /q Build\*
调用keygen生成公钥和私钥加密密钥:
Keygen
生成LockBit 3.0勒索软件的不同变体:
- builder --variant=variant1
- builder --variant=variant2
- builder --variant=variant3
LB3.exe – 已编译的勒索软件,不需要密码;
LB3Decryptor.exe – 勒索软件的解密器,适用于此处的所有变体;
LB3_pass.exe – 与 LB3 相同.exe但需要密码才能运行。密码和说明可在此目录中的Password_exe.txt中找到;
LB3_RelectiveDLL_DLLMain.dll – 旨在反射加载并在内存中执行的勒索软件版本;
LB3_Rundll32.dll – 勒索软件的 DLL 版本,不需要密码;
LB3_Rundll32_pass.dll – 勒索软件的 DLL 版本,需要在 Password_dll.txt 文件中找到的密码;
Password_dll.txt – 包含密码和使用说明LB3_Rundll32_pass.dll;
Password_exe.txt – 包含密码和使用说明LB3_pass.exe;
priv.key – 此版本唯一的私有加密密钥,用于加密受害者文件;
pub.key – 此版本独有的公共加密密钥,用于生成各种字符串,将此勒索软件实例与受害者联系起来。
keygen.exe
Build.bat 文件首先调用的可执行文件是 keygen.exe。它会为每个构建生成一个独特的加密密钥对和解密标识。根据其描述,Keygen 似乎严重依赖于 MIRACL,这是一个被开发人员广泛认为是椭圆曲线密码学黄金标准的开源 SDK 的 C 软件库。生成的密钥经过 base64 编码并保存到 priv.key 和 pub.key 文件中,然后将公钥的前八个字节转换为十六进制值并保存到 DECRYPTION_ID.txt 文件中,该文件用作唯一的受害者识别号。
builder.exe
根据前面的图4,builder.exe 文件会创建两个执行文件、三个动态链接库和两个文本文件。
它需要现有的 config.json(图 2)和上一步中生成的 priv.key/pub.key 文件,如图 4 所示,builder.exe 文件本身也包含基本组件。在其资源部分有四个执行文件模板,每个用于构建加密器的 DLL 和 EXE 以及解密程序。
按 ID 对每个资源进行描述:
100 – 解密器模板文件
101 – 可执行模板文件
103 – DLL 模板文件
106 – 启用反射加载的 DLL 模板文件
配置文件 config.json 包含通常与勒索软件相关的选项,包括目标文件夹、要排除的文件以及需要终止的进程。如图 6 所示,它还包含用于调整勒索软件行为的设置选项,如下所示的默认选项可以在构建器中找到。
此构建器配置允许针对特定目标环境调整生成的勒索软件。除了这些配置之外,还有以下选项:
要排除的主机、文件、文件夹和文件扩展名
停止和删除的流程和服务
命令和控制域、URL 或 IP 的列表
在受影响的系统上尝试的用户名和密码列表
由于此勒索软件是高度可配置的,因此可能有许多不同的代码路径。
Lockbit 3.0 使用了多种反分析技术来阻碍静态以及动态分析:
入口使用保护壳保护
代码保护
函数混淆
动态解析
函数解密计算跳转
反调试技术
反沙盒技术
对于安全研究人员来说,LockBit 3.0 是一个挑战,因为每个恶意软件实例都需要一个独特的密码才能运行,没有这个密码分析将变得极其困难,也就意味着无法进行沙盒动态分析,该密码保存在生成器的目录下:
程序入口进行了加壳混淆:
该入口通过start的call函数进行解密:
当恶意软件运行完loc_40639C函数后后,保护壳被脱掉:
函数解密计算跳转:
勒索软件会检查调试器:
HEAP_TAIL_CHECKING_ENABLED(0x20)
HEAP_VALIDATE_PARAMETERS_ENABLED (0x40000000)
LockBit 3.0 检查其PEB(过程环境块)中的值,以检查是否设置了:HEAP_VALIDATE_PARAMETERS_ENABLED。
执行NtSetInformationThread 函数,函数参数的值为0xFFFFFFFE 和0x11,这会让勒索软件的线程无法被调试器的断点捕获到。
在程序中,初始的反汇编代码集用于提高可读性,如图 16 所示。这段代码明显不正常,这些代码在调用 kernel32.ExitProcess() 函数后才执行,也就意味着永远无法执行到,只是模仿正常程序的一些函数使用,使其看起来似乎是个正常程序。
LockBit 的函数都是通过hash运算进行匹对指定的函数名称,从而获取地址,“prepare_address_table_lookups”函数(如图 16 所示),该函数包含一个预先生成的哈希表,用于存储一组函数调用,从C:\Windows\System32 文件夹中手动查找所需的 DLL,并手动加载每个函数,进行哈希匹配,找到函数地址。创建哈希表和函数地址后,恶意软件执行完该函数,会释放并清除所有内存,以防止被分析。
如图 16 所示,“check_priv_elevate_if_needed”函数顾名思义。权限提升是通过复制访问令牌来获取特权组中的成员身份来实现的。为了复制令牌,LockBit 3.0 执行了几个步骤:
它将通过专门检查域管理员组中的成员身份来检查它是否已经具有足够的权限。
如果权限不够,它将尝试向自身授予一个预定义列表中包含 15 个特权常量的访问令牌,其中大多数在以非特权用户身份运行时测试失败。
之后,如果仍然没有所需的权限,LockBit 3.0 将找到操作系统进程explorer.exe,并直接调用 ZwOpenProcessToken 函数来读取explorer.exe 的访问令牌。然后,它调用 NtDuplicateToken 函数,传入新获取的令牌句柄,以请求对副本的扩展属性进行读取和写入访问。
获得管理员权限
main 函数中的恶意软件做的第一件事就是检查并创建同步互斥锁。如果存在互斥锁,则进程将退出,确保一次只运行一个勒索软件实例。互斥锁是通过首先获取在pub.key文件中找到的提供的公钥的 MD5 哈希来创建的。生成的 MD5 哈希字符串格式为“{%08X-%04X-%04X-%02X%02X-%02X%02X %02X %02X %02X}”。接下来,计算此格式化字符串的 MD4 哈希值,并将结果传递给格式字符串“Global\%.8x%.8x%.8x%.8x”。例如,完成的互斥体值类似于
Global\ea4ee28880136cbc44dff4ad5a53561f。
接下来,LockBit 3.0 检查操作系统是否正常启动。如果 Windows 在安全模式下启动,勒索软件不会运行其大部分功能,而是设置一个注册表项以在下次正常启动时运行。
在互斥锁就位并满足引导类型后,可执行文件的主要用途将以多线程方式启动。每个线程都具有其任务的特征。有些在进程的生命周期内连续运行,而另一些则仅临时运行一次以执行特定任务。
停止服务:Windows Defender
第一个线程会删除 Windows 安全服务。这是通过利用 Trusted Installer 服务来实现的。Trusted Installer 是一个被广泛使用的受信任的安装程序,通常以其显示名称“Windows 模块安装程序”而知名,它主要用于下载和安装 Windows 更新和可选组件。如果 Trusted Installer 未在运行,则会启动该服务,并复制其访问令牌句柄,以允许当前线程访问大多数其他正在运行的服务。
利用这个令牌,LockBit 3.0 枚举正在运行的服务,并停止并删除与 config.json 中预定义的服务之一匹配的任何服务。完成后线程将退出,并且不会再次启动。
在测试期间,短暂地显示一个小任务栏通知,通知用户 Windows 安全中心服务已停止。但是,由于该服务不仅已停止,而且还被删除,因此无法使用 Windows 通知重新启动该服务。
服务 | 描述 |
wscsvc | Windows 安全中心服务 |
Sppsvc | Microsoft 软件保护服务-许可 |
Wdboot | Windows defender ELAM(早期启动反恶意软件)驱动程序 |
Wdfiter | Windows defender微型筛选器驱动程序 |
Wdnisdrv | Windows defender防病毒网络检查系统驱动程序 |
Wdnissvc | Windows defender网络检查服务 |
Windefend | Windows defender服务 |
请务必考虑 Windows 安全服务是此处的目标,因为这些服务列在默认的config.json 文件中。如果威胁参与者使用此构建器列出其他服务,则很可能会停止其他服务。
删除服务之后,恶意软件将启动几个额外的线程。图 20 中的屏幕截图展示了运行时间最长的线程。第一个优先级是启动处理 Windows 回收站中文件的线程,然后是用于监视和终止 SQL 进程的线程。接下来有一个专门用于将赎金记录写入目录的线程。最后启动的线程是用于对文件进行加密的线程。在下面的屏幕截图中,有三个线程专门用于此操作,但线程数量是动态的,并且会根据可用的系统资源以及排队等待加密的项目的数量和类型而增加或减少。例如,标识为加密的网络资源与本地系统上的网络资源是分开处理的。
LockBit 勒索病毒为LockBit 2.0 升级版本,包含先前2.0所有功能,初始载荷交付给第三方C2(如Cobalt Strike)进行处理。
LockBit 只在管理员权限执行,如果不存在权限则进行 Bypass UAC技术进行管理员权限提升。
LockBit 3.0 将自身备份写入%programdata%目录,然后从此处启动进程。
LockBit 3.0 加密阶段的速度极快,即使传播到相邻主机也同样如此。LockBit 3.0勒索软件的有效负载能够在不到一分钟的时间内完全加密我们的测试主机。
在执行过程中,LockBit 3.0勒索软件会对桌面背景进行更改。
1、回收站的文件无法恢复
存在一个专门的线程来处理在回收站中找到的文件。回收站中的文件并未进行加密;相反,每个文件的内容会被替换为由0x10000字节块中随机生成的字节,然后再将其删除。因此,即使使用解密工具,回收站中的所有文件都无法恢复。
2、终止sql检查
一个独立的线程持续运行,监视并停止任何 SQL 进程。它通过每隔两秒获取一次服务列表来实现此目的。每个服务名称都会传递给isSQL()函数,该函数会查找与字符串"SQL"不区分大小写的任何匹配项。如果名称包含此序列,则会终止该进程。与许多其他线程不同,该线程在进程的生命周期内一直运行,以确保在LockBit 3.0执行勒索活动时,SQL进程不会超过两秒钟运行。
3、删除卷影副本
有一个线程专门用于删除卷影副本。卷影副本是卷的快照,它在一个明确定义的时刻复制卷上保存的所有数据。这是通过调用 IWbemProvider COM 对象并启动进程内服务器以允许对 Windows 管理界面进行查询来完成的。使用它来执行 WMI 查询“SELECT * FROM Win32_ShadowCopy”,然后删除每个返回的卷影副本。
4、写赎金记录
勒索赎金线程会检索并解密嵌入在config.json中定义的勒索赎金地址。该注释将被写入每个未标记为排除的目录中。它的文件名由九个字母数字字符组成,后跟“.README.txt”(例如xEC9do6g6.README.txt)。前缀“.README.txt”是以先前生成的互斥GUID的MD5哈希的前6个字节进行base64编码而得到的。由于这种方法,系统上留下的所有赎金票据都具有相同的名称,但对于该系统是唯一的。
5、加密
文件使用 Salsa-20 算法进行加密。在加密线程期间,包含私钥的内存通过大量使用 RtlEncryptMemory 和 RtlDecyptMemory 进行保护,这使得私钥仅在必要时在内存中以未加密的方式可用。
6、域控制器发现
另一个线程会尝试使用在配置中找到的用户名和密码登录受感染的系统。默认情况下,配置文件(config.json)中的用户名和密码与管理账户相关联。如果有任何登录成功,将评估令牌成员身份是否属于域管理员组,如果是,则进行复制操作。然后,另一个线程会查找并枚举可用的域控制器,获取每个控制器的名称,并尝试使用成功的用户名和密码进行远程登录。
7、连接的驱动器和共享网络资源
其他线程会检查连接的驱动器和网络资源,特别关注安装操作系统的驱动器和网络资源。无论情况如何,这些新发现的路径都将传递给生成其他加密线程的函数。
8、网络流量
命令和控制流量会通过TLS 1.2发送到config.json文件中列出的地址。不幸的是,在此TLS层下,变量及其值是经过AES加密的,并且每个请求的顺序都会被打乱。然而,POST请求的整体格式是一致的,如图22所示。我们始终可以观察到一个POST请求,后跟"/?"和一长串URL样式的variable=value对,用&符号分隔,然后是HTTP/1.1字段。User-Agent字符串是随机的,因此不应包含在签名中,但Connection、Accept-Encoding、Content-Type和Cache-Control字段是常量。数据部分的基本格式也是一致的,但长度可能会有所不同。
尽管如果没有加密密钥,解密截获的网络流量几乎是不可能的,但以下示例提供了对传输信息的一般理解。
9、加密后修改壁纸
加密后,桌面背景将更改为黑色,并带有白色文本,类似于图 23 中的示例。
10、解密器
由于解密器是与构建器一起生成的,我们对其进行了操作和使用的测试。在运行时,将显示一个窗口,用户需要点击右侧的大按钮,上面标有“解密所有加密文件”。点击后,随着文件的解密,"所有解密文件"的计数器会逐渐增加。如图所示,应用程序将一直保持打开状态,但CPU使用率将停止处理文件,表明解密已完成。
回收站没有恢复,所有卷影副本也已被擦除。对于所有常规文件,解密器确实有效,文件已正确恢复,并且LockBit桌面背景已被删除。
策略 | id | 名字 | 描述 |
执行TA0002 | T1559.001 | 组件对象模型 | 用于删除卷影副本 |
T1106 | 原生 API | 大量使用 Windows 本机 API 调用 | |
T1047 | WMI | 用于删除卷影副本 | |
持久性TA0003 | T1547.001 | 注册表运行项 | 如果在安全模式下启动,则将注册表设置为在下次正常启动时启动。 |
权限提升TA0004 | T1134.001 | 令牌模拟 | 使用已知令牌启动进程,目的是复制令牌。 |
防御规避TA0005 | T1562.001 | 禁用或修改工具 | 停止和删除 Windows 安全服务 |
T1562.002 | 禁用 Windows 事件日志记录 | 停止和删除负责事件日志记录的服务 | |
T1562.004 | 禁用系统防火墙 | 停止和删除 Windows 防火墙的服务。 | |
T1562.009 | 安全模式启动 | 在安全模式下启动时更改行为。 | |
T1078.001 | 默认帐户 | 尝试使用默认管理员凭据登录 | |
发现TA0007 | T1083 | 文件和目录发现 | 遍历挂载的磁盘和文件系统 |
T1135 | 网络共享发现 | 遍历所有共享网络资源 | |
T1120 | 外围设备发现 | 定位可移动存储设备 | |
T1057 | 进程发现 | 查找要停止的特定进程 | |
T1018 | 远程系统发现 | 查找域控制器和 DNS 服务器 | |
T1082 | 系统信息发现 | 获取有关操作系统的特定信息 | |
横向移动 TA0008 | T1021.002 | Windows 管理员共享 | 用于与远程网络共享交互的有效帐户的用户 |
指挥与控制TA0011 | T1071.001 | Web 协议 | 使用 HTTP 与 C2 通信 |
T1573 | 加密通道 | TLS 1.2 标准 | |
外泄TA0010 | T1041 | 通过 C2 通道外泄 | 在 POST 请求中发送基本系统信息 |
冲击TA0040 | T1485 | 数据销毁 | 删除回收站和卷影副本 |
T1486 | 数据加密以防影响 | 勒索软件 | |
T1491.001 | 内部污损 | 桌面已更改 |
IOC | 描述 |
C2BC344F6DDE0573EA9ACDFB6698BF4C | MD5生成器文件 |
d6ae7dc2462c8c35c4a074b0a62f07cfef873c77 | SHA1 生成器文件 |
a736269f5f3a9f2e11dd776e352e1801bc28bb699e47876784b8ef761e0062db | SHA256生成器文件 |
71c3b2f765b04d0b7ea0328f6ce0c4e2 | MD5 注册机文件 |
bf8ecb6519f16a4838ceb0a49097bcc3ef30f3c4 | SHA1 注册机文件 |
ea6d4dedd8c85e4a6bb60408a0dc1d56def1f4ad4f069c730dc5431b1c23da37 | SHA256 注册机文件 |
4d388f95a81f810195f6a8dfe86be755 | MD5 资源 100 |
cb6fdb25a15b7797890fadc2b823984f93da5368 | SHA1 资源 100 |
cc3d006c2b963b6b34a90886f758b7b1c3575f263977a72f7c0d1922b7feab92 | SHA256 资源 100 |
87308ec0a44e79100db9dbec588260ec | MD5 资源 101 |
939ff7e5eeaccb0c2f4ee080a8e403e532b6317a | SHA1 资源 101 |
03b8472df4beb797f7674c5bc30c5ab74e8e889729d644eb3e6841b0f488ea95 | SHA256 资源 101 |
4655a7ac60ed48df9b57648db2f567ef | MD5 资源 103 |
02ea524429ba2aefac63fed27e924ab3659f8c00 | SHA1 资源 103 |
a0db5cff42d0ee0de4d31cff5656ed1acaa6b0afab07d19f9f296d2f72595a56 | SHA256 资源 103 |
23a30838502f5fadc97e81f5000c4190 | MD5 资源 106 |
9c1142122370c9b28b13aa147c6e126b3be50845 | SHA1 资源 106 |
ae993930cb5d97caa5a95b714bb04ac817bcacbbf8f7655ec43e8d54074e0bd7 | SHA256 资源 106 |
- import "pe"
- rule LockBit_3_dll
- {
- meta:
- author = "VMware TAU" //bdana
- date = "2022-Oct-12"
- description = "Identifies LockBit 3.0 DLL encryptor by exported function names."
- rule_version = “1”
- yara_version = "4.2.3"
- exemplar_hash = “c2529655c36f1274b6aaa72911c0f4db7f46ef3a71f4b676c4500e180595cac6”
- condition:
- pe.exports("del") and
- pe.exports("gdel") and
- pe.exports("gdll") and
- pe.exports("gmod") and
- pe.exports("pmod") and
- pe.exports("sdll") and
- pe.exports("wdll")
- }
-
- rule LockBit_3_exe
- {
- meta:
- author = "VMware TAU" //bdana
- date = "2022-Oct-12"
- description = "Identifies LockBit 3.0 exe encryptor section names, and artifact section names."
- rule_version = “1”
- yara_version = "4.2.3"
- exemplar_hash = “5202e3fb98daa835cb807cc8ed44c356f5212649e6e1019c5481358f32b9a8a7”
- strings:
- $text = ".text" ascii wide
- $itext = ".itext" ascii wide
- $data = ".data" ascii wide
- $rdata = ".rdata" ascii wide
- $idata = ".idata" ascii wide
- $xyz = ".xyz" ascii wide
- $reloc = ".reloc" ascii wide
- $bss = ".bss" ascii wide
- condition:
- #text > 2 and
- #itext > 1 and
- #data > 1 and
- #rdata > 2 and
- #idata > 3 and
- $reloc and
- $bss and $xyz and not
- for any i in (0..pe.number_of_sections-1) : (
- pe.sections[i].name == ".xyz" or
- pe.sections[i].name == ".bss"
- )
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。