RSA-4096勒索病毒分析
本帖最后由 沭阳 于 2019-5-14 09:42 编辑# 说明: #
萌新一枚,这是面试过程中面试官要求分析的另外一个病毒程序,整理成文,发表出来,供大家参考学习,一起进步!如有不当之处,也希望大佬批评指正,晚辈一定虚心受教。由于考虑到时间问题还有个人能力的原因,我只将病毒关键功能模块进行分析说明,勒索算法部分没有详细分析,也请大家见谅,不懂之处欢迎提出,我也尽量解答,加油!
----------
# 一、样本信息: #
- 样本名称:0ffc994e247d2b108910e8bb6de3ef57439c51af
- 样本大小:221KB
- MD5:9d3dbe44445624abb04bdb3bdace4fc2
- SHA-256:7829ae7240eb4c6f5fe33c5af43e6d388f0439011c27cf609cc4d1a8b6092ec1
- SHA-1:0ffc994e247d2b108910e8bb6de3ef57439c51af
- VirusTotal:(https://www.virustotal.com/#/file/7829ae7240eb4c6f5fe33c5af43e6d388f0439011c27cf609cc4d1a8b6092ec1/detection)
# 二、分析环境及工具: #
环境:Oracle VM VirtualBox、Windows 7 Service Pack 1(x64)
工具:PEID V0.95、OD、IDA、火绒剑
# 三、基础病毒分析: #
## 基础静态分析: ##
为了方便测试,更改病毒名称为1,拖入PEID查壳发现乱码节区,判断程序采用了加壳方式来保护自己,壳的类型未知
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%871.png?raw=true)
接着观察1的字符串信息和导入表,没有发现什么值得注意的信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%872.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%873.png?raw=true)
## 基础动态分析: ##
为了节约时间,这里就不截图展示了,基本思路是拖入火绒剑监控程序运行,常见的操作和推测可参考之前的文章
# 四、详细病毒分析: #
## 样本1分析: ##
程序一拖入OD会弹出一个控制台窗口,后面程序会得到控制台窗口句柄进行隐藏,其中sub407410()函数会再内存中解密一堆数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%874.png?raw=true)
接着来到sub406D00()函数,程序首先获得得到kernel32.GetProcessHeap和ntdll.RtlAllocateHeap函数地址,和其它病毒程序常采用GetProcAddress函数来获取其它函数地址有所不同的是,这个恶意程序通过未文档化函数LdrGetProcedureAddress来获取其它函数地址
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%875.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%876.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%877.png?raw=true)
然后程序遍历ntdll的导出表,加密函数名作对比得到所需要的函数RtlDecompressBuffer
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%878.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%879.png?raw=true)
调用RtlDecompressBuffer函数,解压数据得到新的PE文件,dump下来命名为PE1
待解压的数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8710.png?raw=true)
解压后的PE数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8711.png?raw=true)
下面获取一些所需的函数
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8712.png?raw=true)
之后调用VirtualAlloc函数分配新的内存空间将解压出来的PE文件复制过去并存储所需的API
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8713.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8714.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8715.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8716.png?raw=true)
最终储存的函数地址
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8717.png?raw=true)
修改此程序的内存保护属性,将数据清空
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8718.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8719.png?raw=true)
之后将解压出来的PE数据复制到原进程空间
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8720.png?raw=true)
跳到新的程序入口点开始执行程序
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8721.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8722.png?raw=true)
为了方便分析,我直接分析dump下来的PE1文件
## 样本PE1分析: ##
先进入入口点
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8723.png?raw=true)
程序首先初始化COM库,得到9个随机字符并创建了一个COM对象
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8724.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8725.png?raw=true)
然后拼接出PE1:Zone.Identifier文件名并删除,是为了运行时候,没有弹窗警告
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8726.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8727.png?raw=true)
接着得到kernel32.dll的基址,获取Wow64DisableWow64FsRedirection,Wow64RevertWow64FsRedirection地址,为了关闭和恢复64位程序和32位程序之间重定位问题
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8728.png?raw=true)
然后程序解密出一些后面所需使用的字符串数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8729.png?raw=true)
加密文件后缀
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8730.png?raw=true)
网络相关信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8731.png?raw=true)
操作命令相关信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8732.png?raw=true)
恶意域名相关信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8733.png?raw=true)
勒索文本信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8734.png?raw=true)
然后得到访问令牌信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8735.png?raw=true)
下面得到6个随机字符串,和特殊目录路径拼接出新的文件名,将自身复制过去,设为隐藏属性,创建一个进程运行新创建的文件,并删除自己
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8736.png?raw=true)
复制文件
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8737.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8738.png?raw=true)
创建进程运行程序
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8739.png?raw=true)
因为会创建新的进程运行程序,这里我nop掉,往下看
创建互斥体8_8_8_8
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8740.png?raw=true)
提升进程权限
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8741.png?raw=true)
下面有6个函数
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8742.png?raw=true)
第一个函数sub40FB80()得到特殊文件路径
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8743.png?raw=true)
第二个函数sub402960()创建注册表写入加密数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8744.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8745.png?raw=true)
第三个函数sub40FF30()设置开机自启动并提升当前进程访问资源管理器进程网络共享权限
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8746.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8747.png?raw=true)
第四个函数sub40FC00()在特殊目录下创建一个TXT文件并写入加密数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8748.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8749.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8750.png?raw=true)
第五个函数sub402430()找到xxxxxxxx位置,填入数据,完善勒索信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8751.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8752.png?raw=true)
第六个函数sub40FE80()初始化GDI信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8753.png?raw=true)
接着创建一个线程来加密文件,病毒会加密两个部分,一部分是主机文件,一部分是网络资源文件
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8754.png?raw=true)
加密部分,首先对目录判断,是目录就迭代,然后对比三个系统关键目录,是的话跳过,之后在目录下留下勒索信息截图和勒索信息文本并通过shell32.execute打开它们
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8755.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8756.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8757.png?raw=true)
不是目录的话和之前解密出来的后缀进行对比,符合的话开始加密,加密算法部分就不分析了,按照勒索信息文本来说病毒程序采用的是RSA-4096非对称加密算法,写入了三段加密数据
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8758.png?raw=true)
然后枚举网络资源文件进行加密
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8759.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8760.png?raw=true)
加密文件之后也会在桌面创建截图和勒索信息文本并打开
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8761.png?raw=true)
之后创建新的线程来删除备份数据生成的卷影副本,防止数据恢复
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8762.png?raw=true)
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8763.png?raw=true)
接着又创建一个线程来发送加密后的主机信息
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8764.png?raw=true)
最后删除自身
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8765.png?raw=true)
至此病毒程序的运行流程分析完毕,加密数据部分没有详细分析,自己关于算法方面的逆向能力不太足,怕分析起来浪费时间,得不偿失
----------
# 五、病毒行为流程总结: #
![](https://github.com/YanStar/RSA-4096Image/blob/master/RSA-4096%E6%A0%B7%E6%9C%AC%E5%9B%BE%E7%89%87/%E5%9B%BE%E7%89%8766.png?raw=true)
# 六、技术思考总结: #
1. 通过PEID查壳发现程序带壳的话不要慌,判断是已知壳还是未知壳,已知壳的话查阅网上相关资料手工或者寻找脱壳机帮助自己脱壳,未知的话单步分析,合理下断,注意观察内存变化
2. 对于某些影响我们分析运行的函数,要大胆的NOP和跳过
3. 多熟悉不同病毒种类,远控类,勒索类,挖矿类等等,下次遇到时,分析起来速度会变快,效率提高
4. 算法加密部分不仅要熟悉常见的Windows系统函数,更要知道相关原理,自己能力有待提高
# 七、防护建议: #
1、个人电脑、服务器应及时打补丁,修复漏洞
2、对重要的数据文件定期进行非本地备份
3、不要点击来源不明的邮件附件,不从不明网站下载软件
4、尽量关闭不必要的文件共享权限
5、更改账户密码,设置强密码,避免使用统一的密码
6、勒索软件会利用RDP(远程桌面协议),如果业务上无需使用RDP的,建议关闭RDP
# 八、相关IOC: #
http[:]//drlarrybenovitz.com/qhcka/templates/binarystings.php
http[:]//holishit.in/wp-content/plugins/wpclef/assets/src/sass/neat/grid/binarystings.php
http[:]//starsoftheworld.org/cgi-bin/binarystings.php
http[:]//hknsjsu.org/wp-content/plugins/profile-builder/assets/lib/wck-api/assets/js/tiny_mce/utils/binarystings.php
http[:]//vtc360.com/wp-content/themes/vtc360_maxf3d/ReduxFramework/ReduxCore/inc/extensions/wbc_importer/demo-data/Demo2/binarystings.php
http[:]//grosirkecantikan.com/wp-content/plugins/contact-form-7/includes/js/jquery-ui/themes/smoothness/images/binarystings.php
http[:]//88fga.ketteaero.com/FE4A8D7E1E829B86
http[:]//2bdfb.spinakrosa.at/FE4A8D7E1E829B86
http[:]//uj5nj.onanwhit.com/FE4A8D7E1E829B86
MD5:9d3dbe44445624abb04bdb3bdace4fc2
SHA-256:7829ae7240eb4c6f5fe33c5af43e6d388f0439011c27cf609cc4d1a8b6092ec1
SHA-1:0ffc994e247d2b108910e8bb6de3ef57439c51af
----------
由于相关文件有点大,放在微云上供大家下载(一级解压密码是52pojie,二级解压密码是infected):(https://share.weiyun.com/5Nfqfqm) 感谢分享,学习了 默小白 发表于 2019-5-14 09:32
二级解压密码好像不是52pojie。。。
抱歉,二级解压密码是infected,已在文章中更新,解压出的文件其实是文件“1”:lol 先占沙发,谢谢楼主了! 辛苦楼主,学习了 谢谢楼主分享,涨知识了。
谢谢楼主分享,涨知识了。 学习了,这两年勒索病毒是愈演愈烈 非常6,感谢分享 建议楼主有空顺便做一期分析病毒的视频教程,想学习一下一个病毒文件从头到尾的分析。 谢谢楼主分享;啦!