TeslaCrypt勒索病毒

0x00 概述

基本信息

样本名称 tfukrc.exe
样本类型 勒索病毒
样本大小 235KB(240,640字节)
MD5 72CCC18F3038E19273010D45AC2142CE

简介

该病毒原名为Tesla Crypt勒索病毒,勒索信息中提示是通过RSA加密算法进行加密的,但通过分析,发现该样本是通过AES加密算法对文件进行大量的加密操作,从而进行勒索。由于他的主密钥已经由开发者公布,故该勒索病毒是可以进行解密的。

流程图

liuchengtu

0x01 样本细节详细分析

样本行为分析

1.文件写入行为分析

  • 运行样本后,该样本复制自身文件,到C:\Users<username>\Documents\ 目录下,并更名为一个随机名:这里是lohdrw.exe,如图1:

1567409136692

图1
  • 然后该样本结束自身,并调用被释放出来的lohdrw.exe程序,对文件进行了大量的写入行为,如图2所示:

1567395508873

图2

打开被写入过的txt文件,发现内容都被加密过了,如图3:

1567410245244

图3

2.进程分析

查看进程树,逐条进行分析。进程树如图4:

1567410561150

图4
  • 运行该样本后,释放了lohdrw.exe,并运行了改exe程序。然后该exe对文件进行了大量的写入,可见图2。

  • 然后lohdrw.exe先后调用了两次vssadmin.exe(卷影拷贝服务)。执行了如下命令。

    1
    vssadmin.exe Delete Shadows /ALL /Quiet

    静默删除全部卷影副本。防止通过本地恢复。如图5:

    1567411572570

    图5
  • 然后调用NOTEPAD.exe,执行病毒路径下的txt文件,弹出勒索信息内容。如图6:

    1567412221894

    图6
  • 最后调用cmd执行如下命令,删除自身。如图7:

    1
    2
    cmd /c DEL C:\Users john\DOCUMENT\Vohdrw.exe>>NUL
    cmd /c DEL C:\Users john\Desktop\tfukrc\tfukrc.exe >>NUL

    1567412539335

    图7

3.网络行为分析

  • 样本进行了大量的网络行为,如图8:

1567413133164

图8

4.注册表行为分析

  • 修改注册表,添加了自启动项,在注册表HRCU\Software\Microsoft\Windows\CurrentVersion\Run目录下添加键值,并设置路径为释放出的lohdrw.exe。如图9

1567413261912

图9

样本详细分析

找到主函数入口:

首先找到主函数入口点,从_tmainCRTStartup中找到主函数入口点wWinMain。如下图:

1567837425099

反沙箱

进入主函数我WinMain中后,该样本首先初始化了COM组件,并调用了FIlterGraph组件,来检查音频设备是否存在,从而判断是否是沙箱环境。若判断是沙箱环境,直接退出程序,不再执行。如图:

1567843869096

关闭安全警告弹窗

由于样本的传播途径可能由很多种,其中若是通过IE浏览器下载的话,会默认再所下载的文件中默认添加一个隐藏文件流:filename:zone.identifier。如果有该隐藏文件流,再运行该程序的时候,会弹出警告窗口。

所以该样本获取到完整文件路径后,通过字符串拼接出:filename:zone.identifier,然后将其删除。来阻止弹出警告窗口。如图:

1567844819428

解密指令与勒索信息

该样本通过解密函数,解密出后面所用到的一些数据信息。其中调用了下图中init_key_encode_42B00函数初始化了一个大小为244字节的密钥,然后通过该密钥去解密信息。如下图:

其中解密出来的数据都有:解密出要加密的文件后缀名;解密出勒索提示信息的文件名;解密出要执行指令;解密出而异域名以及网络请求头;以及勒索文本信息

1567847268237

  • 要加密的文件类型,就是解密出来的后缀名。解密出的后缀名,如表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"
表3

判断进程TOKEN的完整性和样本所在路径

然后判断当前进程token的完整性,如果当前进程的标签完整性是低的话,便执行下图中的Elevate_privileges_407100,通过执行cmd命令runas,以管理员权限再次运行一次。

1567857482710

