TeslaCrypt勒索病毒
0x00 概述
基本信息
样本名称 | tfukrc.exe |
---|---|
样本类型 | 勒索病毒 |
样本大小 | 235KB(240,640字节) |
MD5 | 72CCC18F3038E19273010D45AC2142CE |
简介
该病毒原名为Tesla Crypt勒索病毒,勒索信息中提示是通过RSA加密算法进行加密的,但通过分析,发现该样本是通过AES加密算法对文件进行大量的加密操作,从而进行勒索。由于他的主密钥已经由开发者公布,故该勒索病毒是可以进行解密的。
流程图
0x01 样本细节详细分析
样本行为分析
1.文件写入行为分析
- 运行样本后,该样本复制自身文件,到C:\Users<username>\Documents\ 目录下,并更名为一个随机名:这里是lohdrw.exe,如图1:
- 然后该样本结束自身,并调用被释放出来的lohdrw.exe程序,对文件进行了大量的写入行为,如图2所示:
打开被写入过的txt文件,发现内容都被加密过了,如图3:
2.进程分析
查看进程树,逐条进行分析。进程树如图4:
运行该样本后,释放了lohdrw.exe,并运行了改exe程序。然后该exe对文件进行了大量的写入,可见图2。
然后lohdrw.exe先后调用了两次vssadmin.exe(卷影拷贝服务)。执行了如下命令。
1
vssadmin.exe Delete Shadows /ALL /Quiet
静默删除全部卷影副本。防止通过本地恢复。如图5:
图5 然后调用NOTEPAD.exe,执行病毒路径下的txt文件,弹出勒索信息内容。如图6:
图6 最后调用cmd执行如下命令,删除自身。如图7:
1
2cmd /c DEL C:\Users john\DOCUMENT\Vohdrw.exe>>NUL
cmd /c DEL C:\Users john\Desktop\tfukrc\tfukrc.exe >>NUL图7
3.网络行为分析
- 样本进行了大量的网络行为,如图8:
4.注册表行为分析
- 修改注册表,添加了自启动项,在注册表HRCU\Software\Microsoft\Windows\CurrentVersion\Run目录下添加键值,并设置路径为释放出的lohdrw.exe。如图9
样本详细分析
找到主函数入口:
首先找到主函数入口点,从_tmainCRTStartup中找到主函数入口点wWinMain。如下图:
反沙箱
进入主函数我WinMain中后,该样本首先初始化了COM组件,并调用了FIlterGraph组件,来检查音频设备是否存在,从而判断是否是沙箱环境。若判断是沙箱环境,直接退出程序,不再执行。如图:
关闭安全警告弹窗
由于样本的传播途径可能由很多种,其中若是通过IE浏览器下载的话,会默认再所下载的文件中默认添加一个隐藏文件流:filename:zone.identifier。如果有该隐藏文件流,再运行该程序的时候,会弹出警告窗口。
所以该样本获取到完整文件路径后,通过字符串拼接出:filename:zone.identifier,然后将其删除。来阻止弹出警告窗口。如图:
解密指令与勒索信息
该样本通过解密函数,解密出后面所用到的一些数据信息。其中调用了下图中init_key_encode_42B00函数初始化了一个大小为244字节的密钥,然后通过该密钥去解密信息。如下图:
其中解密出来的数据都有:解密出要加密的文件后缀名;解密出勒索提示信息的文件名;解密出要执行指令;解密出而异域名以及网络请求头;以及勒索文本信息
要加密的文件类型,就是解密出来的后缀名。解密出的后缀名,如表1:
1
.r3d .ptx .pef .srw .x3f .der .cer .crt .pem .odt .ods .odp .odm .odc .odb .doc .docx .kdc .mef .mrwref .nrw .orf .raw .rwl .rw2 .mdf .dbf .psd .pdd .pdf .eps .jpg .jpe .dng .3fr .arw .srf .sr2 .bay .crw .cr2 .dcr .ai .indd .cdr .erf .bar .hkx .raf .rofl .dba .db0 .kdb .mpqge .vfs0 .mcmeta .m2 .lrf .vpp_pc .ff .cfr .snx .lvl .arch00 .ntl .fsh .itdb .itl .mddata .sidd .sidn .bkf .qic .bkp .bc7 .bc6 .pkpass .tax .gdb .qdf .t12 .t13.ibank .sum .sie .zip .w3x .rim .psk .tor .vpk .iwd .kf .mlx .fpk .dazip .vtf .vcf .esm .blob .dmp .layout .menu .ncf .sid .sis .ztmp .vdf .mov .fos .sb .itm .wmo .itm .map .wmo .sb .svg .cas .gho .syncdb .mdbackup .hkdb .hplg .hvpl .icxs .docm .wps .xls .xlsx .xlsm .xlsb .xlk .ppt .pptx .pptm .mdb .accdb .pst .dwg .xf .dxg .wpd .rtf .wb2 .pfx .p12 .p7b .p7c .txt .jpeg .png .rb .css .js .flv .m3u .py .desc .xxx .litesql wallet .big .pak .rgss3a .epk .bik .slm .lbf .sav .re4 .apk .bsa .ltx .forge .asset .litemod .iwi .das .upk .d3dbsp .csv .wmv .avi .wma .m4a .rar .7z .mp4 .sql .bak .tiff
表1 解密出来的指令,如表2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40"windir"
"%s\system32\cmd.exe"
"/c start "" ""
"runas"
"vssadmin.exe"
"Delete Shadows /All /Quiet "
"open"
"%s\%s"
"%s\%s.exe"
"SeDebugPrivilege"
"Software\%s"
"data"
"S-1-5-18\"
"S-1-5-18\Software\MSVCC\"
"%X%X%X%X%X%X%X%X"
"Software\MSVCC\"
"FIX"
"\+recover+file.txt"
"%s\n%s\n%S\n%d\n"
"image/png"
"Software\Microsoft\Windows\CurrentVersion\Run"
"%s\SYSTEM32\CMD.EXE /C START "" ""
"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies"
"EnableLinkedConnections"
"taskmg"
"regedi"
"procex"
"msconfi"
"cmd"
"reg add HKEY_CURRENT_USER\Software\Microsoft\Windo"
".com"
"REcovER"
"%s\+%s+%s+%s"
".png"
".txt"
".html"
"A:\"
"B:\"
"\*.*"
"recove"表2 解密出的URL和请求包头,如表3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16"http://videoaminproduktion.de/plugins/binstr.php"
"http://clubsaintandre.fr/PostsImages/binstr.php"
"http://affiliateproductes.com/binstr.php"
"http://ptgp.pl/tmp/binstr.php"
"http://strategicdisaster.info/wordpress/wp-content/plugins/binstr.php"
"http://minteee.com/PostsImages/binstr.php"
"Sub=%s&dh=%s&addr=%s&size=%lld&version=4.0&OS=%ld&ID=%d&inst_id=%X%X%X%X%X%X%X%X"
"0324532423723948572379453249857"
"Mozilla/5.0 (Windows NT 6.3 rv:11.0) like Gecko"
"Content-Type: application/x-www-form-urlencoded"
"*/*"
"Crypted"
"Ping"
"data=%s"
"POST"
"INSERTED"
判断进程TOKEN的完整性和样本所在路径
然后判断当前进程token的完整性,如果当前进程的标签完整性是低的话,便执行下图中的Elevate_privileges_407100,通过执行cmd命令runas,以管理员权限再次运行一次。
Elevate_privileges_407100,通过ShellExecuteExw执行,拼接出的指令:
1 | c:\windows\system32\cmd.exe /c strat xxxxx.exe runas |
创建新进程
然后再判断文件的路径是否在”我的文档”的目录下,如果不在的话,将自身复制到到”我的文档”目录下更名为随机生产的6位随机字符串,并修改文件属性为隐藏。然后删除源文件,结束当前进程。创建新的进程执行复制出来的新程序。也就是在样本行为分析图1抓取到的行为。
若在”我的文档”目录下,则继续执行。
创建互斥体
通过函数CreateMutexw创建互斥体9-9-9-9。当互斥体存在时,直接结束。
提权
提升进程权限,提升权限为SeDebugPrivilege。如下图:
创建线程1:监控进程
创建线程1,线程1主要监控所有进程,时时遍历所有进程,当遇到taskmg;regedi;procex;msconfi;cmd,就立马结束这些进程。如下图:
创建线程2:删除卷影拷贝
再创建线程2之前,该样本先获取了当前操作系统的信息,判断操作系统是不是XP,如果不是创建线程删除卷影拷贝,否则反之。
线程2,通过将解密出的指令拼接起来,交由shellexecute执行删除卷影拷贝的命令,防止进行数据恢复。就产生了在样本行为分析中图5抓取到的行为。
1 | ruas vssadmin.exe Delete Shadows /ALL /Quiet |
连续6个函数
创建完线程2之后,连着一下有了6个函数。这里一个一个分析。
- -第一个函数,获取一些特殊的文件路径,如:”刻录路径”;”桌面路径”;”公共桌面路径”。如图:
- 第二个函数,往注册表中写入数据。
先往HKEY_CURRRENT_USER\Software\MSVCC,下写入personID,并名为FIX
修改后的注册表如图:
然后往HKEY_CURRRENT_USER\Software<personID>写入data值。如图:
Data中的是3个数据拼接出来的。
- 第三个函数,修改注册表添加自启动项
先生成4位的随机数,并拼接成+++xxxx作为键值的名称,然后再与解密出的指令拼接,拼接成c:windows\system32\cmd.exe /c start “c:user<>\document\xxxxx.exe” 作为键值。然后添加到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run项中。可见行为分析图9所示。
然后修改software\Microsoft\Windows\CurrentVersion\Polices中的enableLinkedconnections,提升进程访问网络共享的权限。如图:
- 第四个函数:在我的文档目录下写入加密数据
将personID和刚写入注册表中的data值中的前两个数值拼接起来,然后再进行加密并写入”我的文档”目录下的+recover+file.txt中。如图:
其中拼接出的数据和写入data中的数据对比图,如下:
- 第五个函数:完善勒索信息
先将personID从unicode转换为ascii存储在内存中。然后再将解密出来的勒索信息中的xxxxxxx替换成personID。然后存储到chText中,后面会用到该完整的勒索信息。
将personID填入解密出的文本后,构成的完整的勒索信息如图:
- 第六个函数:初始化勒索信息图片
通过调用GdiplusStartup来初始化GDI。
然后调用DrawTextA,将第5个函数获取到的完整勒索信息chtext_completion_ransome_info画出来。也就是最终勒索弹出的图片。
也就是最终勒索弹出的图片,如图:
创建线程3:发送加密数据
线程3,向解密出来的URL发送data中的数据等加密后的主机信息。
首先拼接data中第二段的值、personID、1105和网络请求相关字符串。
然后将拼接出的信息进行加密。
然后将加密过的数据发送给之前解密出来的恶意URL(表3)。可见行为分析图8所示。
创建线程4:对文件进行加密
先获取系统文件路径,并通过GetLogicalDriveStringsw函数获取当前所有盘符。
然后遍历所有盘符,并判断当前遍历到的盘符类型。
如果盘符类型如下表时,执行file_encode_401920对该盘符进行加密
遍历文件,然后判断文件时目录还是文件,如果是目录则进行判断,若是c:\windows;c:\program files和program data这三个目录,便不在进行遍历(排除这3个目录)。然后进行递归,直到遍历到文件。
若是文件,便进行判断该文件后缀是否在要加密的后缀名表中。
加密文件,先查看文件属性,若文件属性为只读属性,则修改文件属性。
然后读取加密文件到buff中。
然后将读取到的数据进行加密,然后进行了三次写入。第一次写入data中的数据,然后写入一个1591986926的数据,最后再将加密后的数据写入文件中,文件加密完成。
设置线程优先级并等待
将线程4(文件加密)的优先级设置为最低,然后等待线程4运行完,然后再执行下一步弹窗显示勒索信息。
弹窗显示勒索图片和文件
先将前面分析的连续6个函数中的第六个函数中的初始化的勒索图片保存再本地。
再通过open_file_410C30函数调用shellExecutew执行如下命令。
1 | open c:\users\john\Desktop\+recover+oujgv.png |
来弹出勒索信息的图片。
先拼接出桌面勒索文件的绝对路径,然后将连续6个函数中的第5个函数中获得的完整勒索信息chText_completion_ransome_info,写入桌面的勒索文本中。然后再调用open_file_410C30将文本打开。
通过shellExecutew执行命令,打开刚写入的文件文件。
1 | open c:\users\john\Desktop\+recover+oujgv.txt |
再次创建线程2和线程3并删除自身
弹窗显示完勒索图片和文本后,再次创建线程2,删除卷影拷贝,防止恢复到加密前。再次创建线程3,再次发送主机信息到远程服务器。
当线程3运行完之后,执行cmd_del_file_410990调用cmd执行如下命令,删除自身。可见行为分析图7所示。
1 | cmd /c DEL C:\Users john\DOCUMENT\Vohdrw.exe>>NUL |
加密机制分析
该勒索病毒虽然提示加密文件是通过非对称RSA-2048算法进行加密的,但经过分析该勒索病毒样本实际上是通过对称AES算法来进行加密的
加密算法:
通过查看字符串,发现secp256K1椭圆曲线加密算法(ECC)
Secp256K1加密算法,如图:
RIPEMD160 算法计算比特币钱包地址,如图:
SHA-256摘要算法:
通过对文件加密函数进行了16轮的异或加密,判断出该勒索病毒是通过AES算法进行加密的。
加密详解·:
1.首先,该病毒样本会生成一个32字节的随机数作为私钥,这里称为:master_btc_priv。
2.然后计算生成的master_btc_priv的sha256的哈希值,生产master_btc__hash_priv。
3.再通过调用secp256k1函数来生成master_btc__hash_priv对应的公钥master_btc_hash_pub。
4.然后再求master_btc_priv对应的公钥master_btc_pub。
5.样本接下来利用AES算法加密master_btc_priv生成master_key_priv。
6.根据master_key_priv计算出对应的公钥master_key_pub,此公钥会写入加密文件中,这个公钥在执行线程3时会通过C&C通道加密发给攻击者。
7.然后再每次加密时,该样本会随机生成32字节的随机数,然后通过secp256K1算法生成一个session_ecdh_secret。并用这个session_ecdh_secret作为AES模式加密的密钥加密session_priv。生成session_key_priv。
8.根据已经生成的session_key_priv计算出对应的公钥session_key_pub,并保存到加密文件中。
加密算法大致流程图:
该样本将各种key都保存在了加密文件的头部,详细信息见下图:
0x02 样本溯源
0x03 查杀、防御技术方案
删除病毒文件
- 删除”我的文档”目录下的xxxxx.exe病毒文件
修复注册表
- 删除HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run自启项列表中,名为+++xxxx的键值。
- 删除HKEY_CURRRENT_USER\Software\MSVCC 列表中,名为FIX的键值。
- 删除HKEY_CURRRENT_USER\Software<personID>列表中的,data键值。
恢复加密文件
通过分析发现,该勒索病毒使用的其实是对称加加密算法AES,而非该勒索所说的非对称RSA-2048加密算法。而如今由于该病毒的作者已经将密钥公布,就可以对加密的文件进行解密。各大厂商都以公布相关的解密工具,可以下载这些工具,恢复被加密的文件。
卡巴斯基的解密工具下载链接:https://media.kaspersky.com/utilities/VirusUtilities/EN/RakhniDecryptor.zip
0x04 总结
该勒索病毒在勒索时随提示的是利用RSA加密算法,来对文件进行加密的,但经过详细分析后是通过AES来对文件加密的,再没有作者的密钥的情况下,理论上是不可以进行解密的。但目前该病毒样本的作者已经将密钥公布,即可以对该勒索病毒进行解密,各大安全厂商都已经出了相关的解密工具。若被加密,可通过这些厂商的工具进行解密。