Potato 发表于 2022-8-9 11:39

LockBit 3.0勒索病毒样本分析

相关阅读:
LockBit2.0勒索病毒样本分析
LockBit勒索病毒家族详情


Lockbit3.0是继Lockbit2.0后的新一版本,其延续了2.0版本需要参数启动的特性,包括了自脱壳、反调试、绕过UAC、多线程加密等操作,而且在Lockbit3.0中存在有BlackMatter代码的一些复用。本文分析的样本来自vx-underground:


自脱壳、解析API以及反调试
Lockbit3.0不同于2.0版本,该样本没有再继续使用PECompact进行加壳:


而是使用了自定义的壳对其.text|.data|.pdata进行加壳,并在样本开始运行时就完成对自脱壳,接着程序才能正常运行:


待程序自脱壳后,第二步需要通过动态加载DLL的方式加载所需API,并将API地址填入分配的地址中,该过程加载了非常多的DLL,也可以作为绕过沙箱检测的一种手段:



接下来通过使用未导出函数实现了两种反调试手段:
1.      第一种通过设置线程状态来实现对调试器隐藏。


2.      第二种则通过对一个关键API打补丁来绕过调试器。



解码配置、检查权限并释放图标文件
接下来的操作有解码.pdata中的配置信息,检查默认语言,管理员权限以及系统版本等操作:


配置信息使用了APLib进行压缩,解压缩后中除了包含RSA公钥、0x20长度的空白以及0x18长度的掩码(用于一些判断语句的执行)之外,还包括自定义Base64的编码数据:


经过解码后,这些Base64中包含了目录白名单Hash、文件白名单Hash、扩展白名单Hash、需要结束的进程列表、需要关闭的服务列表以及勒索信息等内容。
在生成勒索信息时,取RSA公钥的前八个字节+随机生成的八字节做为个人ID。


解码配置信息后,接着检查系统安装的默认语言,并且判断是否在其免加密语言列表中,与2.0不同的是多了三种语言区域(1092:鞑靼语;2072:罗马尼亚语-摩尔多瓦;10241:阿拉伯语 - 叙利亚):


接着检查如果没有管理员权限并且系统版本为Win7/WinSer08 R2及以上版本,则通过COM进行提权操作,值得一提的是其对系统API的调用都使用了跳板:


获得管理员权限后,通过取RSA公钥的MD5,并进行Base64编码,取前8字节作为扩展名,如果有非数字和字母则进行替换(+ x,/ i,= z),在获得随机扩展名后生成ReadMe文件名,然后复制Explorer.exe的令牌,用于之后绕过UAC:


然后样本向C:\ProgramData\目录下写入HLJkNskOq.ico文件,并且创建注册表来关联所有HLJkNskOq后缀的文件:




关联之后更新Windows 相应设置,使所有HLJkNskOq后缀文件都使用该图标。
创建线程关闭相关服务与进程
在进入勒索加密主函数之前,需要设置Mutex保证只有一个勒索程序运行:


接着进入主函数中,首先是关闭一系列服务与程序,并删除回收站和卷影文件:



[*]创建线程删除WinDefend、wscsvc、sppsvc等Windows服务(Hash对比)
[*]创建线程删除回收站文件夹中C:\$Recycle.Bin\匹配S-*的所有文件
[*]创建线程删除利用WMI删除卷影文件
[*]主线程枚举并删除vss|sql|svc$|memtas等服务(与2.0相同)
[*]创建线程终止sql|oracle|ocssd|dbsnmp|synctime等进程(与2.0相同)

创建多线程加密
在关闭相关服务与进程后,创建多线程用于等待加密,创建的线程数 = 处理器内核总数 * 2 + 1,并且创建IO端口用于协作加密:


创建好加密线程后通过三种方式对文件进行检索和加密,每种模式加密都会生成不同的密钥:

[*]Exchange邮件服务上的文件
[*]本地磁盘的文件
[*]所在域上的文件





以本地磁盘上的文件加密为例,它会递归地遍历整个磁盘上的文件,并且根据三步来判断当前文件是否需要加密:


1.      如果当前文件不是当前目录(.)、上一层目录(..)、系统文件、隐藏文件,则进行第2步判断。
2.      如果当前文件是文件夹,则通过文件夹名称Hash比对来判断是否存在于白名单中,如果不在,则将该文件夹加入要遍历的文件夹数组中。
3.      如果当前文件是文件,则需要分别判断其名称和扩展的Hash是否存在于白名单中,接着判断文件大小是否为0,最后判断是否为ReadMe文件,如果都不是,则该文件将会被加密。
Lockbit加密时对于每个文件的加密都有各自的密钥,所以加密之前需要生成固定的加密结构体:



在得到加密结构体后,多个加密线程就可以交替启动进行文件的加密了,加密线程会先将自己的优先级提高:


加密线程根据得到的加密结构体偏移0x28的值来决定当前执行的操作,该处的值有以下四种:

[*]0(读取):表示线程需要根据偏移0x398处值向0x39C读入相应大小的文件内容,然后将偏移0x28的值修改为1,当文件内容读取完后会修改为2。
[*]1(加密):使用偏移0x318解密后的128字节密钥对文件内容进行加密,加密文件内容后对该128字节密钥再次加密,加密轮数减1,通过判断加密轮数为0时则会将模式修改为2,否则将模式修改为1继续读取文件内容。
[*]2(末尾信息):将解密文件所需的内容追加到文件末尾,然后将模式修改为3,准备结束加密过程。
[*]3(结束):结束当前文件的加密。

综上,其加密流程为下图所示:


计算校验和的算法与下述的BlackMatter校验和算法一致:
https://gist.github.com/Demonsla ... b505a243b388b7278fa




清除日志并启动新进程
在所有文件都被加密之后,Lockbit会通过遍历以下两个注册表项的内容来完成日志清除工作:
      SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels
      SYSTEM\CurrentControlSet\Services\EventLog


同时还会删除EventLog相关的服务。
最后绘制并修改桌面背景为Lockbit勒索背景:



然后在C:\ProgramData\目录下写入文件470A.tmp(文件名随机生成,该文件以同样的方式加壳,需经过Lockbit脱壳才能运行)并启动进程,该进程主要负责删除原文件,并在多次修改文件名(将文件名丛A-Z修改一遍再进行删除,删除回收站文件时使用相同的方法),最终移动到C:\F3531C73\4777.tmp。





Leedon_973 发表于 2022-8-11 11:33

是否可以解密?

Potato 发表于 2022-8-12 10:50

pass
页: [1]
查看完整版本: LockBit 3.0勒索病毒样本分析