Elevate_privileges_407100,通过ShellExecuteExw执行,拼接出的指令:

1
c:\windows\system32\cmd.exe /c strat xxxxx.exe runas

1567856634938

创建新进程

然后再判断文件的路径是否在”我的文档”的目录下,如果不在的话,将自身复制到到”我的文档”目录下更名为随机生产的6位随机字符串,并修改文件属性为隐藏。然后删除源文件,结束当前进程。创建新的进程执行复制出来的新程序。也就是在样本行为分析图1抓取到的行为。

若在”我的文档”目录下,则继续执行。

1567857246991

创建互斥体

通过函数CreateMutexw创建互斥体9-9-9-9。当互斥体存在时,直接结束。

1567858359309

提权

提升进程权限,提升权限为SeDebugPrivilege。如下图:

1567858870374

创建线程1:监控进程

创建线程1,线程1主要监控所有进程,时时遍历所有进程,当遇到taskmg;regedi;procex;msconfi;cmd,就立马结束这些进程。如下图:

1567860386887

创建线程2:删除卷影拷贝

再创建线程2之前,该样本先获取了当前操作系统的信息,判断操作系统是不是XP,如果不是创建线程删除卷影拷贝,否则反之。

1567861126751

线程2,通过将解密出的指令拼接起来,交由shellexecute执行删除卷影拷贝的命令,防止进行数据恢复。就产生了在样本行为分析中图5抓取到的行为。

1
ruas vssadmin.exe Delete Shadows /ALL /Quiet

1567861243654

连续6个函数

创建完线程2之后,连着一下有了6个函数。这里一个一个分析。

1567862335585

  • -第一个函数,获取一些特殊的文件路径,如:”刻录路径”;”桌面路径”;”公共桌面路径”。如图:

1567862786033

  • 第二个函数,往注册表中写入数据。

1567863033929

先往HKEY_CURRRENT_USER\Software\MSVCC,下写入personID,并名为FIX

1567863463010

修改后的注册表如图:

1567863653699

然后往HKEY_CURRRENT_USER\Software<personID>写入data值。如图:

1567864412110

Data中的是3个数据拼接出来的。

1567864032521

  • 第三个函数,修改注册表添加自启动项

先生成4位的随机数,并拼接成+++xxxx作为键值的名称,然后再与解密出的指令拼接,拼接成c:windows\system32\cmd.exe /c start “c:user<>\document\xxxxx.exe” 作为键值。然后添加到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run项中。可见行为分析图9所示。

1567929481304

然后修改software\Microsoft\Windows\CurrentVersion\Polices中的enableLinkedconnections,提升进程访问网络共享的权限。如图:

1567929663825

  • 第四个函数:在我的文档目录下写入加密数据

personID和刚写入注册表中的data值中的前两个数值拼接起来,然后再进行加密并写入”我的文档”目录下的+recover+file.txt中。如图:

1567936981995

其中拼接出的数据和写入data中的数据对比图,如下:

1567936532441

  • 第五个函数:完善勒索信息

先将personID从unicode转换为ascii存储在内存中。然后再将解密出来的勒索信息中的xxxxxxx替换成personID。然后存储到chText中,后面会用到该完整的勒索信息。

1567937432442

将personID填入解密出的文本后,构成的完整的勒索信息如图:

1567937891729

  • 第六个函数:初始化勒索信息图片

通过调用GdiplusStartup来初始化GDI。

1567939547103

然后调用DrawTextA,将第5个函数获取到的完整勒索信息chtext_completion_ransome_info画出来。也就是最终勒索弹出的图片。

1567939663047

也就是最终勒索弹出的图片,如图:

1567940044615

创建线程3:发送加密数据

线程3,向解密出来的URL发送data中的数据等加密后的主机信息。

首先拼接data中第二段的值、personID、1105和网络请求相关字符串。

1567940968494

然后将拼接出的信息进行加密。

1567941217461

然后将加密过的数据发送给之前解密出来的恶意URL(表3)。可见行为分析图8所示

