GandCrab_v5.0.3勒索病毒—JS代码分析与Loader分析

Track-SSG   ·   发表于 2018-11-08 10:24:53   ·   漏洞文章

 

概述

Gandcrab家族算是勒索病毒中最“出名”的了,它仅仅在半年的时间了就发布了从v1.0到v5.0.3,截止到我分析前,已经出现了v5.0.5版本了,我这个分析的是v5.0.3的JS脚本产生的勒索病毒。勒索病毒的最终执行的Payload部分我就不分析了,因为和之前的版本上没有太大的改变,但是这个Loader很有意思,用到了在2017年BlackHat大会上提到的ProcessDopplegänging技术,有兴趣的可以看看。

该JS脚本的功能:

(1)对抗Avast杀软

(2)对抗Windows Defender

(3)对抗MSC微软安全客户端

(4)对抗Ahnlab安博士杀软

(5)生成GandCrabV5.0.3勒索病毒变种样本并执行

 

详细分析

下图是经JS格式转换后的混淆脚本,需要通过Chrome浏览器动态调试得到源码,在hrodjgengsl函数处下断,查看参数信息即是解混淆后的JS源码了

经JS格式化后的JS源码部分(两张图)

1、检查avast杀毒服务是否运行,如处于运行状态,生成kyoxks.js脚本并运行,脚本内容如下:

脚本功能:

1、首先在注册表HKEY_CURRENT_USERSOFTWAREycsdrrpvrylqzhlnv下写一段base64加密的powershell脚本

2、通过创建计划任务以固定间隔时间调PowerShell运行它。

解密之后的powershell代码如下,这其中有一段C#代码:

C#代码—————————————————————————————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————————————————————————————–

第一段Powershell脚本主要功能:

1、首先拷贝对应的文件到临时目录

2、找到对应路径下Avast更新程序并且动

3、清除对应路径下缓存数据

第二段C#代码主要功能:

C#代码中定义了类:a12,其中在a12这个类中定义了a10、a11、a13、a14四个方法

第三段Powershell脚本主要功能:

执行调用C#代码中方法

a10方法主要是找到Avast进程得到有效句柄后从死循环中break退出。

a11和a13方法主要是向Avast程序发送消息,按下Tab键、空格键,释放Tab键、空格键。

a14方法主要是将Avast窗口程序隐藏

2、检查WdNisSvc、WinDefend服务是否运行,如处于运行状态,生成nykvwcajm.js脚本并运行,脚本内容如下:

主要功能:

1、利用打开fodhelper.exe进程使cmd.exe Bypass UAC的目的,进而关闭Windows Defender杀毒功能及强制结束Windows Defender服务程序MSASCui.exe。

判断是否是Win 10系统,如是通过将cmd.exe /C “powershell Set-MpPreference -DisableRealtimeMonitoring $true && taskkill /im MSASCui* /f /t命令写入到HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\注册表中,并以隐藏窗口的形式打开fodhelper.exe,这时就会执行上述注册表中写入的命令。同时最小化桌面上的所有窗口。再删除相应的注册表HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\。

2、利用打开eventvwr.exe进程使cmd.exe Bypass UAC的目的,进而关闭Windows Defender杀毒功能及强制结束Windows Defender服务程序MSASCui.exe。

判断是否是Win 7系统,如是通过将cmd.exe /C “sc stop WinDefend && taskkill /im MSASCui* /f /t命令写入到HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command\注册表中,并以隐藏窗口的形式打开eventvwr.exe。这时就会执行上述注册表中写入的命令。执行完后再删除注册表HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\。

3、如果WdNisSvc或WinDefend服务存在,则持续检测20s。

3、检查NisSrv服务是否运行,如处于运行状态,生成bervcptyvulur.js脚本并运行,脚本内容如下:

NIsSrv指的是微软网络实时检测服务,是微软在系统开机时启动的一个用来检测网络的反病毒服务。卸载Microsoft Security Client程序命令:MsiExec.exe /X{2AA3C13E-0531-41B8-AE48-AE28C940A809}

1、利用打开fodhelper.exe进程使MsiExec.exe Bypass UAC的目的,进而以最小化的方式静默卸载Microsoft Security Client程序。

