执行摘要:
Petya 是一个加密恶意软件家族,它以 Windows 操作系统为目标,感染 MBR(主引导记录)以执行加密硬盘驱动器文件系统表的有效负载。
Petya 通过使用EternalBlue 的 MS17-010 漏洞在网络上传播。 它还通过窃取用户名和密码以及跨网络共享进行传播。
静态分析:
在IDA中打开勒索软件时,它从10007D39地址开始,函数是DLLEntryPoint,所以虽然文件扩展名是.exe,但实际上是DLL。
PeStudio:在pe信息中,我们看到其中两个对我来说可能是可疑的。
指定的文件头日期是5 年后,可能是关联的负载样本
在导入表中,寻找有趣的 api 调用,稍后在 IDA/Debugger 中调查这些调用以查看它们包含哪些值。
- CreateProcessW
这意味着创建的新进程在调用进程的安全上下文中运行。如果调用进程正在模拟另一个用户,则新进程使用调用进程的令牌。
- GetTokenInformation
- OpenProcessToken
它们都用于获取终端服务会话的 TokenSessionId。
猜测工作流程:在挂起模式下创建一个新线程。模拟令牌用 SetThreadToken 替换当前线程令牌,线程恢复。然后使用该线程作为模拟用户执行 SMB RCE。
- WNetCancelConnection2W
- WNetAddConnection2W
用于通过使用模拟令牌的默认凭据连接到服务器,然后取消连接。
- CryptEncrypt
加密数据的函数。在我们的情况下,我猜它会尝试加密 MFT
,因为它是勒索软件。
在“Library”选项中,我检查了勒索软件导入了哪个库以及它导出了哪个函数。在下图中可以知道程序没有压缩。
我关注的有趣的库是:
· Crypt32.dll — 可能会使用加密函数。
· Advapi32.dll - 可能会负责重启操作系统(我猜是因为勒索软件在加密所有文件后想要重启机器)。
· Shlwapi.dll — 适用于字符串和文件系统路径的函数。
· Ws2_32.dll — 它包含 windows sockets api,猜测是为了设置一些套接字。
另一种查找有关勒索软件的有趣信息的方法是阅读字符串。为此,我使用BinText。
这些字符串是可读的字符串的,将要查找的文件扩展名:
将显示在受害者屏幕上的勒索消息:
动态分析
正如我们在需要面对DLL的静态分析中看到的那样,我尝试在入口点使用 Rundll32 运行它,看看会发生什么。
我们如何知道入口点参数是什么?有一个可疑字符串是:
该字符串被描述为勒索软件由 rundll32 作为带有 #1 参数(这是库中的第一个值)的子进程运行。
此外,当将 dll 放入 IDA 时,在导出表中,我们可以看到我们应该运行一个导出函数。
使用导出选项卡的第一个功能运行勒索软件
我们在Process Hacker中看到我们之前使用的 cmd & rundll32 运行的 dll。
双击rundll32.exe,内存和字符串选项卡我们看到内存中运行的有趣字符串:
创建计划任务是为了关闭受害者的机器,因为恶意软件在重启后开始加密。
当我们进入任务调度程序本身时,我们会看到真正创建并准备运行的任务。
映射物理驱动器。这意味着勒索软件想要访问物理磁盘并加密MFT,因此文件系统将不可读。
下面的字符串描述了安全、应用程序、系统日志将被恶意软件删除。
简而言之,我们的样本没有留下任何痕迹。
当受害者的计算机重新启动时,Petya
会伪造“检查磁盘扫描”。 稍后我们将在重启 VM 后看到它。这个动作其实就是加密!
显示在受害者屏幕上的消息:
此外,我之前已经打开了Procmon,其中包含许多过滤器以捕获有趣的过程,例如:
- 进程创建
- 进程名称是Petya.dll
- 进程名称包含Rundll32
我们看到勒索软件创建了一个计划任务,在特定时间关闭受感染的机器,并在 AppData\Local\Temp 路径下创建了 tmp 文件“181E.tmp”。
该恶意软件似乎试图连接到admin$ 共享。
IDA:
- 当我将文件放入 IDA 时,第一件事是查看顶部分布颜色。例如,橄榄色是未开发的代码,粉红色是外部 符号,可以向我们表明我们的示例是否使用外部 DLL 库。(基本上这是一张表格,向我们展示了每个符号的内存位置——恶意软件代码的 API 调用)
- 第二件事我总是看导入表 非常重要,因为我们可以看到恶意软件使用了哪个 API 调用。
例如,正如我们在WNetAddConnection2w 的 API 调用的静态分析中看到的那样,我们可以通过按 x
来查看她对她的引用,也可以通过禁用 ASLR 和设置 BP 来查看我们的恶意软件连接。
勒索软件针对的扩展文件(您可以在审计部分找到它)
恶意软件“覆盖”了MBR。它推送一个名为“Physicaldrive0”的文件,其中包含许多参数,包括他自己,然后它转到 DeviceControl 函数(指定设备驱动程序)。
当我们双击该文件时,我们会看到它的入栈参数:
另一个有趣的事情是 DeviceControl 包含的参数之一,它是:hDrive。 它的参数给出驱动程序的句柄并检索有关物理磁盘、文件、线程等的信息。
网络枚举:
在恶意软件获得ComputerNameExW之后,在她创建CreateThread之前,我们可以看到条件 (jz) 有一个非常有趣的参数,它调用IpStratAddress,这是重建 SMB 协议的开始。
如果我们稍微往下看(在创建线程之后),我们会看到两次函数调用。
在第一个中,我们看到一个推送参数,如GetExtendedTcpTable,意思是“检索 TCP 端点列表”。换句话说,获取本地机器的 tcp 连接。
在第二个中,我们看到GetIpNetTable,意思是“给我你的本地网络 ip”。
使用 API 调用GetAdaptersInfo的 SMB 枚举。此调用的目标是获取所有网络接口(如工作站/服务器)的子网掩码。在调用结束时,我们有条件意味着如果不为零则跳转到 API 调用检索 inetaddr 并关闭套接字或跳转到 API 调用 LocalFree 检查磁盘上的可用空间并给出线索是服务器还是工作站.
它使用NetServerGetInfo api 调用检查它。
当我们深入研究“Check_If_Server_Or_Not”的调用时,我们看到三个参数被推送到 NetServerGetInfo 的调用中(bufptr、level、servername)。
-
第一个参数包含 65h 对象。
-
第二个是空的,这意味着等于 0。
来自 MSDN:bufptr指向服务器 101 信息结构。所以101对我来说是恶意软件返回服务器名称、类型和基础设施的行为。
结论:
======
总的行为总结为:
-
释放文件
-
令牌模拟
-
网络节点枚举
-
SMB复制和远程执行
-
通过 EternalBlue 开发 SMBv1
-
侦察并将恶意软件写入远程目标上的 admin$
-
MBR勒索软件
-
物理驱动操作
-
MFT加密
-
系统关闭
更多内容关注 gzh “TIPFactory情报工厂”