?前言:
?WannaCry利用永恒之蓝漏洞爆发以后,病毒安全的前沿对抗最频繁种类则是勒索病毒了,17年初或者更早就有人捕获了GandCrab家族的勒索病毒,直到18年已经更新迭代到了5.0版本,18年进入尾声的时候,安全研究人员发现了GandCrab勒索病毒的V5.1最新版变种。
?对于勒索个人看法:当第一次听说勒索病毒的时候,就感觉一定是无法抗拒的利益驱动,才会让某一群人去迭代、维护、研发勒索病毒。这道理就像开了一家公司一样,能把病毒走向全世界,已经是很成功了,看似简单,其实背后的关联复杂。除了加密算法的复杂程度之外,勒索的潜伏与隐蔽(字符串混淆加密)也是比较到位。
?其实不管怎样,那些API还是那些API,即使自己实现相仿得函数,时间足够也能从函数功能与汇编,加以逻辑去推理过程,从而实现、还原。
?
1、预热(收集系统信息、提权、注册表操作、兼容匹配、加密解密关键字符串等)
2、枚举扫描(网络共享、资源枚举,遍历扫描文件)
3、加密文件(过滤、匹配的文件以不同方式进行加密)
4、收尾工作(发送勒索信息、删除病毒、销毁进程等)
?基本所分析的病毒大多数都会这样干,因为他既要保证你系统的稳定性,也要保证自己的安全与功能的实现,这样才能勒索到钱......
????????????????????????????? ps:文章最后附思维导图
?
?预热分析:
1、线上分析:
????????????????????图片一:线上分析
????????????????????图片二:样本信息
?
2、工具分析:
????????????????????图片三:exeinfo pe
?
?详细分析:
①拉入IDA也许你会看到花指令混淆,如下所示:
????????????????????图片四:花指令混淆
?②如上图所示,GandCrab.00426F7A函数会标志勒索病毒要开始了,当你发现桌面弹窗"我们很快就会回来",恭喜已经中了GandCrab勒索病毒,如下所示:
????????????????????图片五:MessageBox
?③GandCrab.00405FF7函数先是创建快照,遍历进程,怕加密文件的时候影响加密效果,如文件被占用等问题,如下所示:
????????????????????图片六:初始化字符串
????????????????????图片七:遍历对比进程
????????????????????图片八:匹配进程结束
?④如图三中GandCrab.00405944是最为核心的函数,先来看看获取windows版本信息,获取SID也就是说当前的权限等级,如下所示:
????????????????????图片九:Windows版本信息
????????????????????图片十:当前权限级别
?⑤GandCrab.004054BA函数对注册表中键盘布局键值获取,获取当前用户和系统的默认安装语言,比对如果匹配到419(俄罗斯),422(乌克兰) ,423(比利时)等等,那么将执行删除文本且结束进程,这意味着不进行勒索......,如下所示:
????????????????????图片十一:键值循环
????????????????????图片十二:匹配成功
?⑥继续线性跟踪,GandCrab.00405016函数负责获取系统信息,检索了磁盘目录关联的文件系统和卷的信息,然后用磁盘的数据hash获取随机字符串,创建.lock互斥体:
????????????????????图片十三:创建互斥体
⑦GandCrab.0040586C函数,加密与异或字符串获取公钥1,如下所示:
????????????????????图片十四:获取RSA1
⑧参数入栈,安全进程扫描,关键系统数据异或解密,如下所示:
????????????????????图片十五:入栈参数
????????????????????图片十六:示意图
????????????????????图片十七:系统数据拼接
????????????????????图片十八:安全服务遍历
????????????????????图片十九:拼接后数据
????????????????????图片二十:解密
⑨系统不显示critical-error-handler消息框,异常不显示,初始化临界区,如下所示:
????????????????????图片二十一:SetErrorMode
?⑩如上图所示,GandCrab.00404DC5函数是GandCrab勒索的核心函数,先是利用微软提供的CSP函数获取随机数,如下所示:
????????????????????图片二十二:GetModuleHandleA
?解密字符串,解密后发现是文件名的后缀,如下所示:
????????????????????图片二十三:文件后缀名
?随机生成密钥,且导出公钥,私钥,如下所示:
????????????????????图片二十四:导出Key
?接着创建了注册表ex_data\data,并且设置了随机字符,如下所示:
????????????????????图片二十五:设置注册表
?导入公钥,加密了数据:
????????????????????图片二十六:硬编码公钥导入
?创建了key_datas\datas,设置了public=公钥,private=硬编码加密后私钥(还加了随机数等数据)
????????????????????图片二十七:注册表设置
?有意思的赋值方式,push入栈,pop弹出给寄存器,赋值给内存变量,如下所示:
????????????????????图片二十八:赋值方式
?使用了Base64加密了之前的密钥,然后拼接勒索警告字符串与获取的pc数据,如下所示:
????????????????????图片二十九:勒索警告
??下面压入了文件后缀格式,应该准备枚举网络资源,遍历文件,加密文件了,如下所示:
????????????????????图片三十:GandCrab.00403D8E
?内部创建了两个线程,线程分析一,如下所示:
????????????????????图片三十一:回调函数
????????????????????图片三十二:局域网枚举
????????????????????图片三十四:遍历局域网下文件目录与磁盘
????????????????????图片三十五:递归扫描
????????????????????图片三十六:加密过滤
????????????????????图片三十七:加密过程
????????????????????图片三十八:硬编码公钥加密文件
?线程分析二,如下所示:
?
????????????????????图片三十九:本地文件加密且退出进程
最后调用了函数GandCrab.00405252执行了 ShellExecute,执行了如下指令:
?
??样本中关于利用CVE漏洞提权代码没有分析,因为在测试环境下没有匹配0x1000,跳过了提权函数,上述有很多分析点不够精准,但是还原了样本的整体逻辑。
?关于硬编码公钥加密研究,使用的是CSP又称"加密服务提供者(Cryptographic Service Provider)",微软提供的一套API,后续有机会一起实现与深入研究一番。
?
思维导图:
原文地址:https://blog.51cto.com/13352079/2355303