Potato 发表于 2021-5-24 17:21

DarkSide勒索病毒样本分析

相关阅读:DarkSide勒索病毒家族详情

一、概述
本文中Darkside勒索病毒样本为加密模块。该勒索病毒家族采用了常见的RSA1024+salsa20的加密方案。和以往所分析的其他家族勒索病毒相比,Darkside加密模块的不同之处在于可通过内置的配置24字节数组控制执行动作。



配置数组各字节元素含义如下表:

字节偏移+1 功能 备注
1 加密模式 1 – FULL(全部加密)
2 – FAST(加密头部)
其他值 – AUTO(间隔加密)


2 终止待加密文件占用关联进程 0 – 跳过加密被占用文件
1 – 终止不在指定列表中的关联进程


3 加密本地磁盘 0 – 关闭
非0 – 开启


4 加密网络共享资源--
5 CIS地区语言避过--
6 删除卷影--
7 清空回收站--
8 自我删除--
9 CMSTPLUA Bypass UAC--
10 打开进程令牌所有权限--
11 创建log文件,记录执行流程--
12 加密时避过指定目录--
13 加密时避过指定文件名--
14 加密时跳过指定后缀的文件--
15 删除指定目录--
16 对sql文件进行FULL模式加密--
17 终止包含指定字符串的进程--
18 关闭指定服务--
19 修改桌面背景--
20 释放勒索信--
21 完成加密后文件的图标关联--
22 创建互斥量,使程序单例执行--
23 反调试--
24 搜集机器信息,加密编码后上传 机器加密前后各一次
二、代码分析
为对抗静态分析,Darkside对敏感数据进行了加密和压缩,执行开始后进行解压和解密。程序主要通过异或运算解密数据,xorBytesBuffer是由两个硬编码16字节数组生成的256字节数据。


解密以0xDEADBEEF结尾的数据,得到RSA公钥和压缩数据,其中压缩数据使用aPLib压缩算法进行压缩,解压后的数据中包含大量敏感字符串,包括程序版本、uid、加密避过文件名、目录名、关闭进程、服务等数据。

完成解压解密动作后,程序开始后续流程。
1.      命令行参数
   在执行参数方面,程序支持加密指定目录,命令行形式如下:
Darkside.exe [ -path<TargetDir> | TargetDir ]
<TargetDir>支持lnk文件,程序会对其进行解析,获取文件指向的目录。如果程序不含参数,则对机器进行全盘加密。


2.      反调试&Bypass UAC
    当前样本并未开启反调试功能(即配置字节值为0),但是从调用API NtSetInformationThread的参数计算来看,当配置中第23字节值为2时,可实现反调试(ThreadHideFromDebugger=17)。


如果当前执行进程只是普通用户权限,Darkside将使用CMSTPLUA Bypass UAC方式重新执行自身以获取管理员执行权限,并退出当前进程。


接着启用进程令牌所有权限。


3.      加密文件图标关联
    程序首先从注册表中获取MachineGuid,多轮计算多个CRC32值后,取前4字节转16进制字符串后作为加密文件后缀extname、勒索信和log文件名中间部分,例如:ae873964.ico。
    然后创建图标文件%UserProfile%\\AppData\\Local\\<extname>.ico,添加HKCR\\.<extname>注册表项,添加HKCR\<extName>\DefaultIcon注册表键值,为加密后文件关联文件图标。



4.      CIS地区语言检测避过
    和其他勒索病毒家族相似,Darkside同样会通过系统用户语言判断的方式,以避免加密CIS(独立国家联合体)地区的机器。



5.      搜集信息上传
    程序搜集的信息包括:机器使用语言、用户名、主机名、域名、系统类型、系统版本、系统架构、磁盘空间使用情况、id(由MachineGuid生成,20字节):

<div style=text-align: left;&gt;{
</div&gt;<div style=text-align: left;&gt;bot:{
</div&gt;<div style=text-align: left;&gt;ver:1.8.6.2,
</div&gt;<div style=text-align: left;&gt;uid:060108efb510c98
</div&gt;<div style=text-align: left;&gt;},
</div&gt;<div style=text-align: left;&gt;os:{
</div&gt;<div style=text-align: left;&gt;lang:%s,
</div&gt;<div style=text-align: left;&gt;username:%s,
</div&gt;<div style=text-align: left;&gt;hostname:%s,
</div&gt;<div style=text-align: left;&gt;domain:%s,
</div&gt;<div style=text-align: left;&gt;os_type:windows,
</div&gt;<div style=text-align: left;&gt;os_version:%s,
</div&gt;<div style=text-align: left;&gt;os_arch:%s,
</div&gt;<div style=text-align: left;&gt;disks:%s,
</div&gt;<div style=text-align: left;&gt;id:%s
</div&gt;<div style=text-align: left;&gt;}
</div&gt;<div style=text-align: left;&gt;}
</div&gt;

    以上信息经过加密和Base64编码后,连接其他信息,作为数据包以post方式上传到远程服务器securebestapp20[.]com、temisleyes[.]com。
