一步一步分析勒索软件Darkside(下)
2021-07-28 10:31:05 Author: www.4hou.com(查看原文) 阅读量:68 收藏

在本文中,我们继续从技术角度为读者深入分析勒索软件Darkside。

一步一步分析勒索软件Darkside(上)

一步一步分析勒索软件Darkside(中)

线程活动:sub_4095AB

该线程首先会解密以下信息:

 1.png

图77

Darkside勒索软件的版本也被解密,如下所示:

 1.png

图78

然后,该软件将解密另一个JSON结构,将用于收集本地机器的数据:

 1.png

图79

之后,该进程会检查驱动器的类型,并寻找DRIVE_REMOVABLE(0x2)、DRIVE_FIXED(0x3)和DRIVE_REMOTE(0x4):

 1.png

图80

GetDiskFreeSpaceExW函数用于检索目标驱动器的信息,如存储容量和可用空间:

1.png

图81

NtDuplicateToken被用来复制一个现有的令牌,并获得一个新的访问令牌的句柄(0xC = TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY 和 0x2 = TokenImpersonation): 1.png

图82

然后,通过调用ZwSetInformationThread例程来修改线程的模拟令牌,如图83所示(0x5 = ThreadImpersonationToken):

1.png

图83

同时,该勒索软件还会检索与当前线程相关的用户名,以及本地机器的NetBIOS名称:

1.png

图84

1.png

图85

另外,机器的当前语言是从“LocaleName”值中检索的,如下图所示:

1.png

图86

NetGetJoinInformation用于获取本地计算机的联接状态信息:

1.png

图87

通过查询“ProductName”值可以提取Windows的产品名称,通过查询“ProductID”值可以提取Windows产品ID,具体如下图所示:

1.png

图88

1.png

图89

该恶意软件构造了以下JSON,其中包含要传输给C2服务器的数据:

 1.png

图90

最终数据如下JSON格式所示:

 1.png

图91

上面的数据将通过自定义加密算法进行加密:

1.png

图92

 1.png

图93

加密运算的结果是base64编码的,如下所示:

 1.png

图94

 1.png

图95

下面的函数用于生成2个随机的4字节值,这些值将用于网络通信。实际上,该恶意软件是使用诸如RDRAND和RDSEED之类的指令来生成随机数(如果支持的话)的,我们将下文对其进行更深入的解读(它也用于生成Salsa20矩阵):

 1.png

图96

网络请求的参数具有以下结构:random_number1=base64(encryptionresult)&random_number2=visit_uid:

 1.png

图97

InternetOpenW函数是使用恶意软件解密的用户代理作为参数调用的:

1.png

图98

InternetConnectW用于连接到端口443上的一个C2服务器(Baroquetees[.]com):

1.png

图99 

然后使用HttpPopenRequestW例程创建HTTP请求句柄,如图100所示:

1.png

图100

此外,这里还有一个对InternetSetOptionW API的调用,该API用于设置句柄的安全标志(0x1f=INTERNET_OPTION_SECURITY_FLAGS):

1.png

图101

然后,该恶意软件使用HttpSendRequestW将POST请求发送到C2服务器:

1.png

图102

1.png

图103

服务器返回的状态代码可以使用HttpQueryInfoW API进行检索(0x13=HTTP_QUERY_STATUS_CODE):

1.png

图104

有趣的是,该勒索软件预期的并不是200状态代码,而是500(内部服务器错误)。如果状态代码不是500,它将使用第二个C2服务器Rumahsia[.]com,并重复上述所有步骤:

 1.png

图105

1.png

图106

接下来,我们继续分析主线程。

这个二进制程序将遍历机器上可用的卷,并使用CreateFileW例程来打开它们:

1.png

图107

DeviceIoControl被用来获取关于磁盘分区的类型、大小和性质方面的信息(0x70048 = IOCTL_DISK_GET_PARTITION_INFO_EX):

1.png

图108

然后,使用CreateThread创建了一个新的线程:

1.png

图109

线程活动:sub_407558

该线程做的唯一活动是使用GetLogicalDriveStringsW API来检索本地机器上的有效驱动器:

