Radamant勒索病毒分析
2020-01-28 18:58:00 Author: mp.weixin.qq.com(查看原文) 阅读量:100 收藏

本文为看雪论坛精华文章

看雪论坛作者ID:kumqu

一、概述
Github上获取的一个Radmnant勒索样本, 样本具有早期勒索病毒的主要特征,比较典型 。虽然勒索病毒现在都不这么玩了,但还是可以学习其功能实现的思路和方法。
因为还在学习这方面的内容,所以分析过程尽可能比较详细地列出来,分析结果可能存在一些遗漏或错误,也请大家指教。图片从word拷贝过来比较模糊,所以把idb文件放在附件了,病毒文件来源于Github上的theZoo项目。
二、样本信息
三、实验环境
四、基础静态分析

>>>>

4.1 检测加壳

首先,使用PEiD检测该勒索病毒是否加壳。虽然PEiD显示“Nothing found”,EP Section显示了“UPX1”节区(应该只进行了壳的特征值处理)。显然,这是使用了常见的UPX压缩壳对病毒进行了加壳。

>>>>

UPX脱壳

前面分析得知病毒已使用了upx进行压缩,所以使用upx命令行工具进行脱壳,脱壳过程显示如下:
成功获得了脱壳后的Radmant.exe病毒文件。

>>>>

4.3 导入表分析

使用PEid分析病毒的导入表,发现有7个模块被导入。下面分析一些主要模块的导入函数,可以得到其中的一些关键信息。
1. kernel32.dll:除了一些病毒必须的函数外,该模块还导入了GetLogicalDrives、GetFileSize等函数,估计与文件加密部分有关。
2. advapi32.dll:勒索病毒中常见导入模块,与密钥生成、注册表写入有关。
3. dnsapi.dll和ws2_32.dll:发现了诸如socket、connect、DnsQuery_A等函数,与病毒的网络行为有关,且很有可能和消息通信相关。
4. SHELL32.dll:该模块导入了两个关键的函数SHGetFolderPathA和ShellExecuteA, 表明病毒除运行本身外还运行了其他外部程序(也可以是病毒释放的程序)。

>>>>

4.4 资源段分析

使用Resource Hacker查看病毒的资源段,如下图所示:
发现了一个资源ID为1033的自定义资源,且该资源未被加密。分析似乎与文件信息有关,文件名为“DirectX”。暂时没有什么头绪,待后续分析。
五、详细分析

WinMain()

从模块入口定位到该函数,经过分析,发现这个函数是病毒的主函数,且没有使用任何的混淆反调试等保护手段。以下是对主函数逻辑的分析:
下面,按顺序和层次一一分析其中的关键函数。

check_my_path() 检查文件路径

这个函数获取了病毒文件当前的路径名和文件名,然后检查该病毒程序是否按照指定的路径和名称在运行:

copyMeToWin() 拷贝自身到指定路径

上一个函数检查文件路径,若不在指定目录以指定名称运行,则将自身拷贝到一个指定的目录下,重命名为DirectX.exe,文件属性设置为隐藏,然后运行拷贝后的病毒程序:
如下图所示,病毒样本拷贝到对应目录下:
拷贝完成,调用Delself()函数新建一个批处理文件aaa.bat,删除原病毒样本:

checkARun() 注册表查询

这个函数检查注册表是否写入了该病毒程序。

UACME() 创建互斥体

这个函数创建了一个名为“radamantv2.1”的互斥体,防止双开;没有异常,则使用WMI命令行,启动病毒进程:

SetARun() 注册表写入

这个函数在注册表写入病毒文件位置。
如下图,为注册表的写入验证:

getID() 计算MD5值作为ID

这个函数,根据系统信息、计算机名、硬件信息等多种信息,计算出一个MD5值,并将这个MD5值作为标识ID用于后面功能的实现:
如下图,在虚拟机上得到的ID:

decrypt_domain() 解密密文得到域名

这个函数的参数是一个加密了域名,使用AES算法和解密密钥,计算最终可以得到未加密的域名:
如下图,解密得到的服务器域名为“tangotango.com”, 这是一级控制服务器的域名:

GetIP() 域名解析并发送请求

