相关阅读: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;>{
- </div><div style=text-align: left;>bot:{
- </div><div style=text-align: left;>ver:1.8.6.2,
- </div><div style=text-align: left;>uid:060108efb510c98
- </div><div style=text-align: left;>},
- </div><div style=text-align: left;>os:{
- </div><div style=text-align: left;>lang:%s,
- </div><div style=text-align: left;>username:%s,
- </div><div style=text-align: left;>hostname:%s,
- </div><div style=text-align: left;>domain:%s,
- </div><div style=text-align: left;>os_type:windows,
- </div><div style=text-align: left;>os_version:%s,
- </div><div style=text-align: left;>os_arch:%s,
- </div><div style=text-align: left;>disks:%s,
- </div><div style=text-align: left;>id:%s
- </div><div style=text-align: left;>}
- </div><div style=text-align: left;>}
- </div>
复制代码
以上信息经过加密和Base64编码后,连接其他信息,作为数据包以post方式上传到远程服务器securebestapp20[.]com、temisleyes[.]com。
请求包格式:
- <RAND_8_HEXBYTES_0>=<b64encode(custom_enc(MachineInfoJson))>&<RAND_8_HEXBYTES_1>=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;>+0x00: struct _OVERLAPPED
- </div><div style=text-align: left;>++0x00: Internal(I/O请求的状态代码)
- </div><div style=text-align: left;>++0x04: InternalHigh(为I/O请求传输的字节数)
- </div><div style=text-align: left;>++0x08: Offset(用户指定的开始I/O请求的文件位置的低位部分)
- </div><div style=text-align: left;>++0x0C: OffsetHigh(用户指定的开始I/O请求的文件位置的高位部分)
- </div><div style=text-align: left;>++0x10: hEvent
- </div><div style=text-align: left;>+0x14: 文件读写偏移低位DWORD
- </div><div style=text-align: left;>+0x18: 文件读写偏移高位DWORD
- </div><div style=text-align: left;>+0x1C: 每次加密片段时增加偏移量低位DWORD
- </div><div style=text-align: left;>+0x20: 每次加密片段时增加偏移量高位DWORD
- </div><div style=text-align: left;>+0x24: 进行片段数据加密(0/1)
- </div><div style=text-align: left;>+0x28: 加密开关重置(赋值0x24偏移处)
- </div><div style=text-align: left;>+0x2C: 被加密文件句柄
- </div><div style=text-align: left;>+0x30: 数据处理指令:
- </div><div style=text-align: left;>0: 从文件中读取512KB原始数据至缓冲区等待加密,修改指令值为1;
- </div><div style=text-align: left;>1: 加密缓冲区中数据并写回原偏移处,根据偏移增量值修改指令值0或2;
- </div><div style=text-align: left;>2: 写入尾部数据(加密后的对称密钥+密钥的4个CRC32),修改指令为4;
- </div><div style=text-align: left;>4: 数据读写结束后,如果日志功能开启则记录日志,关闭文件句柄。
- </div><div style=text-align: left;>+0x34: 随机生成的64字节Salsa20加密扩展密钥;
- </div><div style=text-align: left;>+0x74: 使用RSA-1024公钥加密后的扩展密钥,结果为128字节;
- </div><div style=text-align: left;>+0xF4: 经RSA加密后的扩展密钥数据的4个CRC32值,16字节;
- </div><div style=text-align: left;>+0x104: 每次的数据读写、加密缓冲区,512KB大小。</div>
复制代码
处理函数:
以FULL加密模式为例,加密后文件结构和文件加密流程如下图:
11. 勒索信息文件&桌面背景修改&自我删除
Darkside在每个被加密目录下会释放一个勒索信。
修改桌面背景。
最后自我删除。
IOCs
- <div style=text-align: left;>9d418ecc0f3bf45029263b0944236884
- </div><div style=text-align: left;>f87a2e1c3d148a67eaeb696b1ab69133
- </div><div style=text-align: left;>securebestapp20[.]com、temisleyes[.]com
- </div><div style=text-align: left;>hxxp://darksidfqzcuhtk2[.]onion/CZEX8E0GR0AO4ASUCJE1K824OKJA1G24B8B3G0P84LJTTE7W8EC86JBE7NBXLMRT</div>
复制代码
|
评论
直达楼层