本帖最后由 Potato 于 2021-5-25 16:23 编辑
相关阅读:
Sodinokibi勒索病毒家族,我是链接请点我。
一、 样本信息
文件名:Sodinokibi.exe
MD5:83E02AC0996228C5EE9F07771DD6B11C
SHA1:0C7C658932798BF6F488A5D236B959F6D5F3EF11
二、 样本分析
1. 文件的释放和装载执行
执行开始,释放自身携带的PE文件,自我装载入当前进程空间,跳转到入口点执行代码。
释放的PE文件在执行开始后,判断当前进程是否以管理员权限运行。如果不是,Sodinokibi会以”runas”方式重新启动自身。
重起自身时,系统弹出用户账户控制(UAC)对话框,等待用户选择。一旦用户点击”是”,病毒将以管理员权限执行;如果用户点击”否”,病毒则再次弹出UAC询问弹窗,直至用户点击”是”。
这种情况下可以先使用任务管理器结束Sodinokibi进程,再关闭UAC弹窗。
病毒在管理员权限下运行将拥有更高的文件访问和读写权限,并可以执行诸多高权限操作。
2. 地区豁免
Sodinokibi会获取当前机器的默认语言ID和输入法语言。如果为以下国家语言代码将退出执行,不进行加密。
- 0x419 : 俄语
- 0x422 : 乌克兰语
- 0x423 : 白俄罗斯语
- 0x428 : 塔吉克语
- 0x42B : 亚美尼亚语
- 0x42C : 阿塞拜疆语-拉丁
- 0x437 : 格鲁吉亚语
- 0x43F : 哈萨克语
- 0x440 : 吉尔吉斯语-西里尔语
- 0x442 : 土库曼
- 0x443 : 乌兹别克语-拉丁
- 0x444 : 鞑靼语
- 0x818 : 罗马尼亚-摩尔多瓦
- 0x819 : 俄罗斯-摩尔多瓦
- 0x82C : 阿塞拜疆语-西里尔
- 0x843 : 乌兹别克语-西里尔
- 0x45A : 叙利亚语
- 0x2801 : 阿拉伯语
3. 关闭指定进程和服务
Sodinokibi中的明文字符串几乎全部使用RC4(对称流加密算法)进行加密。通过调试,病毒程序将会匹配并关闭解密出的进程名(主要是数据库、邮箱、浏览器、编辑工具等相关进程)。部分目标进程如下:
- agntsvc
- oracle
- firefox
- ocomm
- encsvc
- thunderbird
- wordpa
- xfssvccon
- powerpnt
- synctime
- msaccess
- infopath
- ocautoupds
- steam
- dbsnmp
- visio
- excel
- thebat
- mspub
- ocssd
- sql
- winword
- tbirdconfig
- dbeng50
- sqbcoreservice
- mydesktopqos
- onenote
- isqlplussvc
- outlook
- mydesktopservice
关闭的目标服务主要与卷影、数据库、反病毒软件等相关:
- vss
- backup
- svc$
- sql
- mepocs
- sophos
- memtas
- veeam
4. 删除卷影备份
对于Windows XP以上版本的操作系统,解密并执行powershell脚本删除卷影
Get-WmiObject Win32_Shadowcopy | ForEach-Object {$_.Delete();}
对于Windows XP及其之前的Windows版本操作系统,使用cmd调用vssadmin删除卷影。修改策略,禁用开机自动修复。
- cmd.exe /c vssadmin.exe Delete Shadows /All /Quiet & bcdedit /set {default} recoveryenabled No & bcdedit /set {default} bootstatuspolicy ignoreallfailures
复制代码
5. 密钥生成过程
Sodinokibi会从自身携带资源中解密出一个JSON格式数据,接着结合JSON数据中的”pk”元素(攻击者ECDH公钥的base64编码值),使用ECDH(椭圆曲线密钥交换算法)生成用户ECDH公私钥,并对其中的私钥进行加密处理。具体过程如下:
(1) 生成ECDH公私钥对sk_user(私钥)和pk_user(公钥),pk_user二进制值写入注册表键SOFTWARE\\ GITFORWINDOWS\\vTGj;
(2) 生成ECDH公私钥对sk_user_2(私钥)和pk_user_2(公钥);
(3) 计算pk*sk_user_2(ecc点乘)值,结果为32字节,pk是JSON中的攻击者公钥,写入SOFTWARE\\ GITFORWINDOWS\\73g,固定的16进制值如下:
53 64 0d 67 db 29 6d 50 d3 11 f6 84 ac 66 ec 22 0e e0 45 f0 e4 13 5d 46 4f 68 e8 c5 de a1 21 19
(4) 计算第(3)步结果的SHA3_256(一种摘要算法)摘要值,结果为32字节,作为加密KEY;、
(5) 生成16字节随机值,记为初始计数值(counter);
(6) 使用第(4)(5)步结果分别作为KEY和Initial_counter_value,使用AES_256_CTR算法加密数据”\x00\x00\x00\x00”+sk_user,加密结果36字节;
(7) 计算第(6)步crc32校验值。
以上各个计算结果共有88字节,作为二进制类型键值写入注册表SOFTWARE\\ GITFORWINDOWS\\Q7PZe。具体分布格式如下:
+0x00 : AES_CTR(\x00\x00\x00\x00+sk_user)
[ key=sha3_256(pk*sk_user_2), counter=initial_counter_value_random ]
+0x24 : pk_user_2
+0x44 : initial_counter_value_random
+0x54 : crc32(offset[0:0x24])
替换pk为硬编码再病毒文件中的另一个攻击者公钥,再次执行第(2)至(7)步,再次得到88字节内容,写入SOFTWARE\\GitForWindows\\BuCrIp。该硬编码攻击者公钥如下:
79 CD 20 FC E7 3E E1 B8 1A 43 38 12 C1 56 28 1A 04 C9 22 55 E0 D7 08 BB 9F 0B 1F 1C B9 13 06 35
通过以上方式生成的88字节结果,攻击者只需要使用对应的私钥即可另行计算得到AES加密密钥从而解密数据(pk*sk_user_2=sk*pk_user_2,ECDH密钥协商)。
6. 信息搜集和上传
利用系统磁盘序列号和处理器信息生成用户的UID。
UID和病毒搜集的其他信息将被AES_256_CTR对称加密算法加密,使用的方式与加密sk_user时一致。使用的攻击者密钥也是硬编码在病毒程序内部:
36 7D 49 30 85 35 C2 C3 68 60 4B 4B 7A BE 83 53 AB E6 8E 42 F9 C6 62 A5 D0 6A AD C6 F1 7D F6 1D
Sprintf输出的待加密信息格式如下:
{
ver:262,
pid:7,
sub:1785, // 以上三者为固定值,可能为病毒版本信息
pk:, // 攻击者公钥
uid:, // uid
sk:, // Q7PZe键值,pk加密sk_user值,base64
unm:, // 用户名
net:, // 计算机名
grp:, // 工作组
lng:, // 语言
bro:(true/false), // 是否为避免加密国家或地区
os:, // 操作系统版本
bit:86/64, // 操作系统位数
dsk:, // 各个磁盘空闲/总容量
ext: // 加密文件扩展名
}
加密后的内容写入SOFTWARE\\GitForWindows\\sLF86MWC键。
最后注册表项SOFTWARE\\GitForWindows下的键值有以下几项:
- 7sg:JSON格式数据中的攻击者公钥;
- BuCrIp:利用硬编码的攻击者公钥加密后的用户公钥pk_user;
- IcZd7OY:加密文件扩展名;
- Q7PZe:利用JSON格式数据中的攻击者公钥加密后的用户公钥pk_user;
- sLF86MWC:加密后的搜集信息
- vTGj:用户公钥pk_user。
注册表sLF86MWC中的键值在所有文件加密完成之后会被上传到多个URI下。URI中的域名部分取自RC4解密出的JSON格式数据dmn元素中,全部遍历进行URI拼接并进行数据发送,其中的一些域名为正常网站。域名如下:
URI路径通过在指定字符串中随机选择进行拼接生成。第1层路径从以下字符串中随机选取:
- images
- pictures
- image
- temp
- tmp
- graphic
- assets
- pics
- game
第2层路径从以下字符串中随机选取:
- wp-content
- static
- content
- include
- uploads
- news
- data
- admin
上传文件名随机生成,文件扩展名从以下字符串中随机选取:
7. 搜索文件进行加密
搜索本地A-Z盘,对可移动磁盘、固定磁盘、网络磁盘进行搜索。
对当前可枚举网络资源进行搜索。
搜索时除了program files和program files (x86)下的sql目录(数据库文件),不对含有以下字符串的路径和文件进行加密。
- $windows.~bt
- perflogs
- appdata
- boot
- tor browser
- program files [ 仍然搜索其中的sql目录 ]
- application data
- mozilla
- programdata
- windows
- intel
- $recycle.bin
- system volume information
- msocache
- $windows.~ws
- windows.old
- program files (x86) [ 仍然搜索其中的sql目录 ]
- google
- iconcache.db [ 以下为文件名 ]
- bootsect.bak
- ntuser.dat
- ntuser.ini
- thumbs.db
- autorun.inf
- ntldr
- boot.ini
- desktop.ini
- bootfont.bin
- ntuser.dat.log
除了文件名和路径之外,根据扩展名,类型为可执行文件(如dll、exe)、文件图标、链接文件或是系统相关文件(如msc、hlp)等文件将不进行加密。部分扩展名如下:
- nls
- mod
- msc
- themepack
- hta
- mpa
- adv
- dll
- theme.. .. ..
对于搜寻到的可加密类型文件,若文件大小大于228字节,Sodinokibi会读取文件尾部的 228字节判断文件是否加密过。已加密过的文件判断方式:
计算尾部空间中偏移176至208共32字节(pk_user_file)内容的crc32校验值,与偏移216处的crc32值(4字节)进行比较,如果相同,说明文件已经被加密过,跳过当前文件。
8. 文件加密方式
文件加密时使用IO完成端口进行线程间数据传送。在加密文件阶段,主线程负责可加密文件的搜寻,并为每个可加密文件生成一个32字节密钥和8字节初始向量IV,生成方式为KEY=SHA3_256(ECCMul(pk_user,sk_user_file)),IV为随机值。
对于大于1MB的文件,Sodinokibi将加密内容大小设置为1MB,加密线程加密文件时根据这个大小加密文件首部1MB内容;如果小于1MB,则文件将被全部加密。
之后将Q7PZe、BuCrIp键值(这两者在所有文件中保持不变),待加密数据字节数以及其他加密所需信息,通过API PostQueuedCompletionStatus传入IO完成端口队列,等待加密线程读取。
加密线程不断调用API GetQueuedCompletionStatus获取完成端口队列中的数据,从而根据接收到的数据对指定文件进行加密。
加密算法采用salsa20(一种对称流加密算法),Key为32字节,iv为8个字节。正式加密时计数器值为1(原为0,但是加密过一次IO完成端口队列中数据包的首部4字节”\x00\x00\x00\x00”,从而自增1)。Salsa的扩展密钥格式:
文件加密代码:
加密完成后文件尾部228字节空间分布:
加密流程和加密后文件格式如下图:
9. 勒索信息
加密完成后病毒会修改系统桌面背景,提醒用户系统文件被加密。
背景图片底色为蓝色,图片中的文字通过DrawText函数写入,其中{ext}为加密后文件扩展名。
All of your files are encrypted!
Find {ext}-readme.txt and follow instructions
病毒在每个被加密的目录下放置勒索信息文件,文件名为{随机字符串}-readme.txt。
勒索信息提示文件中的{EXT}、{UID}和{KEY}分别替换为加密文件扩展名、根据磁盘和处理器信息生成的UID、SOFTWARE\\GitForWindows\\sLF86MWC键值的base64编码值。
提示文件中告知用户有两种方式联系攻击者进行文件恢复。一种是下载Tor浏览器,访问网址hxxp://aplebzu47wgazapdqks6vrcv6zcnjppkbxbr6wketf56nf6aq2nmyoyd.onion/{UID}进行联系;第二种则直接使用已有的浏览器访问http://decryptor.top/{UID}。按攻击者所说,第二种方式容易联系速度较慢。
|
|
|
|
评论
直达楼层