1.png

图110

如果卷没有与其相关联的驱动器号,那么该勒索软件就会调用SetVolumeMountPointW API,如下图所示:

1.png

图111

该恶意程序的目标位以下类型的驱动器:DRIVE_REMOVABLE(0x2)、DRIVE_FIXED(0x3)和DRIVE_REMOTE(0x4):

 1.png

图112

CreateFileMappingW函数被用来创建一个命名的文件映射对象(名称为“Local\job0-< Process Id>”则意味着该对象是在会话命名空间中创建的):

1.png

图113

然后,通过调用MapViewOfFile例程(0xF001F=FILE_MAP_ALL_ACCESS),将文件映射的视图映射到进程的地址空间:

1.png

图114

同时,它还会创建名为“local\\job0-< process id >-event”的命名事件对象:

1.png

图115

该勒索软件利用3个参数启动自己,新进程将执行相应的加密操作:

1.png

图116

OpenMutexW用于打开名为“global\\t-job0-< process id >”的命名互斥锁(目前不存在):

1.png

图117

通过调用OpenEventW API(0x1F0003=EVENT_ALL_ACCESS)打开前面创建的事件对象,如图118所示:

1.png

图118

之后,它将创建一个与文件句柄无关的I/O完成端口,主线程将使用该端口向辅助线程发送待加密的数据:

1.png

图119

使用CreateThread例程创建了两个不同的线程来处理文件的加密任务:

1.png

图120

创建用于赎金说明的README< RansomPseudoValue >.TXT文件,并填充到恶意软件加密的每个目录中:

1.png

图121

不过,该进程会避免加密某些特定文件,如下图所示:

1.png

图122

对于扩展名包含在前面解密的文件扩展名列表中的文件,也不会被加密:

1.png

图123

使用CreateFileW和ReadFile函数打开和读取每个目标文件:

1.png

图124

1.png

图125

修改文件扩展名,使其包括< ransompseudovalue >,如下所示:

1.png

图126

同时,还会调用CreateIoCompletionPort函数,将现有的I/O完成端口与FileHandle参数相关联:

1.png

图127

RSA公开指数和RSA模将用于Salsa20矩阵的加密过程,我们将在后面介绍:

1.png

图128

该勒索软件会检查处理器是否支持RDRAND和RDSEED指令。如果支持的话,它将使用其中一个指令来生成56个随机字节,并将8个NULL字节添加到生成的缓冲区中。如果这些指令都不支持的话,该恶意软件将使用rdtsc指令生成确定性的时间戳,以用于提供一个64字节的Salsa20矩阵。

 1.png

图129

 1.png

图130

该线程给出了RSA-1024算法的自定义实现(它不依赖于Windows API)。简单说,就是数据d通过公式(d^exponent)%modulus来生成相应的密文。原始模数的计算是使用加法和减法进行的,下面显示的是部分实现代码:

 1.png

图131

 1.png

图132

Salsa20矩阵使用自定义RSA实现进行加密,如图133所示:

 1.png

图133

然后,使用一个自定义的“哈希”函数进一步处理上述加密结果,从而生成一个16字节的输出结果:

 1.png

图134

将被加密的文件内容追加到将发送到工作线程的缓冲区中:

 1.png

图135

Salsa20矩阵也被添加到缓冲区中,它将被工作线程用来加密文件:

1.png

图136

线程活动:sub_405E7C(文件加密)

文件内容使用自定义的Salsa20实现进行加密,并用密文覆盖缓冲区中的明文:

 1.png

图137

下面是自定义实现中的一个代码片段:

 1.png

图138

先把加密的内容被写入原来的文件,然后写入加密的Salsa20矩阵和哈希值,如以下图所示:

 1.png

图139

1.png

图140

对于这个线程的分析到此结束。下面,我们继续分析主线程。

如果当前目录包含“backup”,那么恶意软件就会将其删除:

1.png

图141

主线程通过调用PostQueuedCompletionStatus例程将上述缓冲区(包括要加密的文件内容等)发送给工作线程:

1.png

图142