判断是否是Win 10系统,如是通过将MsiExec.exe /X {2AA3C13E-0531-41B8-AE48-AE28C940A809} ACCEPT=YES /qr+ /quiet命令写入到HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\注册表中。并以隐藏窗口的形式传入C:Windowsfodhelper.exe参数打开explorer.exe。这时就会执行上述注册表中写入的命令。再删除注册表项HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\。

2、利用打开eventvwr.exe进程使MsiExec.exe Bypass UAC的目的,进而以最小化的方式静默卸载Microsoft Security Client程序。

判断是否是Win 7系统,如是通过将MsiExec.exe /X {2AA3C13E-0531-41B8-AE48-AE28C940A809} ACCEPT=YES /qr+ /quiet命令写入到HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command\注册表中,并以隐藏窗口的形式传入C:Windowseventvwr.exe打开explorer.exe。这时就会执行上述注册表中写入的命令。再删除相应的注册表项HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\。

3、如果NisSrv服务存在,则持续检测90s。

4、检查V3 Service服务是否运行,如处于运行状态,再检查tgydmilslvp.txt文件是否存在%USERPROFILE%目录下,如存在就生成recjyzcz.js脚本并运行,不存在该txt文件就生成内容是777的tgydmilslvp.txt,脚本内容如下:

主要功能:

1、利用打开fodhelper.exe进程使Powershell.exe Bypass UAC的目的,进而执行写在注册表中的Powershell脚本。

判断是否是Win 10系统,如是通过将djziapwzi变量所赋的值(Powershell脚本)写入到HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\注册表中,并以隐藏窗口的形式传入C:Windowsfodhelper.exe参数打开explorer.exe。这时就会执行上述注册表中写入的命令。再删除相应的注册表项HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\。

2、利用打开eventvwr.exe进程使Powershell.exe Bypass UAC的目的,进而关闭Windows Defender杀毒功能及强制结束Windows Defender服务程序MSASCui.exe。

判断是否是Win 7系统,如是通过将djziapwzi变量所赋的值(Powershell脚本)写入到HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command\注册表中,并以隐藏窗口的形式传入C:Windowseventvwr.exe打开explorer.exe。这时就会执行上述注册表中写入的命令。再删除相应的注册表项HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command\。

3、如果WdNisSvc或WinDefend服务存在,则持续检测60s。

解密后Powershell脚本:

主要功能:

查找Ahnlab安博士杀软的卸载程序,拷贝到指定位置后并执行。

5、解密Payload并写入到dsoyaltj.exe文件中后执行。

以上是比较详细的脚本分析内容。

6、ProcessDoppelgänging技术与Process Hollowing技术交叉使用的恶意Loader

Loader流程图如下:

首先简单说一下ProcessDoppelgänging攻击技术,这个技术是2017年欧洲BlackHat大会上由网络安全公司enSilo两名研究人员提出的新型在野攻击,其中还用到了NTFS文件系统事务回滚机制,相关的BlackHatPDF文档在最后会添加到附件。

ProcessDoppelgänging攻击技术:

1、创建一个新事务并这个事务中直接创建一个新文件

2、将新创建的文件映射到进程新创建的section中

3、利用NTFS文件系统事务回滚机制,回滚到之前的无创建文件状态

4、再跳转执行内存中的section部分的payload

上述介绍的是常规ProcessDoppelgänging攻击技术,本Loader结合使用了Process Hollowing技术,配合使用后较为复杂。以下是详细分析:

以上程序经动态调试之后首先发现该程序通过申请空间并解密出PE文件,然后随机创建挂起原始文件状态的合法进程(本文是wermgr.exe,还有可能是svchost.exe),这种操作让我们想起了Process Hollowing技术常用的创建傀儡进程的手法。我们了解下两种技术不同点,就能知道该样本作者如何将两种技术交叉使用的。

与Process Hollowing技术不同点:

1、在ProcessDopplegänging技术中,创建进程的操作需要很长时间,并使用官方未公开的API:NtCreateProcessEx。

2、在ProcessDoppelgänging技术中,新进程不是从原始文件创建的,而是从特殊缓冲区(section)创建的。

如下图所示:

