Potato 发表于 2019-11-15 11:48

Sodinokibi勒索病毒样本分析

相关阅读:
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)

替换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


上传文件名随机生成,文件扩展名从以下字符串中随机选取:

[*]png
[*]jpg
[*]tmp




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}。按攻击者所说,第二种方式容易联系速度较慢。

简简单单chao 发表于 2019-11-15 15:14

给小姐姐点赞

360fans_GLdNML 发表于 2020-2-17 16:02

该病毒会贮存在本机中吗?我将系统资料全部清除干净,再重新安装软件有用么?

360fans_LjSKE0 发表于 2020-3-7 16:28

半年前中的,只能付钱恢复吗
页: [1]
查看完整版本: Sodinokibi勒索病毒样本分析