我们还发现了一个函数,我们认为它是用来传播恶意软件到域控制器的(我们的环境中没有)。它将调用DsGetDcNameW、DsGetDcOpenW和DsGetDcNextW等函数:

 1.png

图143

Darkside使用NetShareEnum API枚举所有网络共享,并通过迄今为止描述的主要加密例程对每个共享进行加密处理:

 1.png

图144

线程活动:sub_4096A4

下面的JSON也会被线程解密:

 1.png

图145

该文件通过调用RegCreateKeyExW打开以下注册表项:

1.png

图146

通过调用RegQueryValueExW函数检索产品ID:

1.png

图147

计算机GUID是从注册表中提取的,它是表示计算机的唯一标识符:

1.png

图148

1.png

图149

加密完成后,该恶意软件会向C2服务器发送加密统计信息,如:受害者ID、uid、加密文件数、加密文件大小、跳过文件数和运行时间。最后的JSON结构如下所示:

 1.png

图150

如前所述,缓冲区是用自定义算法加密的,并且是经过base64编码的。发送到C2服务器的请求如下图所示:

1.png

图151

如果启用了自删除功能,Darkside将使用shellexecutew删除自身:

1.png

图152

1.png

图153

正如我们在分析开始时所指出的那样,这个二进制程序可以用不同的参数运行:

◼1个参数:filename,表示只对指定的文件进行加密

◼2个参数:“-path” directory,表示只对指定的目录进行加密

◼3个参数:“-work”worker0job0-< process id >,这是由初始进程产生的,前面已经讲过了

在处理快捷方式文件(.lnk文件)时,该勒索软件会以不同的方式处理不同的情况。简单来说,它希望从这个链接中提取文件的完整路径。为此,它会使用{000214F9-0000-0000-C000-0000000046}(IShellLinkW接口)的CLSID来调用CoCreateInstance API:

1.png

图154

不幸的是,Scylla在这里无法带来帮助,因为它不能为我们提供相应的方法。我们发现接下来的两个函数调用可以提取文件/目录的路径:

1.png

图155

1.png

图156

上面提取的文件像也将进行加密处理:

 1.png

图157

参考资料

MSDN: https://docs.microsoft.com/en-us/windows/win32/api/

Fakenet: https://github.com/fireeye/flare-fakenet-ng

Any.run: https://any.run/report/0a0c225f0e5ee941a79f2b7701f1285e4975a2859eb4d025d96d9e366e81abb9/e7a712f5-961a-45b4-a7e5-a0f7196113a5

VirusTotal: https://www.virustotal.com/gui/file/0a0c225f0e5ee941a79f2b7701f1285e4975a2859eb4d025d96d9e366e81abb9/detection

Analysis of Darkside Ransomware v1.8.6.2: https://chuongdong.com/reverse%20engineering/2021/05/06/DarksideRansomware/

Fireeye report: https://www.fireeye.com/blog/threat-research/2021/05/shining-a-light-on-darkside-ransomware-operations.html

https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512

https://forum.powerbasic.com/forum/user-to-user-discussions/source-code/25222-wmi-wrapper-functions

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wmi/3485541f-6950-4e6d-98cb-1ed4bb143441

样本指标

C2域名:  baroquetees[.]com, rumahsia[.]com

SHA256: 0A0C225F0E5EE941A79F2B7701F1285E4975A2859EB4D025D96D9E366E81ABB9

创建的文件: README< RansomPseudoValue >.TXT, %PROGRAMDATA%\< RansomPseudoValue>.BMP, %PROGRAMDATA%\< RansomPseudoValue>.ico

服务名: < RansomPseudoValue >, Service display name:

注册表项: HKCR\< RansomPseudoValue >\DefaultIcon=%PROGRAMDATA%\< RansomPseudoValue>.ico

用户代理:  Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:79.0) Gecko/20100101 Firefox/80.0 (prone to False Positives)

本文翻译自:https://cybergeeks.tech/a-step-by-step-analysis-of-a-new-version-of-darkside-ransomware/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/3ENQ
如有侵权请联系:admin#unsafe.sh