因为NTDLL是一个特殊的低级DLL。基本上,它只是系统调用的一个包装器。它与系统中的其他DLL没有任何依赖关系。由于这个原因,它可以方便地加载,而无需填充其导入表。其他系统DLL(如Kernel32)在很大程度上依赖于从NTDLL导出的函数。所以许多用户层监视工具Hook并拦截NTDLL导出的函数。恶意程序作者知道这一点,所以有时为了躲过这种机制,他们会选择加载一个新的NTDLL副本。查看内存映射表,我们看到附加的ntdll_1作为映像加载,和其他DLL一样,这种类型的映射是使用NTDLL的。但是NTDLL默认加载到每个可执行文件中,并且官方的API无法加载相同的DLL两次。在这里它们使用一种比较好的解决方式:调用以下函数将文件以一个section的方式加载

1、ntdll.NtCreateFile – 打开ntdll.dll文件

2、ntdll.NtCreateSection – 在ntdll文件中创建一个section

3、ntdll.ZwMapViewOfSection – 将section映射到进程地址空间,ntdll模块文件就能映射进内存了。

这种方式非常聪明,因为DLL映射类型为Image,所以它看起来像是以普通的方式加载,这样的操作可以绕过各种安全产品的检测与拦截。又以同样的方式映射了wermgr.exe文件。

7、使用NTFS事务创建新文件

简要介绍一下NTFS事务是什么,这种机制通常在数据库上运行时使用,它们存在于NTFS文件系统中。NTFS事务将一系列操作封装到一个单元中。在事务内部创建文件时,在提交事务之前,外部任何人都无法访问它。ProcessDoppelgänging使用它们来创建不可见的Payload文件,加载程序创建一个新事务,在该事务中创建一个新文件。首先,调用NTDLL中的函数ZwCreateTransaction。再调用RtlSetCurrentTransaction和ZwCreateFile(所创建的文件是%TEMP%\ Liebert.bmp)。然后调用ZwWriteFile将缓冲区内容写入文件。我们可以看到正在写入的缓冲区中包含新的PE文件:第二阶段Payload。通常,对于此技术,文件仅在事务中可见,并且不能由其他进程(如AV扫描程序)打开。

然后使用此事务处理文件创建一个section。只能通过调用API:ZwCreateSection / NtCreateSection来实现此操作的功能。创建该部分后,不再需要该文件。事务将调用ZwRollbackTransaction回滚到之前的状态,并且对文件的更改永远不会保存在磁盘上。通过使用NTDLL副本调用的低级别函数,使这些操作更加隐蔽,不易被杀软发现。

8、从section到Process

如果这是典型的ProcessDoppelgänging技术,那么将带有映射Payload的section直接创建进程的这种情况永远不会发生。继续单步执行后可以看到在回滚事务之后调用以下函数:

ntdll_1.ZwQuerySectionntdll.NtClosentdll.NtClosentdll_1.ZwMapViewOfSectionntdll_1.ZwProtectVirtualMemoryntdll_1.ZwWriteVirtualMemoryntdll_1.ZwProtectVirtualMemoryntdll_1.ZwWriteVirtualMemoryntdll_1.ZwResumeThread

1、将新创建的section(PE文件)作为附加模块映射到新进程中。

2、修改内存属性后调用ZwWriteVirtualMemory 重定向远程进程OEP处代码,跳转重定向到注入模块的入口点。

修改前:

修改后:

3、再修改内存属性,调用ZwWriteVirtualMemory 重定向远程进程的PEB+8处代码(ImageBaseAddress),改为之前映射的section位置处:400000(PE文件)。

4、调用ResumeThread恢复远程进程,执行后运行的就是400000地址处PE文件OEP的代码:

如果使用以上方法修补入口点失败,则用第二个方法,在线程上下文中设置新地址(ZwGetThreadContext – > ZwSetThreadContext),这是Process Hollowing中使用的经典技术。

至此Loader部分就分析完成了。

 

总结

因为使用ProcessDoppelgänging技术的样本还是很少见的,而且这次GandCrab样本使用到了这项技术,自己之前也没研究过ProcessDoppelgänging技术,为了弄得更明白一些就多花了些时间,所以我就写的稍微详细一些,图文并茂,希望各位大佬勿喷。



本文由安全客原创发布                                
转载自安全客 - 有思想的安全新媒体


打赏我,让我更有动力~

0 条回复   |  直到 2018-11-8 | 1532 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.