这个函数,首先向域名“checkup.dyndns.org”发送一个GET请求,该域名会返回宿主机的外网地址:

getDomainsFromReg() 注册表获取域名

这个函数比较直观,从注册表中获取一个域名列表。第一次运行,查询不到域名,所以先执行后面的函数。

SendDataToServer() 发送数据到服务器

上一个函数判断了注册表中是否有域名列表。若没有,就执行这个函数。该函数向服务器的IP地址发送了一个POST请求,并从返回的数据中获取指定的值(根据下一个函数判断,这个值为域名):
动态调试这个函数,显示向一级域名发送请求二级域名的消息:
这里设置一级域名服务器“tangotango.com”为另一个虚拟机地址,POST的消息如下:

setDomains() 注册表写入域名

这个函数同样比较直观,将上一个函数获得的域名,写入注册表中。
在虚拟机中,执行这个函数在虚拟机中写入了一个注册表键值:键为宿主机id;值为一个二级域名(实际控制域名)。
由于服务器失效,这里的为自己构造的域名和指向另一个虚拟机的IP地址:

dowork() 病毒主线程

这个函数是病毒的主线程,实现了病毒的主要功能。这个函数首先把宿主机的id(先前计算得到的)与IP地址发送到domain_list[]中存储的域名地址,然后接收服务器传回来的命令,通过exec_command()函数执行命令。
如下图,将宿主机IP和id发送到注册表中的二级域名:

exec_command() 命令执行

这个函数是dowork()病毒主线程调用的命令执行函数。这个函数,可执行的命令包括:
删除自身命令;命令更新命令;发送宿主机信息命令;加密文件命令;解密文件命令;显示勒索信息;显示解密信息。具体显示如下:

DelSelf() 删除自身

这个函数执行批处理文件删除自身进程、文件等。

update_me() 命令更新

这个函数,从服务器下载build.exe文件并更新指令集。
由于服务器失效,所以不能下载目标文件。

SendMyInfo() 发送宿主信息

这个函数将宿主机系统信息和密钥发送到服务器。
如下图,为发送的宿主机信息及其生成的RSA密钥对(公钥和私钥):

encrypt_PC 加密文件

这个函数是宿主机的加密函数,实现了获取RSA加密公钥和寻找并加密文件的功能:
FindAndCryprFiles() 寻找并加密文件
这个函数在加密文件命令的函数下调用。其主要功能就是获取磁盘信息,使用一个递归函数搜索文件,并加密所有文件。
Search() 递归搜索文件,加密文件
这个函数由上一个函数FindAndCryprFiles调用。主要实现了两部分的内容:递归搜索文件;AES算法加密或解密文件。
解密部分:
加密部分:
在加密时,先从服务器获取本机id的RSA私钥,用来加密接下来生成的AES密钥。然后用AES密钥加密文件(如服务器未指定加密的文件类型,则默认加密所以类型的文件)。
如下图,为加密test.txt的过程:
加密完成显示如下(原文件之后会删除):

decrypt_PC() 解密文件

解密部分功能与加密部分相似,递归查找后缀“.RADAMANT”的文件,然后调用Search函数解密文件。
首先,从服务器获取解密的RSA私钥:
然后,利用RSA私钥开始解密文件,过程如下:
之后,得到解密出来的原文件。

MessageBoxA() 显示信息

最后exec_command()函数多次调用MessageBoxA函数显示勒索、解密消息,如下图所示:
例如,弹出开始解密的消息框:
六、病毒行为总结
最后总结下,病毒的行为特征主要如下:
与域名相关的通信行为如下:
- End -

看雪ID:kumqu

https://bbs.pediy.com/user-860819.htm 

*本文由看雪论坛  kumqu  原创,转载请注明来自看雪社区

推荐文章++++

实战栈溢出漏洞

栈溢出原理和利用

堆栈别乱用

栈溢出漏洞--GS和DEP

CVE-2019-0708 bluekeep 漏洞研究分析详细完整版

好书推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]
“阅读原文”一起来充电吧!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458303078&idx=1&sn=981514233d42eb6ef6b8610e6c292339&chksm=b1818aec86f603faffd3bf2297cb00f30b714b46b5e01a0156dd018679160698dfe910c369f5#rd
如有侵权请联系:admin#unsafe.sh