介绍
“Hawkeye Keylogger”是一款在暗网上出售的信息窃取软件,自2013年以来一直在不断发展,也增加了许多新的功能和技术。它的主要功能就是从各种应用程序(主要是电子邮件客户端、Web浏览器和FTP客户端)处收集凭据,并通过协议(如FTP,HTTP和SMTP)将它们发送给威胁行为者。
Cybaze-Yoroi ZLAB将通过最近的Hawkeye样本对其逃避机制和利用Visual Basic封装器实施的反调试技术作说明。
技术分析
样本文件是一个ISO映像,其中有一个实际为PE文件的bat文件,我们可以提取bat文件并将其扩展名替换为“exe”。
图1:伪bat文件
Hash | 32951a56e3fcd8f5b006c0b64ec694ddf722eba71e2093f7ee90f57856941f3d |
威胁 | Hawkey间谍软件 |
简要描述 | Visual Basic 封装器内的Hawkey间谍软件 |
Ssdeep | 12288:GVwYvwrMkE9LfRUXkpW7zGidwY/rwxOp8mH:COrI9zRUJfGCfzw0 |
表1:PE文件的信息
ISO文件的AV检出率较低,近年来利用ISO文件攻击的手法也变得越来越流行,只有从ISO中提取出可执行文件才能提高检出率:
图2:ISO压缩文件(左)和提取文件(右)的AV检测
PE文件包含Visual Basic 5.0的存根,它能保护恶意软件的核心并使分析复杂化:
图3:Visual Basic封装程序
如上所示,恶意软件是用Visual Basic 5.0编写的,可以通过ad-hoc反编译器来处理。
图4:VB代码反编译成p-code
反编译后的代码被混淆过,想要获取感染机制更多信息的唯一解决方案是调试程序。
为了使分析复杂化,攻击者第一个技巧是动态地创建一个新的内存段,通过“VirtualAlloc”函数向里注入一些代码。恶意软件对该段代码解码后,会选择一个随机的新虚拟地址空间来分配内存,在本例中是“0x00260000”加载到了EAX寄存器中。
图5:通过VirtualAlloc API分配内存
GetTickCount反调试技术
在新分配的区域内切换上下文之后,恶意软件采用“GetTickCount()”反调试技术。根据MSDN文档,GetTickCount检索自系统启动以来经过的毫秒数,最多为49.7天。恶意行为者通过使用这个API调用来检索进程执行的时间,如果超过预设的阈值,则恶意程序终止执行:
图6:GetTickCount例程一个新的地址空间
创建地址空间的第一个恶意操作是调用GetTickCount API,结果是:
图7:EAX寄存器中的GetTickCount结果
GetTickCount函数的结果存储在EAX寄存器中。恶意软件在完成其他解密操作后会继续调用它。
图8:GetTickCount的减法反调试技巧
在第二次调用GetTickCount之后,会立即将上图所示的两个值相减,并将其放在EAX寄存器中。下一条指令是EAX寄存器和预先设置的阈值“0x5DC”之间的比较,“0x5DC”是十进制表示的1500。根据Microsoft文档,GetTickCount函数的分辨率为10ms,因此我们可以推断出攻击者的判定阈值为15秒。在理解了这个技巧之后,很容易绕过它继续分析样本。
图9:运行有效负载的ShellExecute例程
恶意软件会分配另一个内存空间来编写带有MZ头的文件,并通过“ShellExecute”API函数打开文件。此时,另一段隐藏在资源中的代码也出现了,这段代码在反调试技巧出现之前并不存在:
图10:原始exe和自修改exe之间的资源比较
如上图所示,原始文件(左侧)仅显示图标和清单作为资源,而自操作文件则在“RCData”中显示了一个名为“__”的资源,它是加密的最终payload。
图11:恶意资源检索例程
为了保护自己让分析变得更加困难,恶意软件通过“CreateProcessInternalW”API调用重新生成自己:
图12:最终payload的执行例程
现在,真正的payload已准备好使用自定义内部例程进行自解密。
图13:最终payload的解码例程
在解密例程之后,恶意软件通过“memcpy”函数将这段新代码复制到另一块内存中。此外,为了验证payload是否正确提取,恶意软件会检查存储器备用的前两个字节是否为“0x5A4D”,即ASCII码中的“MZ”。
图14:验证最终payload的正确解码
转储文件后,真正的payload就显现了出来。
Payload
提取的payload是使用.NET C#语言编译的PE文件,其中包含以下静态信息:
Hash | a3aa6e220591f05f4e2ecc4f4741ac6b6715ebb2b5c42c2b7bb52142c54be30b |
威胁 | Hawkey间谍软件 |
简要描述 | Hawkey间谍软件混淆payload |
Ssdeep | 6144:HuXT5iKKhhSHCMA2g22fB1YbcLetS7iz+K3hk:OXtxc/r1fXrwgil3h |
表2:最终payload的静态信息
Payload使用了.NET Reactor工具进行模糊处理,但可以轻松恢复已清除的版本:
图15:.NET Reactor混淆器使用痕迹
最终payload的一些静态信息:
Hash | a848c84a1306ea7cc4704eced4067db1012c0bf1b9b65f8c04a8379d71464eaa |
威胁 | Hawkey间谍软件 |
简要描述 | Hawkey间谍软件payload |
Ssdeep | 6144:37iz+K3hkCAg3JhmkuEFZ+1WjsroyGh0DBabr:Lil3hdhmOF |
表3:最终payload已清除版本的静态信息
由于payload是用.NET框架编写的,可以调试代码以检索此新样本的所有详细信息。调试样本的过程让我们发现其属于恶意软件HawkEye。
图16:通过Rijndael算法的循环字符串解密例程
每个敏感信息、字符串或其他信息都是通过Rijndael算法加密的,如图16所示。在开始任何操作之前,恶意软件会试图做一个简单的逃避伎俩——检索受害者机器的用户名,并将此用户名与一系列硬编码的用户名进行比较,这些用户名是沙箱采用的经典用户名,如果其中一个用户名匹配,则说明可能是在虚拟机中运行的。
图17:沙箱逃避技巧
简单检查后,信息窃取程序开始执行其恶意操作。第一个恶意操作是持久性机制:
图18:持久性机制
持久性机制是通过用值“C:\Users\Admin\AppData\Roaming\MyApp\MyApp.exe”设置注册表项“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”来成立的,值之前已在此路径中复制了自身。但如果恶意软件是从原始封装器中启动的,它将在“MyApp”路径中复制整个可执行文件,因为payload作为线程在封装器进程中执行;相反,如果只执行最终payload,则只存储此部分。
图19:禁用任务管理器
恶意软件采用了一种特殊的自动保护机制,通过设置图19中突出显示的注册表项,来禁用Task Manager进程开启的可能。此时,恶意软件可以启动信息窃取程序。
图20:从Internet Explorer检索密码的例程
信息窃取程序会从多种浏览器中检索所有敏感数据和登录数据,如下图所示:
图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:存储Microsoft Outlook客户端用户配置的注册表项
恶意软件检索特定的注册表项:“HKCU \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Windows Messaging Subsystem \ Profiles \ Outlook”,该表项中包含Microsoft Outlook用户配置文件。
图23:Outlook密码解密例程
图23中的方法“smethod_50”展示了如何简单地解密保存在该注册表项中的密码:它检索字节数组并将其作为参数与CurrentUser DataProtectionScope一起用于NET框架中提供的静态方法——“ProtectedData.Unprotect()”。 之后,收集的信息将收集在列表中,随时可以发送到服务器。
图24:创建收集的帐户列表
最后一项操作是准备将信息发送给收件人。作为经典的HawkEye恶意软件,传输的通信协议是SMTP。因此,恶意软件需要使用.NET框架提供的API才能实例化SMTP客户端。调试到正确的位置,恶意软件配置显示:
图25:SMTP客户端帐户配置
结论
Hawkeye如今是众所周知的威胁之一,之前已有文章分析过其感染链,在本文中我们对Hawkeye 的逃避机制和通过Visual Basic封装器实施的反调试技术作了说明。
IoC
Hashes
a3aa6e220591f05f4e2ecc4f4741ac6b6715ebb2b5c42c2b7bb52142c54be30b
ad688023760c7f54fe19ef956ca6407bd9f0512d4b019ef4327cfbc63c496309
30349db52f9a502056062354dfd4040dd392d3aaf41652a739de1950e7bc9bd4
32951a56e3fcd8f5b006c0b64ec694ddf722eba71e2093f7ee90f57856941f3d
67a052d6be1368bb1ec29fea377ae5f529ae539ec0114a2c4a70f83009c6db36
C2 (smtps):
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