-
UID:17777
-
- 注册时间2007-05-02
- 最后登录2025-06-18
- 在线时间18759小时
-
- 发帖796355
- 搜Ta的帖子
- 精华0
- 飞翔币213247
- 威望215737
- 飞扬币2679032
- 信誉值8
-
访问TA的空间加好友用道具
- 发帖
- 796355
- 飞翔币
- 213247
- 威望
- 215737
- 飞扬币
- 2679032
- 信誉值
- 8
|
背景本文将重点分析我们在该用户受害设备上提取到的 LockBit 4.0 加密器样本,揭示其程序行为及加密特征。在此前的分析中,我们曾对一款盗版LockBit 3.0加密器进行深入研究,发现其在对MSSQL数据库文件加密时,仅加密了文件头部内容,主体数据并未受损。基于这一特征,我们通过修复数据库结构的方式成功实现了数据恢复,相关技术细节可参考文章 【病毒分析】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告 。我们将在接下来的两篇文章中,深入解析该版本解密器存在缺陷的技术原因,并 免费公开本次成功研发的专属数据恢复工具,欢迎持续关注。 2. 恶意文件基础信息2.1 恶意文件基本信息2.2 勒索信文件名:Restore-My-Files.txt 2.3其他注意事项分析的样本中加密器与 提供的解密器不配套,但核心加密算法完全一致,仅存在密钥差别,后文将详细解释. 附件给出的是自实现的可用解密器. 3.加密后文件分析3.1 威胁分析3.2 加密的测试文件3.2.1 文件1 sierting.txt加密前:  加密后: 3.2.2 文件2 公司logo 透明.png加密前:  [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]加密后: 3.3 加密后文件特征3.3.1 加密后文件名加密文件名 = 原始文件名+.(12bytes随机小写hex字符串) ,例如:sierting.txt.12345678abcd 3.3.2 加密后文件结构在文件中,在被加密数据之后,多出92bytes附加信息,结构如下: 3.3.3 加密算法概览使用自定义512位类sha512哈希算法生成文件密钥的加密密钥,使用了chacha20-poly1305算法,具体使用chacha20作为文件加密算法,文件加密密钥使用ecdh密钥交换算法(x25519)生成,使用poly1305算法和普通的异或计算字符串校验被加密文件的密钥. 4.代码分析4.1 程序执行流程 4.2 相关函数分析4.2.1 脱壳该样本使用自定义加壳器加壳,脱壳方式如下: 使用pe编辑器打开样本文件,去除PE文件头中的aslr配置(动态基址).  [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]入口函数如下: [font=-apple-system, BlinkMacSystemFont, "]找到其中的常量跳转,即为跳往oep的指令: [font=-apple-system, BlinkMacSystemFont, "]动调程序,下硬件断点并跟进,到达oep: [font=-apple-system, BlinkMacSystemFont, "]设置好入口点,自动查找iat即可(如有错误项则删除): [font=-apple-system, BlinkMacSystemFont, "]dump修复好后,打开dump修复后文件,改变data(入口点所在段)属性为下图: [font=-apple-system, BlinkMacSystemFont, "]保存,即脱壳成功. 4.2.2 加密算法相关4.2.2.1 对于此样本中密钥交换的解释假设有两个端点进行密钥交换,为加密端(器)和解密端(器).加密端存有黑客公钥,解密端存有黑客私钥. 加密端加密时候使用随机算法生成每个文件的文件私钥(经过一定处理的随机32bytes长字节串),根据文件私钥和32bytes的数字0x9进行标量乘法,计算出文件公钥写入被加密后的文件,使用文件私钥和黑客公钥生成共享密钥,使用共享密钥进行文件加密. 解密时,读取文件中的文件公钥,与解密器中的黑客私钥进行密钥交换得到与上文相同的共享密钥,然后使用共享密钥解密文件. 4.2.2.2 加密主函数分析多线程部分: [font=-apple-system, BlinkMacSystemFont, "]使用双线程加密,一个获取路径,一个加密路径对应的文件.加密部分: [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]计算计数器的地方有一些干扰指令,但是动调能得出初始结果为1. [font=-apple-system, BlinkMacSystemFont, "]先获取随机密钥(32bytes,后作为文件块密钥),然后将其前[0,24]下标对应byte和[8,32]下标对应byte异或,存入新数组v179.再次生成32bytes随机数,作为x25519的随机标量(文件私钥). 执行x25519标量乘法,即32bytes大数0x9和文件私钥相乘,与黑客公钥交换得到共享密钥v217. 自定义哈希结构体内容(开头部分代码和常数模仿sha512,具有一定迷惑性): [font=-apple-system, BlinkMacSystemFont, "]将字节串拼接(共享密钥+文件公钥),使用自定义哈希计算得到64bytes的结果,取前32bytes.将前面取得的32bytes哈希再次以同样的方法哈希,取前24bytes. 使用得到的24bytes哈希初始化自定义的chacha20密钥ctx,使用自定义的初始化算法. [font=-apple-system, BlinkMacSystemFont, "]自定义chacha20结构体内包含数据如下: [font=-apple-system, BlinkMacSystemFont, "]和标准chacha20的密钥结构相同,此处使用的是8bytes counter和8bytes nonce这一标准.然后加密该结构体.样本中算法与标准chacha20的区别就是此处有加密这64bytes数据. 密钥流生成时,key为一个32bytes字节串,拷贝加密后的ctx中的[0:16]字节到key的[0:16]下标处,再拷贝加密后的ctx中的[48:64]字节到key的[16:32]下标处,拷贝B的[16:24]字节,作为加密文件密钥的nonce传入密钥拓展函数.这些密钥数据用于chacha20-poly1305校验以及加密加密文件用的密钥. 复制代码 隐藏代码//密钥流生成算法int __usercall file_enc_or_gen_key@<eax>( char *action@<edx>, int output@<ecx>, unsigned int input_len, int key, int nonce, __int64 counter){ int i; // ebp int v9; // eax int j; // eax char *v11; // eax int k; // ecx int v14[ 4]; // [esp+0h] [ebp-D0h] BYREF char v15[ 32]; // [esp+10h] [ebp-C0h] BYREF __int64 v16; // [esp+30h] [ebp-A0h] char v17[ 8]; // [esp+38h] [ebp-98h] BYREF int v18[ 16]; // [esp+40h] [ebp-90h] BYREF int v19[ 20]; // [esp+80h] [ebp-50h] BYREF cpy_dw(( int)&unk_420498, ( int)v14, 4); // 拷贝n个dwords cpy_dw(key, ( int)v15, 8); cpy_dw(nonce, ( int)v17, 2); v16 = counter; for ( i = 0; i != input_len >> 6; ++i ) { chacha20_main(v18, v14); // 标准20轮chacha20算法操作 v9 = 0; if ( action ) { while ( v9 != 16 ) { *(_DWORD *)(output + v9 * 4) = *(_DWORD *)&action[v9 * 4] ^ (v18[v9] + v14[v9]); ++v9; } action += 64; output += 64; } else { while ( v9 != 16 ) { *(_DWORD *)(output + v9 * 4) = v18[v9] + v14[v9]; ++v9; } output += 64; action = 0; } LODWORD(v16) = v16 + 1; if ( !(_DWORD)v16 ) ++HIDWORD(v16); } if ( (input_len & 63) != 0 ) { chacha20_main(v18, v14); for ( j = 0; j != 16; ++j ) v19[j] = v18[j] + v14[j]; v11 = a2; if ( action ) v11 = action; for ( k = 0; (input_len & 63) != k; ++k ) *(_BYTE *)(output + k) = *((_BYTE *)v19 + k) ^ v11[k]; zeroit(( int)v19, 64); // 清零n个bytes } zeroit(( int)v18, 64); return zeroit(( int)v14, 64);} 使用chacha20-poly1305算法校验密钥,使用前面拓展的密钥流,输入文件公钥和加密文件的密钥,输出16字节校验码. [font=-apple-system, BlinkMacSystemFont, "]拷贝16bytes校验码,进行第二次校验,得到最终文件尾部附加信息,先行写入文件.第二次校验,生成8bytes随机数,与常量字符串经过一系列运算得到12bytes字符串校验值,实际使用该校验值已经能够较精确地判断文件是否被加密. 第二次校验ida伪码如下: [font=-apple-system, BlinkMacSystemFont, "]第二次校验c语言代码如下: 复制代码 隐藏代码bool is_file(BYTE* a2){ char* magic2= "FBIsosite"; //常量字符串值 BYTE v4 = a2[ 0]; BYTE v8 = a2[ 2] ^ v4 ^ 9; char dst[ 10] = { 0 }; for (DWORD i = 0; i < 9; i++) { *(BYTE*)(a2 + i + 3) ^= v8; *(BYTE*)(a2 + i + 3) -= v8; *(BYTE*)(a2 + i + 3) ^= v4; } memcpy(dst, a2 + 3, 9); if (!strcmp(dst, magic2)) { return true; } return false;} [font=-apple-system, BlinkMacSystemFont, "]文件加密部分掺杂着一些干扰指令,不过不影响分析. [font=-apple-system, BlinkMacSystemFont, "]使用64位整数存储文件大小,保证能加密较大的文件. [font=-apple-system, BlinkMacSystemFont, "]对于小于1mb的文件,全部加密,对于大于1mb的文件,对如下区间作相应处理: 复制代码 隐藏代码伪码变量定义:block_sz = 9 * (file_size / 100) //加密块大小gap_sz = ((file_size - 27 * (file_size / 100)) >> 1)//间隔大小block_start = block_sz + gap_sz //一组(加密+不加密)数据大小以下为加密区间: [0, block_sz] [block_start, block_sz] [block_start * 2, file_size - block_start * 2]以下为不加密区间: [block_sz, gap_sz] [block_start + block_sz, gap_sz] [font=-apple-system, BlinkMacSystemFont, "]使用chacha20分块加密写入文件,分块以避免加密时占用过多内存。4.2.3 程序常规行为4.2.3.1 获取api地址样本采用多次hash获取api地址方法,大致上是先hash获取一次模块基址,再hash api名字获取api地址. 例子(调用NtProtectVirtualMemory): 4.2.3.2 hash算法整个样本统一使用以下hash算法: 4.2.3.3 绕过保护Hook ETW实现绕过保护.  [font=-apple-system, BlinkMacSystemFont, "]4.2.3.4 解密信息解密一些字符串,包含chacha20常量(不再赘述) 和校验用字符串"FBIsosite". [font=-apple-system, BlinkMacSystemFont, "]解密勒索信. [font=-apple-system, BlinkMacSystemFont, "]4.2.3.5 判断受害者地区根据键盘输入法代码检测是否是俄语输入法.  [font=-apple-system, BlinkMacSystemFont, "]4.2.3.6 提权常规提权操作. 4.2.3.7 解析命令行 [font=-apple-system, BlinkMacSystemFont, "]参数如下:(为程序的--help选项输出) 复制代码 隐藏代码-m local:只加密本地文件-m net:包含网络路径-p <path>:加密指定路径-f:强制加密,无视文件夹名限制-k:不执行自删除-q:静默模式,不输出-nomutex:不创建互斥锁,即非单例运行. 原文如下: 4.2.3.8 获取系统信息使用api获取系统架构和版本.  [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]读取pe头获取子系统版本. 4.2.3.9 线程初始化该程序使用生产者-消费者模型.此处创建线程以及用于控制的信号量. 4.2.3.10 自删除根据输入配置决定是否进行自删除.  [font=-apple-system, BlinkMacSystemFont, "]4.2.3.11 删除卷影备份调用wmi删除卷影备份.  [font=-apple-system, BlinkMacSystemFont, "]改变文件索引方式. 4.2.3.12 初始化网络操作初始化socket. [font=-apple-system, BlinkMacSystemFont, "]调用WSAIOctl获取异步客户端连接api ConnectEx.原因不再赘述. [font=-apple-system, BlinkMacSystemFont, "]获取本机地址. [font=-apple-system, BlinkMacSystemFont, "]初始化iocp. 4.2.3.13 扫描445端口遍历arp缓存中的所有ip. [font=-apple-system, BlinkMacSystemFont, "]创建ip遍历获取线程. [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]创建ip连接测试(扫描)线程.即iocp的完成包处理线程. [font=-apple-system, BlinkMacSystemFont, "]4.2.3.14 停止相关服务打开遍历服务对象. [font=-apple-system, BlinkMacSystemFont, "]枚举服务. [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]遍历结果中的服务名.使用前文所述hash算法比对服务名. [font=-apple-system, BlinkMacSystemFont, "]打开服务对象. [font=-apple-system, BlinkMacSystemFont, "]如果服务在运行,则发送停止控制码. [font=-apple-system, BlinkMacSystemFont, "]判断服务是否已停止. [font=-apple-system, BlinkMacSystemFont, "]未停止则再次尝试. [font=-apple-system, BlinkMacSystemFont, "]释放资源. 4.2.3. 15 遍历驱动器拷贝A-Z大写字母表.  遍历所有本地驱动器.  [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "]遍历网络驱动器.  [font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "]判断驱动器类型. 为本地驱动器,立即释放信号量.  [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]为网络驱动器,则进入队列. [font=-apple-system, BlinkMacSystemFont, "]为cd-rom则跳过. [font=-apple-system, BlinkMacSystemFont, "]4.2.3.16 文件路径获取线程等待加密信号量. [font=-apple-system, BlinkMacSystemFont, "]获得信号量后,开始加密.先在每一个路径下写入前文所述勒索信. [font=-apple-system, BlinkMacSystemFont, "]再根据文件后缀白名单和目录白名单,获取要加密的文件目录及其中文件. [font=-apple-system, BlinkMacSystemFont, "][font=-apple-system, BlinkMacSystemFont, "]写入公用缓冲区,由加密线程加密. [font=-apple-system, BlinkMacSystemFont, "]文件后缀白名单如下: 复制代码 隐藏代码[".exe", ".dll", ".sys"] 目录白名单如下: 复制代码 隐藏代码["Temp", "$Recycle.Bin", "$RECYCLE.BIN","System Volume Information", "Boot", "Windows","WINDOWS"] 4.2.3.17 扫描远程桌面 [font=-apple-system, BlinkMacSystemFont, "]4.2.3.18 结束工作
|