在本文中,我们继续从技术角度为读者深入分析勒索软件Darkside。
线程活动:sub_4095AB
该线程首先会解密以下信息:
图77
Darkside勒索软件的版本也被解密,如下所示:
图78
然后,该软件将解密另一个JSON结构,将用于收集本地机器的数据:
图79
之后,该进程会检查驱动器的类型,并寻找DRIVE_REMOVABLE(0x2)、DRIVE_FIXED(0x3)和DRIVE_REMOTE(0x4):
图80
GetDiskFreeSpaceExW函数用于检索目标驱动器的信息,如存储容量和可用空间:
图81
NtDuplicateToken被用来复制一个现有的令牌,并获得一个新的访问令牌的句柄(0xC = TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY 和 0x2 = TokenImpersonation):
图82
然后,通过调用ZwSetInformationThread例程来修改线程的模拟令牌,如图83所示(0x5 = ThreadImpersonationToken):
图83
同时,该勒索软件还会检索与当前线程相关的用户名,以及本地机器的NetBIOS名称:
图84
图85
另外,机器的当前语言是从“LocaleName”值中检索的,如下图所示:
图86
NetGetJoinInformation用于获取本地计算机的联接状态信息:
图87
通过查询“ProductName”值可以提取Windows的产品名称,通过查询“ProductID”值可以提取Windows产品ID,具体如下图所示:
图88
图89
该恶意软件构造了以下JSON,其中包含要传输给C2服务器的数据:
图90
最终数据如下JSON格式所示:
图91
上面的数据将通过自定义加密算法进行加密:
图92
图93
加密运算的结果是base64编码的,如下所示:
图94
图95
下面的函数用于生成2个随机的4字节值,这些值将用于网络通信。实际上,该恶意软件是使用诸如RDRAND和RDSEED之类的指令来生成随机数(如果支持的话)的,我们将下文对其进行更深入的解读(它也用于生成Salsa20矩阵):
图96
网络请求的参数具有以下结构:random_number1=base64(encryptionresult)&random_number2=visit_uid:
图97
InternetOpenW函数是使用恶意软件解密的用户代理作为参数调用的:
图98
InternetConnectW用于连接到端口443上的一个C2服务器(Baroquetees[.]com):
图99
然后使用HttpPopenRequestW例程创建HTTP请求句柄,如图100所示:
图100
此外,这里还有一个对InternetSetOptionW API的调用,该API用于设置句柄的安全标志(0x1f=INTERNET_OPTION_SECURITY_FLAGS):
图101
然后,该恶意软件使用HttpSendRequestW将POST请求发送到C2服务器:
图102
图103
服务器返回的状态代码可以使用HttpQueryInfoW API进行检索(0x13=HTTP_QUERY_STATUS_CODE):
图104
有趣的是,该勒索软件预期的并不是200状态代码,而是500(内部服务器错误)。如果状态代码不是500,它将使用第二个C2服务器Rumahsia[.]com,并重复上述所有步骤:
图105
图106
接下来,我们继续分析主线程。
这个二进制程序将遍历机器上可用的卷,并使用CreateFileW例程来打开它们:
图107
DeviceIoControl被用来获取关于磁盘分区的类型、大小和性质方面的信息(0x70048 = IOCTL_DISK_GET_PARTITION_INFO_EX):
图108
然后,使用CreateThread创建了一个新的线程:
图109
线程活动:sub_407558
该线程做的唯一活动是使用GetLogicalDriveStringsW API来检索本地机器上的有效驱动器:
图110
如果卷没有与其相关联的驱动器号,那么该勒索软件就会调用SetVolumeMountPointW API,如下图所示:
图111
该恶意程序的目标位以下类型的驱动器:DRIVE_REMOVABLE(0x2)、DRIVE_FIXED(0x3)和DRIVE_REMOTE(0x4):
图112
CreateFileMappingW函数被用来创建一个命名的文件映射对象(名称为“Local\job0-< Process Id>”则意味着该对象是在会话命名空间中创建的):
图113
然后,通过调用MapViewOfFile例程(0xF001F=FILE_MAP_ALL_ACCESS),将文件映射的视图映射到进程的地址空间:
图114
同时,它还会创建名为“local\\job0-< process id >-event”的命名事件对象:
图115
该勒索软件利用3个参数启动自己,新进程将执行相应的加密操作:
图116
OpenMutexW用于打开名为“global\\t-job0-< process id >”的命名互斥锁(目前不存在):
图117
通过调用OpenEventW API(0x1F0003=EVENT_ALL_ACCESS)打开前面创建的事件对象,如图118所示:
图118
之后,它将创建一个与文件句柄无关的I/O完成端口,主线程将使用该端口向辅助线程发送待加密的数据:
图119
使用CreateThread例程创建了两个不同的线程来处理文件的加密任务:
图120
创建用于赎金说明的README< RansomPseudoValue >.TXT文件,并填充到恶意软件加密的每个目录中:
图121
不过,该进程会避免加密某些特定文件,如下图所示:
图122
对于扩展名包含在前面解密的文件扩展名列表中的文件,也不会被加密:
图123
使用CreateFileW和ReadFile函数打开和读取每个目标文件:
图124
图125
修改文件扩展名,使其包括< ransompseudovalue >,如下所示:
图126
同时,还会调用CreateIoCompletionPort函数,将现有的I/O完成端口与FileHandle参数相关联:
图127
RSA公开指数和RSA模将用于Salsa20矩阵的加密过程,我们将在后面介绍:
图128
该勒索软件会检查处理器是否支持RDRAND和RDSEED指令。如果支持的话,它将使用其中一个指令来生成56个随机字节,并将8个NULL字节添加到生成的缓冲区中。如果这些指令都不支持的话,该恶意软件将使用rdtsc指令生成确定性的时间戳,以用于提供一个64字节的Salsa20矩阵。
图129
图130
该线程给出了RSA-1024算法的自定义实现(它不依赖于Windows API)。简单说,就是数据d通过公式(d^exponent)%modulus来生成相应的密文。原始模数的计算是使用加法和减法进行的,下面显示的是部分实现代码:
图131
图132
Salsa20矩阵使用自定义RSA实现进行加密,如图133所示:
图133
然后,使用一个自定义的“哈希”函数进一步处理上述加密结果,从而生成一个16字节的输出结果:
图134
将被加密的文件内容追加到将发送到工作线程的缓冲区中:
图135
Salsa20矩阵也被添加到缓冲区中,它将被工作线程用来加密文件:
图136
线程活动:sub_405E7C(文件加密)
文件内容使用自定义的Salsa20实现进行加密,并用密文覆盖缓冲区中的明文:
图137
下面是自定义实现中的一个代码片段:
图138
先把加密的内容被写入原来的文件,然后写入加密的Salsa20矩阵和哈希值,如以下图所示:
图139
图140
对于这个线程的分析到此结束。下面,我们继续分析主线程。
如果当前目录包含“backup”,那么恶意软件就会将其删除:
图141
主线程通过调用PostQueuedCompletionStatus例程将上述缓冲区(包括要加密的文件内容等)发送给工作线程:
图142
我们还发现了一个函数,我们认为它是用来传播恶意软件到域控制器的(我们的环境中没有)。它将调用DsGetDcNameW、DsGetDcOpenW和DsGetDcNextW等函数:
图143
Darkside使用NetShareEnum API枚举所有网络共享,并通过迄今为止描述的主要加密例程对每个共享进行加密处理:
图144
线程活动:sub_4096A4
下面的JSON也会被线程解密:
图145
该文件通过调用RegCreateKeyExW打开以下注册表项:
图146
通过调用RegQueryValueExW函数检索产品ID:
图147
计算机GUID是从注册表中提取的,它是表示计算机的唯一标识符:
图148
图149
加密完成后,该恶意软件会向C2服务器发送加密统计信息,如:受害者ID、uid、加密文件数、加密文件大小、跳过文件数和运行时间。最后的JSON结构如下所示:
图150
如前所述,缓冲区是用自定义算法加密的,并且是经过base64编码的。发送到C2服务器的请求如下图所示:
图151
如果启用了自删除功能,Darkside将使用shellexecutew删除自身:
图152
图153
正如我们在分析开始时所指出的那样,这个二进制程序可以用不同的参数运行:
◼1个参数:filename,表示只对指定的文件进行加密
◼2个参数:“-path” directory,表示只对指定的目录进行加密
◼3个参数:“-work”worker0job0-< process id >,这是由初始进程产生的,前面已经讲过了
在处理快捷方式文件(.lnk文件)时,该勒索软件会以不同的方式处理不同的情况。简单来说,它希望从这个链接中提取文件的完整路径。为此,它会使用{000214F9-0000-0000-C000-0000000046}(IShellLinkW接口)的CLSID来调用CoCreateInstance API:
图154
不幸的是,Scylla在这里无法带来帮助,因为它不能为我们提供相应的方法。我们发现接下来的两个函数调用可以提取文件/目录的路径:
图155
图156
上面提取的文件像也将进行加密处理:
图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/如若转载,请注明原文地址