请求包格式:
<RAND_8_HEXBYTES_0&gt;=<b64encode(custom_enc(MachineInfoJson))&gt;&<RAND_8_HEXBYTES_1&gt;=060108efb510c98



在所有文件结束后,程序会再次上传信息,信息主要是加密成功和失败的文件数量、数据大小、加密时间等信息。
6.      清空回收站&删除卷影
    删除固定磁盘和可移动磁盘的回收站文件夹,防止管理员从中恢复数据。

    删除卷影的方式有两种:如果当前进程是WOW64进程,使用命令行删除卷影;否则利用COM接口进行删除。


7.      结束指定服务&进程&备份目录
结束指定服务,与卷影、备份、数据库、反病毒产品等相关。

[*]vss
[*]sql
[*]svc$
[*]memtas
[*]mepocs
[*]sophos
[*]veeam
[*]backup
[*]GxVss
[*]GxBlr
[*]GxFWD
[*]GxCVD
[*]GxCIMgr



终止包含指定字符串的进程,与文本编辑、数据库、浏览器、邮箱、作图等相关。

[*]sql
[*]oracle
[*]ocssd
[*]dbsnmp
[*]synctime
[*]agntsvc
[*]isqlplussvc
[*]xfssvccon
[*]mydesktopservice
[*]ocautoupds
[*]encsvc
[*]firefox
[*]tbirdconfig
[*]mydesktopqos
[*]ocomm
[*]dbeng50
[*]sqbcoreservice
[*]excel
[*]infopath
[*]msaccess
[*]mspub
[*]onenote
[*]outlook
[*]powerpnt
[*]steam
[*]thebat
[*]thunderbird
[*]visio
[*]winword
[*]wordpad
[*]notepad



删除名为backup的所有可能的备份目录。


8.      搜索文件进行加密
搜索目标包括本地固定磁盘、可移动磁盘、网络磁盘、网络共享资源。并且只对其中可用空间大于等于100MB的磁盘进行搜索。
避过以下路径:

[*]$recycle.bin
[*]config.msi
[*]$windows.~bt
[*]$windows.~ws
[*]windows
[*]appdata
[*]application data
[*]boot
[*]google
[*]mozilla
[*]program files
[*]program files (x86)
[*]programdata
[*]system volume information
[*]tor browser
[*]windows.old
[*]intel
[*]msocache
[*]perflogs
[*]x64dbg
[*]public
[*]all users
[*]default
[*]避过文件名:
[*]autorun.inf
[*]boot.ini
[*]bootfont.bin
[*]bootsect.bak
[*]desktop.ini
[*]iconcache.db
[*]ntldr
[*]ntuser.dat
[*]ntuser.dat.log
[*]ntuser.ini
[*]thumbs.db

避过指定后缀文件:
386、adv、ani、bat、bin、cab、cmd、com、cpl、cur、deskthemepack、diagcab、diagcfg、diagpkg、dll、drv、exe、hlp、icl、icns、ico、ics、idx、ldf、lnk、mod、mpa、msc、msp、msstyles、msu、nls、nomedia、ocx、prf、ps1、rom、rtp、scr、shs、spl、sys、theme、themepack、wpx、lock、key、hta、msi、pdb


    对数据库文件进行全盘加密,相应文件通过文件后缀名方式进行识别:sql、sqlite。


    为避免文件被重复加密,程序会检测文件尾部0x90(144)字节进行CRC32校验。校验方式是对0x90字节的尾部数据中前0x80(128)字节进行4次CRC32计算,得到16字节校验值,再和尾部数据最后的16字节进行比较,相同则说明该文件已被加密过。也就是说,144字节的尾部数据中,后16字节通过计算前128字节的CRC32值获取。


9.      终止文件占用关联进程
处理文件发生访问冲突时(比如文件占用),Darkside将尝试关闭文件占用相关进程,但是仅关闭不处于以下列表中的目标。

[*]vmcompute.exe
[*]vmms.exe
[*]vmwp.exe
[*]svchost.exe
[*]TeamViewer.exe
[*]explorer.exe





