Hawkeye逃避机制和反调试技术分析

Change Web安全 2019年7月26日发布
Favorite收藏

导语:“Hawkeye Keylogger”是一款在暗网上出售的信息窃取软件,自2013年以来一直在不断发展,也增加了许多新的功能和技术。

介绍

“Hawkeye Keylogger”是一款在暗网上出售的信息窃取软件,自2013年以来一直在不断发展,也增加了许多新的功能和技术。它的主要功能就是从各种应用程序(主要是电子邮件客户端、Web浏览器和FTP客户端)处收集凭据,并通过协议(如FTP,HTTP和SMTP)将它们发送给威胁行为者。

Cybaze-Yoroi ZLAB将通过最近的Hawkeye样本对其逃避机制和利用Visual Basic封装器实施的反调试技术作说明。

技术分析

样本文件是一个ISO映像,其中有一个实际为PE文件的bat文件,我们可以提取bat文件并将其扩展名替换为“exe”。

1.png

图1:伪bat文件image.png

表1:PE文件的信息

ISO文件的AV检出率较低,近年来利用ISO文件攻击的手法也变得越来越流行,只有从ISO中提取出可执行文件才能提高检出率:

2.png

图2:ISO压缩文件(左)和提取文件(右)的AV检测

PE文件包含Visual Basic 5.0的存根,它能保护恶意软件的核心并使分析复杂化:

3.png

图3:Visual Basic封装程序

如上所示,恶意软件是用Visual Basic 5.0编写的,可以通过ad-hoc反编译器来处理。

4.png

图4:VB代码反编译成p-code

反编译后的代码被混淆过,想要获取感染机制更多信息的唯一解决方案是调试程序。

为了使分析复杂化,攻击者第一个技巧是动态地创建一个新的内存段,通过“VirtualAlloc”函数向里注入一些代码。恶意软件对该段代码解码后,会选择一个随机的新虚拟地址空间来分配内存,在本例中是“0x00260000”加载到了EAX寄存器中。

5.png

图5:通过VirtualAlloc API分配内存

GetTickCount反调试技术

在新分配的区域内切换上下文之后,恶意软件采用“GetTickCount()”反调试技术。根据MSDN文档,GetTickCount检索自系统启动以来经过的毫秒数,最多为49.7天。恶意行为者通过使用这个API调用来检索进程执行的时间,如果超过预设的阈值,则恶意程序终止执行:

6.png

图6:GetTickCount例程一个新的地址空间

创建地址空间的第一个恶意操作是调用GetTickCount API,结果是: 7.png

图7:EAX寄存器中的GetTickCount结果

GetTickCount函数的结果存储在EAX寄存器中。恶意软件在完成其他解密操作后会继续调用它。

 8.png

图8:GetTickCount的减法反调试技巧

在第二次调用GetTickCount之后,会立即将上图所示的两个值相减,并将其放在EAX寄存器中。下一条指令是EAX寄存器和预先设置的阈值“0x5DC”之间的比较,“0x5DC”是十进制表示的1500。根据Microsoft文档,GetTickCount函数的分辨率为10ms,因此我们可以推断出攻击者的判定阈值为15秒。在理解了这个技巧之后,很容易绕过它继续分析样本。 9.png

图9:运行有效负载的ShellExecute例程

恶意软件会分配另一个内存空间来编写带有MZ头的文件,并通过“ShellExecute”API函数打开文件。此时,另一段隐藏在资源中的代码也出现了,这段代码在反调试技巧出现之前并不存在:10.png

图10:原始exe和自修改exe之间的资源比较

如上图所示,原始文件(左侧)仅显示图标和清单作为资源,而自操作文件则在“RCData”中显示了一个名为“__”的资源,它是加密的最终payload。

 11.png

图11:恶意资源检索例程

为了保护自己让分析变得更加困难,恶意软件通过“CreateProcessInternalW”API调用重新生成自己: 12.png

图12:最终payload的执行例程

现在,真正的payload已准备好使用自定义内部例程进行自解密。

 13.png

图13:最终payload的解码例程

在解密例程之后,恶意软件通过“memcpy”函数将这段新代码复制到另一块内存中。此外,为了验证payload是否正确提取,恶意软件会检查存储器备用的前两个字节是否为“0x5A4D”,即ASCII码中的“MZ”。

 14.png

图14:验证最终payload的正确解码

转储文件后,真正的payload就显现了出来。

Payload

提取的payload是使用.NET C#语言编译的PE文件,其中包含以下静态信息:

image.png

表2:最终payload的静态信息

Payload使用了.NET Reactor工具进行模糊处理,但可以轻松恢复已清除的版本:

 15.png

图15:.NET Reactor混淆器使用痕迹

最终payload的一些静态信息:

image.png

表3:最终payload已清除版本的静态信息

由于payload是用.NET框架编写的,可以调试代码以检索此新样本的所有详细信息。调试样本的过程让我们发现其属于恶意软件HawkEye。

 16.png

图16:通过Rijndael算法的循环字符串解密例程