恶意URL
http://strategicdisaster.info/wordpress/wp-content/plugins/binstr.php"
http://videoaminproduktion.de/plugins/binstr.php"
http://clubsaintandre.fr/PostsImages/binstr.php"
http://affiliateproductes.com/binstr.php"
http://ptgp.pl/tmp/binstr.php"
http://minteee.com/PostsImages/binstr.php"

1567941375056

创建线程4:对文件进行加密

先获取系统文件路径,并通过GetLogicalDriveStringsw函数获取当前所有盘符。

1567944855107

然后遍历所有盘符,并判断当前遍历到的盘符类型。

如果盘符类型如下表时,执行file_encode_401920对该盘符进行加密

1567945236934

遍历文件,然后判断文件时目录还是文件,如果是目录则进行判断,若是c:\windows;c:\program files和program data这三个目录,便不在进行遍历(排除这3个目录)。然后进行递归,直到遍历到文件。

1567950619428

若是文件,便进行判断该文件后缀是否在要加密的后缀名表中。

1567950908230

加密文件,先查看文件属性,若文件属性为只读属性,则修改文件属性

1567994495176

然后读取加密文件到buff中

1567994555550

然后将读取到的数据进行加密,然后进行了三次写入。第一次写入data中的数据,然后写入一个1591986926的数据,最后再将加密后的数据写入文件中,文件加密完成。

1567994695463

设置线程优先级并等待

将线程4(文件加密)的优先级设置为最低,然后等待线程4运行完,然后再执行下一步弹窗显示勒索信息。

1567995004864

弹窗显示勒索图片和文件

先将前面分析的连续6个函数中的第六个函数中的初始化的勒索图片保存再本地。

1567995246630

再通过open_file_410C30函数调用shellExecutew执行如下命令。

1
open c:\users\john\Desktop\+recover+oujgv.png

1567995351949

来弹出勒索信息的图片。

1567940044615

先拼接出桌面勒索文件的绝对路径,然后将连续6个函数中的第5个函数中获得的完整勒索信息chText_completion_ransome_info,写入桌面的勒索文本中。然后再调用open_file_410C30将文本打开。

1567995515350

通过shellExecutew执行命令,打开刚写入的文件文件。

1
open c:\users\john\Desktop\+recover+oujgv.txt

1567995793089

再次创建线程2和线程3并删除自身

弹窗显示完勒索图片和文本后,再次创建线程2,删除卷影拷贝,防止恢复到加密前。再次创建线程3,再次发送主机信息到远程服务器。

1567996401574

当线程3运行完之后,执行cmd_del_file_410990调用cmd执行如下命令,删除自身。可见行为分析图7所示

1
cmd /c DEL C:\Users john\DOCUMENT\Vohdrw.exe>>NUL

1567996729356

加密机制分析

该勒索病毒虽然提示加密文件是通过非对称RSA-2048算法进行加密的,但经过分析该勒索病毒样本实际上是通过对称AES算法来进行加密的

加密算法:

通过查看字符串,发现secp256K1椭圆曲线加密算法(ECC)

1568083043964

Secp256K1加密算法,如图:

1568083196137

RIPEMD160 算法计算比特币钱包地址,如图:

1568083527141

SHA-256摘要算法:

1568084212935

通过对文件加密函数进行了16轮的异或加密,判断出该勒索病毒是通过AES算法进行加密的。

1568083602748

加密详解·:

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,并保存到加密文件中。

加密算法大致流程图:

蓝信图片_088082d3041080848801

该样本将各种key都保存在了加密文件的头部,详细信息见下图:

1568087161590

0x02 样本溯源

恶意URL
http://strategicdisaster.info/wordpress/wp-content/plugins/binstr.php"
http://videoaminproduktion.de/plugins/binstr.php"
http://clubsaintandre.fr/PostsImages/binstr.php"
http://affiliateproductes.com/binstr.php"
http://ptgp.pl/tmp/binstr.php"
http://minteee.com/PostsImages/binstr.php"

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来对文件加密的,再没有作者的密钥的情况下,理论上是不可以进行解密的。但目前该病毒样本的作者已经将密钥公布,即可以对该勒索病毒进行解密,各大安全厂商都已经出了相关的解密工具。若被加密,可通过这些厂商的工具进行解密。