勒索病毒Sodinokibi样本分析
勒索病毒Sodinokibi样本分析概述“Sodinokibi勒索病毒在国内首次被发现于2019年4月份,2019年5月24日首次在意大利被发现,在意大利被发现使用RDP攻击的方式进行传播感染,这款病毒被称为GandCrab勒索病毒的接班人”--引用了熊猫正正师傅的描述,更多信息移步到熊猫正正师傅的回答,在参考部分,在今年的5月份公司同事被这个病毒加密了文件,在问了他之后了解到可能是通过RDP的方式传播进来的,因为那段时间前刚好公司要求远程办公就开了Windows的远程控制这里要注意开了Windows远程控制的要记得关闭,除了必须开的,导致这个病毒传播进来了,当然这个病毒还有更多的传播途径(方便大家了解到,这里引用的还是熊猫正正师傅的描述):[*]Oracle Weblogic Server漏洞
[*]Flash UAF漏洞
[*]RDP攻击
[*]垃圾邮件
[*]水坑攻击
[*]漏洞利用工具包和恶意广告下载
可以看到它的传播方式还是很广泛。这次分析这个样本主要还是练习分析能力,原本只是想自己作为比较保存就好,想想发出来也好学习下别人是怎么处理的,因此这篇文章可能有很多的不足,希望能多多指点。
勒索信息
这个Sodinokibi勒索病毒在加密文件后会把文件的后缀改为随机生成的字符串并修改桌面背景,如下
在每个加密的文件加下会生成一个随机字符串-readme.txt的文件,这个文件是帮助被感染用户解密的一个的帮助文档,内容如下---=== Welcome. Again. ===---
[+] Whats Happen? [+]
Your files are encrypted, and currently unavailable. You can check it: all files on you computer has expansion wcv7a380.
By the way, everything is possible to recover (restore), but you need to follow our instructions. Otherwise, you cant return your data (NEVER).
[+] What guarantees? [+]
Its just a business. We absolutely do not care about you and your deals, except getting benefits. If we do not do our work and liabilities - nobody will not cooperate with us. Its not in our interests.
To check the ability of returning files, You should go to our website. There you can decrypt one file for free. That is our guarantee.
If you will not cooperate with our service - for us, its does not matter. But you will lose your time and data, cause just we have the private key. In practise - time is much more valuable than money.
[+] How to get access on website? [+]
You have two ways:
1) Using a TOR browser!
a) Download and install TOR browser from this site: https://torproject.org/
b) Open our website: http://aplebzu47wgazapdqks6vrcv6zcnjppkbxbr6wketf56nf6aq2nmyoyd.onion/AD8AE2F24C5CC9FC
2) If TOR blocked in your country, try to use VPN! But you can use our secondary website. For this:
a) Open your any browser (Chrome, Firefox, Opera, IE, Edge)
b) Open our secondary website: http://decryptor.top/AD8AE2F24C5CC9FC
Warning: secondary website can be blocked, thats why first variant much better and more available.
When you open our website, put the following data in the input form:
Key:
bHE563Uf5xjCVP0OTrVpaUsXNIIi0Xz87I6RYOXK78smBHmCkAkxGPB1Rn/u8VES
vQLObNg//JLVwwSeHHqKTT70tx/+ipwyQbb3g+nXAy71CGfFmExFiBUjH0HcCcfD
+SsZnThV3lyjNH2bnYTNCHNV7b8nDT5PueTSsI7+YAjLGHR+FgDKvo0hS85pAwVC
E/+XRGlSSKEZ7x1uZmr/1vqiSv9SHILRzYU4b4OcTHlfjR61c/vvNZBVJE2ahW2d
OztG84sGjrXyvDw0/Jaaxz17+rLrEE+OagylpleMBlBYR1pRTPJIQ+GMax/OVJiW
x98Sypk0398zpQjkMe/3UR2RQmOaae3mLeGKpwmV56yQ3faa7h57phQ9K1d7b8f4
aNTlihBVQGypYwu6L56C4UM5ne2IIMvgcKDdEQhbcHqgxJpnwZaRTVFVthBJuV4X
Hj178UcnHGyCDuS7El1kXPu3lRtTmz/DHaM8+80Bkyj4Lvme4P5l2V4VDyiCc/+4
Yv8X02LJ2i59iW0risZacwaJ2o1yfmQnGY9P8vFcThnTxS/3g4LpU/pjGc2LmRrB
xZZBHo0DwtJzXOvL34UkUK0CoBvLH+VfcOpRMqq0HORjSVst9/T2UdvmQ7e69vkx
XaKBpivHhB7vq8C8ZARamTkXvyddGb7eWFH8c1yFldVgcqB9AYO4Cf16l1sdaLNE
onfHRroet61szfOUeWv1hvBGqDP+8zeXW6fERf1tt6NvTiIkLh79NcOi3LG8U9hE
0/mu0L0RZHt8O5SxneO+rbsp+JOSB5hwnX+C/4ga6cb3vbgnscYpMa6L6AqDHv0s
9i0Hk5IJuw/tnURfxXKHOetVVHDat6T3f+LF5lbXq7QFSen6XEWXgSuH5tsiFu6U
5Qyp3/a12b6Sb7dOjgmHExYDsL7UAC5tRfA1HhyJ/l2GcqU1jVDZnD3IK+yylPcC
UlLmPHolHX/OyDu4Tx2899iJJ/DY2WqapFqzmyevO60uS2W5iDp5wQnkZc25UhHC
MasfzqYBk98LUjoq6E5vYIalnbH80ScfZqoSC+TcRWrIGdc8TZkkG3UoJ7ZDArbc
NoL86FYCswxFFICbBU8yLKw7X6n1p5MYDER+Ka7zyLenrn6Cp6cKQ/ZY2TZzBEI0
WQVFDEuOybNti8HuBifoIQ==
Extension name:
wcv7a380
-----------------------------------------------------------------------------------------
!!! DANGER !!!
DONT try to change files by yourself, DONT use any third party software for restoring your data or antivirus solutions - its may entail damge of the private key and, as result, The Loss all data.
!!! !!! !!!
ONE MORE TIME: Its in your interests to get your files back. From our side, we (the best specialists) make everything for restoring, but please should not interfere.
!!! !!! !!!
样本分析
在进行分析之前需要获取程序的一些基本信息,例如导入导出表,字符串等内容,这样能帮助快速定位一些关键的调用。
后面的分析中ida内的函数被重名为 mw_xxx格式静态分析
这个样本是2018年11月15日的,使用DIE工具查看样本信息如下
查看编译时间为
没有发现加壳,开始还觉得蛮不错的,这样可以省去了脱壳部分的时间,不过当我用PeBear来查看程序导入信息的时候发现了UPX0 UPX1这两个节区,看来要多用一些工具查一下比较好
开始以为是UPX壳就比较好办了,但实际不是一个真正的UPX壳程序,实际是自定义的壳加载程序和CandCrab类似都是自己的壳。
脱壳首先将样本拖入到x64dbg内,UPX类型的壳一般使用ESP定律 或者在VirualProtect 函数下端点并放行两次,在第二次断下来后单步执行到跳转回OEP位置就能完成脱壳,,
不过今天我用另一个方式也能完成这个脱壳部分,接着就是IAT修复即可。使用IDA打开程序此时提示我们程序可能被加壳了,有些段不正常,如下
这个是预期内的,之后后找到第一条指令PUSHAD,这条指令时压缩壳的一个比较通用的指令特征之一,不过在分析了程序后发现这个这个不是真正的UPX壳,因此不能看到这个标准的特征。如下是汇编指令
因此不能使用上述提到的方法脱壳,为了能脱壳这个程序这里需要在几个关键的Api设置断点
在理清楚要脱壳的点之后,使用x64dbg加载程序接着分别设置断点
如下是设置VirtualAlloc断点,在返回的位置设置断点
运行程序后可以在VirtualAlloc断下来接着等待程序写入pe文件后,在dump即可,如下
将dump的程序保存为sodinokibi_dump.exe。
修复IAT表
使用IDA加载脱壳的程序发现没有导入表,如下
分析程序后发下所有的导入的api是采用hash的方式导入,在动态时导入,如下
hash表
分析程序知道在call sub_406A4D //这里会动态解析api并设置给hash表供后续调用
push 1 call dword_41CB64进入到sub_406A4D -->mw_build_api后如下
经过多次层层分析后来到实际的解析程序mw_resolve_api位置,程序手下转换传入的hash值,经过两次转换,如下
api_hash_1 = (unsigned int)arg_iat_hash ^ (((unsigned int)arg_iat_hash ^ 0x76C7) << 16) ^ 0xAFB9;
api_hash_2 = api_hash_1 >> 21;根据api_hash_2的值来获取动态函数并对应的dll的HANDLE句柄,
之后再次计算api_hash_1 &0x1fffff的值
最后根据计算得到的HANDLE获取IMAGE_EXPORT_DIRECTORY,接着调用mw_get_api_hash 返回的值 &0x1fffff和V5进行比较满足则返回给import_iat_hash_table,这样就能动态导入函数了,如下
为了能更好的分析这个解析过程,需要手动导入Export的结构体
可以看出程序在获取到导出的函数名并调用mw_get_api_hash函数转换并与V15做比较,如果相等则返回对应的函数。分析mw_get_api_hash函数知道传入的导出函数名fn_name每个字节和ch=ch +0x10f * 0x2b,如下
调试看一下解析的好的api都有哪些。这里调试的是dump.exe程序
此时这的程序已经导入并解析完成,此时修复一下IAT
保存新的dump为dump2.exe之后就是IAT Autosearch Get Imports最后修复即可
最后用IDA打开查看如下
在修复了IAT之后,程序的字符串也是被加密使用的,只有动态时机才能被解密,目的还是为了避免被查杀和分析。
程序分析
将修复好dump2.exe使用IDA分析,首先程序会创建一个互斥体用来保证只有一个实例对象运行,使用的互斥体名称是加密的字符串需要在动态阶段解析获取得到,
如下
经过分析这个解密函数是一个RC4的算法,首先使用第一个循环初始化一个sbox,keylength大小在0-255之间,keylength的长度小于0x100
其中keylenght=arg_ptr1+arg_ptr2接着是解密操作
[*]首先初始化两个变量i,j=0
[*]计算i=i+1
[*]j=sbox+j
[*]接着交换两个位置的值, sbox=sbox
[*]执行异或操作result=key ^ sbox]
[*]循环解密上述步骤完成解密
我在gitub上找到了有人写了前部分解密脚本 地址:思路是
[*]获取所有引用的RC4函数
[*]获取指令位置,提取对应的参数值,包括str_tbl_start,offset,key_len,str_len
[*]
[*]获取参数的脚本
[*]
[*]如果是寄存器则将获取寄存器的值,例如上面的text:002748A3 lea eax,
.text:002748A6 push eax ; 去读取寄存器的值,
.text:002748A7 push 56h ; 读取立即数
.text:002748A9 push 0Fh ; 读取立即数
.text:002748AB push 7BEh ; 读取立即数
.text:002748B0 push offset unk_28CC28
.text:002748B5 call mw_rc4_wrapper; Global\206D87E0-0E60-DF25-DD8F-8E4E7D1E3BF0其中获取寄存器的值如下
[*]
[*]接着调用RC4解密解密字符串,添加注释 注释函数我调试时暂时关闭的
[*]
使用python脚本解密字符串如下
可以得到这里创建的Mutex=Global\206D87E0-0E60-DF25-DD8F-8E4E7D1E3BF0同样用脚本将这些解密的字符串标注在函数调用位置
得到运行时的参数一致
在创建完成互斥体后,然后读取配置信息,这个配置信息同样经过了RC4加密,调用如下
为了方便获取所有调用解密的位置,在上一个脚本内添加如下来获取解密配置的参数
解密后的字符串是很长的配置等信息,如下
运行时的数据解密如下
经过整理后即可得到这里解密的数据是配置信息,包括了公钥,域名等配置信息,如下是解析出来的json数据
**为了不影响查看,解密的配置信息放在附件内了**
执行CVE-2018-8440 exp提权
调用mw_is_exp来决定是否利用漏洞,根据解密的数据知道这里是True
在运行时的返回Tru
e
获取当前进程id并调用漏洞利用函数
进入到mw_exp_vul函数后分析,程序会判断系统的文件时间是不是2018年11月,接着判断系统的版本的最低版本是否满足0x501,如果满足则开始读取%systemdir%下的两个驱动文件win32kfull.sys win32k.sys是否存在并且文件是是否符合上述时间如果最低版本小于0x501,则会调用Wow64DisableWow64FsRedirection函数关闭文件重定向到Wow64目录确保能访问到system32目录在64位系统上运行的32位系统执行访问的系统文件会被重定向到Wow64目录下。查了相关的漏洞信息后发现,这两个文驱动文件时可以被利用来做提权漏洞
接着着判断系统是32/64并提取对应的exploit代码并执行
对应的exploit代码64bit exploit
32bit exploit
运行时的调用代码
程序在执行的时候并不做解密操作,这里可以写一个脚本将exploit段提取出来,由于这里暂时不做漏洞代码的分析就不做这个分析了,只需要知道如果这个程序执行成功后执行的进程会完成提权执行。
执行加密流程进程权限提权
首先执行runas来执行提升进程权限
不过在调试分析的时候发现这里并不能进行,因此这里就执行失败。
主要加密流程
获取explorer进程身份
调用ImpersonateLoggedOnUser函数获取explorer进程登录信息
运行时的调用
获取配置信息并读取系统信息
解密处配置信息内容保存在全局变量
调用mw_read_system_info读取系统信息
,
如下是要读取的信息字段内容Volnume
username
computerName
newworkType
localName
languageType
productName
driverType
diskFreeSpace
archiveType将这些信息保存在注册表内,保存的内容格式{"ver":%d,"pid":"%s","sub":"%s","pk":"%s","uid":"%s","sk":"%s","unm":"%s","net":"%s","grp":"%s","lng":"%s","bro":%s,"os":"%s","bit":%d,"dsk":"%s","ext":"%s"}
如下是保存在注册表内的内容
提取出来如下01FED7D8 {"ver":258,"pid":"5","sub":"367","pk":"1g3/QEQPOQ7S3fBLZ0wvu/B9N
01FED858 fpLLvf8mByoN3or9E0=","uid":"AD8AE2F24C5CC9FC","sk":"cioYIoc2p54v
01FED8D8 UqOzEqzUnc362D7IN16QjuFrZUQ9owM5wHwg3Q7xXoR20ZEGbqr6d2L6ZOdYnVa4
01FED958 kdKZMx0DwZ1zpTBMEdUKB/45iazCesPopjCsI6kUuQ==","unm":"user9527","
01FED9D8 net":"USER9527-PC","grp":"WORKGROUP","lng":"en-US","bro":false,"
01FEDA58 os":"Windows 7 Ultimate","bit":64,"dsk":"QwADAAAAAPCf+QcAAAAA4Ot
01FEDAD8 cBAAAAA==","ext":"j5113by3"}....................................
这里的ext是生成的{EXT}-readme.txt的EXT的值保存在注册表内的rnd_ext内最后写入到注册表的SOFTWARE\Refcfg\内容
拼接好readme.txt
调用CreateToolhelp32Snapshot函数遍历进程并关闭
经过分析后发现这里关闭的进程在配置文件内的prc字段内 '...',
"agntsvc.exe",
'...'
避免在加密阶段加密文件失败。
删除卷影备份
下一步是删除卷影备份,防止加密后用户可以利用卷影备份完成重要数据的恢复
cmd.exe /c vssadmin.exe Delete Shadows /All /Quiet & bcdedit /set {default} recoveryenabled No & bcdedit /set {default} bootstatuspolicy ignoreallfailures同时利用bcdedit将recoveryenable为不可用。
遍历文件
紧接着判断是否存在移动设备U盘等并遍历文件保存
驱动类型的取值范围
这里就能知道这个病毒还会对U盘内的文件完成加密。
遍历共享目录文件
共享文件目录一般会有两个场景使用
[*]虚拟机和物理机的共享
[*]两个设备之间共享
创建io线程
开始执行加密,这里加密的是通过CreateIoCompletionPort创建输入/输出(I/O)完成端口,并将其与指定的文件句柄关联,或创建尚未与文件句柄关联的I/O完成端口,允许稍后关联。将打开的文件句柄的实例与I/O完成端口相关联,可以让进程接收到涉及该文件句柄的异步I/O操作完成的通知。
也就是说在后面通过打开文件和读取写入的过程中只要将打开的文件的句柄和指定的进程关联,就能获取到对应的文件内容,就是通过这个方法来获取文件的流完成加密。创建线程的a1是传给io线程要执行的参数,在执行遍历的时候会将文件路径交给线程,之后线程会执行io操作,创建好io服务后,调用文件遍历操作,同时便利得到的文件路劲会传给线程
每次执行读取io前都会调用mw_check_file_path mw_check_file_extension函数进行检查
文件的后缀主要是配置文件内的字段ext内容。执行文件遍历
执行线程在获取到文件路径后调用GetQueuedCompletionStatus判断是读取状态还是写入源文件
加密算法看了之后确实很难分析懂,如果对加密算法很感兴趣的请参考国外研究人员的分析,以后会增加加密算法的分析。https://www.acronis.com/en-gb/articles/sodinokibi-ransomware/为了能得到所有的加密流程都完成,创建加密io、调用遍历文件加密之后使用了循环等待所有的io都完成。
生成桌面图片文件
当加密工作结束,开始创建桌面背景
写入的文件会将之前创建的EXT的值写到图片内
最后保存背景图片到tmp目录下,之后调用SystemParametersInfoW设置用户桌面
如下是生成的图片
回传信息
所有的勒索病毒都会在一开始或者结束阶段回传相关加密信息,Sodinokibi病毒也是如此。
先读取保存在配置文件内的domain,如下
接着拼接处url地址,拼接格式如下https://domain/[ wp-content|static|cont|include|uploads|news|data|admin]//[随机字符串].[jpg|png
|gif]第一部分是将得到的域名和https://进行拼接
接着第二部分的拼接
拼接好第二部分的url
第三部分的url
第四部分
将处理好的url返回
解密处请求头
发起网络请求
使用POST方式将数据返回,发送的数据信息如下
总结执行流程
Sodinokibi勒索病毒的加密流程如下
建议
从上述分析中可以看出,勒索病毒为了防止用户自行恢复备份文件会删除系统提供的备份功能,如果U盘是连接到电脑上文件也会被加密,同时还禁止使用恢复模式,因此要对重要文件做好备份,最好是云备份,勤打补丁,关闭远程访问控制端口3389等。当然,最好还是安装反病毒软件等来减少被感染的风险。
样本特征
sha256BF7114F025FFF7DBC6B7AFF8E4EDB0DD8A7B53C3766429A3C5F10142609968F9
参考
[*]熊猫正正-Sodinokibi解密工具,可解密一千七百多个变种
[*]Taking Deep Dive into Sodinokibi Ransomware
[*]OALabs-Revil-decrypt
[*]CVE-2018-8440
[*]Malware Tales: Sodinokibi
就想知道有没恢复的可能啊
2020/05/2905:21 3,801 mimikatz.txt.pem09v
2020/05/2905:21 237 nl_passwords.txt.pem09v
2020/05/2905:21 254 nl_users.txt.pem09v
2020/05/2905:21 7,548 pem09v-readme.txt
2020/05/2905:21 247 results.txt.pem09v 静静收藏起来,虽然看不懂 这个发上来怎么全乱了{:1_907:},预览和发送出来都不一样了 太屌了....... 向高手致敬 大佬nb 虽然完全看不懂 分析全面逻辑清晰 赞