每个敏感信息、字符串或其他信息都是通过Rijndael算法加密的,如图16所示。在开始任何操作之前,恶意软件会试图做一个简单的逃避伎俩——检索受害者机器的用户名,并将此用户名与一系列硬编码的用户名进行比较,这些用户名是沙箱采用的经典用户名,如果其中一个用户名匹配,则说明可能是在虚拟机中运行的。

 17.png

图17:沙箱逃避技巧

简单检查后,信息窃取程序开始执行其恶意操作。第一个恶意操作是持久性机制:

 18.png

图18:持久性机制

持久性机制是通过用值“C:\Users\Admin\AppData\Roaming\MyApp\MyApp.exe”设置注册表项“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”来成立的,值之前已在此路径中复制了自身。但如果恶意软件是从原始封装器中启动的,它将在“MyApp”路径中复制整个可执行文件,因为payload作为线程在封装器进程中执行;相反,如果只执行最终payload,则只存储此部分。

 19.png

图19:禁用任务管理器

恶意软件采用了一种特殊的自动保护机制,通过设置图19中突出显示的注册表项,来禁用Task Manager进程开启的可能。此时,恶意软件可以启动信息窃取程序。 20.png

图20:从Internet Explorer检索密码的例程

信息窃取程序会从多种浏览器中检索所有敏感数据和登录数据,如下图所示:

 21.png

图21:恶意软件获取的一部分浏览器列表

完整列表如下:

· Google Chrome

· Yandex

· Comodo Dragon

· Cool Novo

· Chromium

· Torch Browser

· 7Star

· Amigo

· Brave

· Cent Browser

· Chedot

· Coccoc

· Elements Browser

· Epic Privacy

· Kometa

· Orbitum

· Sputnik

· Uran

· Vivaldi

· UC Browser

· Flock Browser

同样,恶意软件也会寻找其他服务的凭证,如CoreFTP、FileZilla和JDownloader,以及受害者机器上的注册电子邮件帐户。搜索的电子邮件客户端为:

· Outlook

· SeaMonkey

· Postbox

· Thunderbird

现在,我们想了解Microsoft Outlook上恶意软件是如何收集密码的。

22.png

图22:存储Microsoft Outlook客户端用户配置的注册表项

恶意软件检索特定的注册表项:“HKCU \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Windows Messaging Subsystem \ Profiles \ Outlook”,该表项中包含Microsoft Outlook用户配置文件。

 23.png

图23:Outlook密码解密例程

图23中的方法“smethod_50”展示了如何简单地解密保存在该注册表项中的密码:它检索字节数组并将其作为参数与CurrentUser DataProtectionScope一起用于NET框架中提供的静态方法——“ProtectedData.Unprotect()”。 之后,收集的信息将收集在列表中,随时可以发送到服务器。

 24.png

图24:创建收集的帐户列表

最后一项操作是准备将信息发送给收件人。作为经典的HawkEye恶意软件,传输的通信协议是SMTP。因此,恶意软件需要使用.NET框架提供的API才能实例化SMTP客户端。调试到正确的位置,恶意软件配置显示:

 25.png

图25:SMTP客户端帐户配置

结论

Hawkeye如今是众所周知的威胁之一,之前已有文章分析过其感染链,在本文中我们对Hawkeye 的逃避机制和通过Visual Basic封装器实施的反调试技术作了说明。

IoC

Hashes

a3aa6e220591f05f4e2ecc4f4741ac6b6715ebb2b5c42c2b7bb52142c54be30b

ad688023760c7f54fe19ef956ca6407bd9f0512d4b019ef4327cfbc63c496309

30349db52f9a502056062354dfd4040dd392d3aaf41652a739de1950e7bc9bd4

32951a56e3fcd8f5b006c0b64ec694ddf722eba71e2093f7ee90f57856941f3d

67a052d6be1368bb1ec29fea377ae5f529ae539ec0114a2c4a70f83009c6db36

C2 (smtps):

[email protected]

us2[.outboind[.mailhostbox[.com

208.91.199.225

持久性机制:

注册表项设置 “HKCU\Software\Microsoft\Windows\CurrentVersion\Run”

Yara Rules

rule ISO_Dropper_HawkEye_201907 {
meta:
description = "Yara Rule for HawkEye ISO dropper"
author = "Cybaze - Yoroi ZLab"
last_updated = "2019-07-08"
tlp = "white"
category = "informational"
strings:
$s1 = "PowerISO" ascii wide
$s2 = "MSVBVM60.DLL" ascii wide
$h1 = {76 B6 45 77 B6 4C 7D B9}
condition:
all of them
}
 
rule Visual_Basic_Loader_HawkEye_201906 {
meta:
description = "Yara Rule for Visual Basic Loader and its payload (HawkEye)"
author = "Cybaze - Yoroi ZLab"
last_updated = "2019-07-08"
tlp = "white"
category = "informational"
strings:
$h1 = {52 94 5B C2 56 17 AB 6E 9D 6D F0}
$h2 = {13 41 63 ED 92 6B DF 6B 36 CD F8}
$s1 = "MSVBVM60.DLL" ascii wide
condition:
uint16(0) == 0x5A4D and all of them
}
本文翻译自:https://blog.yoroi.company/research/anti-debugging-techniques-from-a-complex-visual-basic-packer/ 如若转载,请注明原文地址: https://www.4hou.com/web/19379.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论