10.      文件加密方式
    Darkside创建两个I/O完成端口进行数据的传输,使用两个函数对完成端口接收的数据进行处理。


    文件加密方式采用RSA1024 + Salsa20方式的非对称和对称加密组合。RSA1024公钥内置于程序中,执行时解密获取,用于加密文件对称加密密钥。


    程序使用Salsa20对称流加密算法对文件进行加密。该算法原本需要对输入的密钥Key和Nonce值进行密钥扩展,得到4×4 DWORD加密矩阵,共64字节。但是在当前样本中,程序直接生成64字节的随机值作为扩展密钥,使用系统API RtlRandomEx。扩展密钥中的Position处值置0。


    然后RSA-1024公钥用于加密扩展密钥,得到128字节加密结果。对加密结果进行4次交替CRC32计算,得到16字节的校验值。最终对称密钥加密结果+校验值共144字节将被写入加密结束后的文件尾部,用于文件解密和加密文件检测。


根据加密文件时涉及数据的大小,Darkside设置了3种模式:
(1)      FULL:文件内部数据全部加密;
(2)      FAST:最多只加密文件首部1MB;
(3)      AUTO:根据文件大小设置每次加密片段的偏移增量,逐次加密至尾部;例如:小于1MB的每次增加512KB偏移、小于100MB的增加8MB+512KB、小于4000MB的为16MB+512KB、...。


接着,向I/O完成端口发送数据包,由I/O完成端口处理函数进行文件数据的加密和读写。两个I/O完成端口将轮流接收数据包。


I/O完成端口数据包包括以下信息:

<div style=text-align: left;&gt;+0x00: struct _OVERLAPPED
</div&gt;<div style=text-align: left;&gt;++0x00: Internal(I/O请求的状态代码)
</div&gt;<div style=text-align: left;&gt;++0x04: InternalHigh(为I/O请求传输的字节数)
</div&gt;<div style=text-align: left;&gt;++0x08: Offset(用户指定的开始I/O请求的文件位置的低位部分)
</div&gt;<div style=text-align: left;&gt;++0x0C: OffsetHigh(用户指定的开始I/O请求的文件位置的高位部分)
</div&gt;<div style=text-align: left;&gt;++0x10: hEvent
</div&gt;<div style=text-align: left;&gt;+0x14: 文件读写偏移低位DWORD
</div&gt;<div style=text-align: left;&gt;+0x18: 文件读写偏移高位DWORD
</div&gt;<div style=text-align: left;&gt;+0x1C: 每次加密片段时增加偏移量低位DWORD
</div&gt;<div style=text-align: left;&gt;+0x20: 每次加密片段时增加偏移量高位DWORD
</div&gt;<div style=text-align: left;&gt;+0x24: 进行片段数据加密(0/1)
</div&gt;<div style=text-align: left;&gt;+0x28: 加密开关重置(赋值0x24偏移处)
</div&gt;<div style=text-align: left;&gt;+0x2C: 被加密文件句柄
</div&gt;<div style=text-align: left;&gt;+0x30: 数据处理指令:
</div&gt;<div style=text-align: left;&gt;0: 从文件中读取512KB原始数据至缓冲区等待加密,修改指令值为1;
</div&gt;<div style=text-align: left;&gt;1: 加密缓冲区中数据并写回原偏移处,根据偏移增量值修改指令值0或2;
</div&gt;<div style=text-align: left;&gt;2: 写入尾部数据(加密后的对称密钥+密钥的4个CRC32),修改指令为4;
</div&gt;<div style=text-align: left;&gt;4: 数据读写结束后,如果日志功能开启则记录日志,关闭文件句柄。
</div&gt;<div style=text-align: left;&gt;+0x34: 随机生成的64字节Salsa20加密扩展密钥;
</div&gt;<div style=text-align: left;&gt;+0x74: 使用RSA-1024公钥加密后的扩展密钥,结果为128字节;
</div&gt;<div style=text-align: left;&gt;+0xF4: 经RSA加密后的扩展密钥数据的4个CRC32值,16字节;
</div&gt;<div style=text-align: left;&gt;+0x104: 每次的数据读写、加密缓冲区,512KB大小。</div&gt;


处理函数:


    以FULL加密模式为例,加密后文件结构和文件加密流程如下图:


11.      勒索信息文件&桌面背景修改&自我删除
    Darkside在每个被加密目录下会释放一个勒索信。



修改桌面背景。


最后自我删除。


IOCs

<div style=text-align: left;&gt;9d418ecc0f3bf45029263b0944236884
</div&gt;<div style=text-align: left;&gt;f87a2e1c3d148a67eaeb696b1ab69133
</div&gt;<div style=text-align: left;&gt;securebestapp20[.]com、temisleyes[.]com
</div&gt;<div style=text-align: left;&gt;hxxp://darksidfqzcuhtk2[.]onion/CZEX8E0GR0AO4ASUCJE1K824OKJA1G24B8B3G0P84LJTTE7W8EC86JBE7NBXLMRT</div&gt;

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