背景
NetWire是一种远程访问木马(RAT)恶意软件,已经活跃了很多年。近期,FortiGuard实验室发现了一种通过网络钓鱼电子邮件传播的恶意软件,经过对其进行分析,我们发现它实际上是NetWire RAT的新型变种。
本文主要分析该新型恶意软件变种在受害者主机上进行的操作。
通过网络钓鱼传播NetWire
下图是网络钓鱼电子邮件内容的屏幕截图,在其最下面包含一个类似于PDF的图片,并带有一个指向NetWire下载链接的超链接。一旦受害者单击该链接,恶意软件文件就会被下载到受害者的系统上。
包含图片和下载链接的网络钓鱼电子邮件:
如我们所见,恶意软件文件下载链接为:“hxxps[:]//www[.]mediafire[.]com/file/d86hz5qj21lmhrb/PROFORMA-INVOICE_0990.7z/file”。
下载的是一个.7z文件,其中包含NetWire RAT的新型变种。在进行解压缩后,我们可以得到一个名为“PROFORMA-INVOICE 0990.exe”的.exe文件。
解压缩7z文件:
反分析技术
NetWire的这一变种是使用MS Visual Basic编译的,该恶意软件使用了多种反分析技术来保护其免受分析。
1、恶意软件会动态地将恶意代码提取到内存中并执行,这使得执行静态分析的过程变得更加困难。
2、在启动后,恶意软件会暂时停止运行,直到受害者移动鼠标为止。具体而言,恶意软件是通过比较前后两次鼠标光标的位置来完成这一操作的。如果两次位置不匹配,则表明鼠标已经移动。这一项技术用于防范沙箱分析。
如下图展示,恶意软件两次调用USER32.GetCursorPos() API,来获取两次的鼠标光标位置,然后进行比较。如果两次位置相同(受害者没有移动鼠标),则恶意软件将暂时停止运行,并在睡眠结束后再次执行检查。该恶意软件会重复执行此操作,直到结果不同位置。
检查受害者是否移动了鼠标:
3、恶意软件还是用了反调试技术,它将检测是否已经设置硬件断点、内存断点和单步断点。除此之外,在每次调用几个关键的API函数时,它都会首先检查该API是否具有调试器设置的软断点。
下面是执行此检测的代码片段:
call dword ptr [ebp+110] ; kernel32.GetCurrentThread push dword ptr [edi+4000] push eax call dword ptr [ebp+104] ; ntdll.ZwGetContextThread cmp eax, 0 jnz short 00391EA5 mov eax, dword ptr [edi+4000] cmp dword ptr [eax+4], 0 ; Dr0 jnz short 00391EA5 cmp dword ptr [eax+8], 0 ; Dr1 jnz short 00391EA5 cmp dword ptr [eax+C], 0 ; Dr2 jnz short 00391EA5 cmp dword ptr [eax+10], 0 ; Dr3 jnz short 00391EA5 cmp dword ptr [eax+14], 0 ; Dr6 jnz short 00391EA5 cmp dword ptr [eax+18], 0 ; Dr7 jnz short 00391EA5 pop eax ; Key API address, like kernel32.CreateProcessInternalW mov bl, byte ptr [eax] cmp bl, 0CC ; check soft breakpoint je short 00391EA5 mov bx, word ptr [eax] cmp bx, 3CD ; check soft breakpoint je short 00391EA5 mov bx, word ptr [eax] cmp bx, 0B0F ; check soft breakpoint je short 00391EA5 call eax ; call the API like kernel32.CreateProcessInternalW movd ecx, mm1 movd edx, mm3 sub edx, 4 loc_391E95: xor dword ptr [edx], ecx sub edx, 4 cmp dword ptr [edx+4], 41414141 jnz short 00391E95 jmp ecx loc_391EA5: sub esp, 100 sub ebp, 100 popad jmp eax ;;;; Jump to random address to crash itself.
它还调用ntdll.ZwGetContextThread API以获取当前线程上下文结构,该结构中包含CPU调试寄存器状态。一旦调试器设置了硬件断点,CPU就会注册Dr0、Dr1、Dr2、Dr3、Dr6和Dr7不为0,并注册eax为API地址。在最开始,该过程会检查这些地址,以确认它们是否被设置为0CC、3CD和0B0F,这些是软断点的操作码(INT 3)。一旦上述条件之一被触发,NetWire就会进入到一个随机地址使之崩溃。随后,Windows将弹出一个崩溃消息,如下图所示。
反调试机制被触发:
4、与大多数恶意软件一样,NetWire会产生自身的暂停状态子进程,然后修改其内存和线程的上下文数据。在这种情况下,它仅在线程上下文中修改OEP值。一切准备就绪后,父进程将使子进程继续运行,父进程自身将退出。在这里,会提取NetWire的真实代码,并覆盖子进程中的现有代码,然后在子进程中执行该代码。这样一来,恶意软件就会使其自身变得更加难以分析。
子进程分析
在线程中调用新NetWire变种的真实代码的OEP。首先,通过调用WSAStartup() API来初始化几个全局变量和Windows套接字。接下来,将会解密一些加密的字符串。
子进程会检查当前的可执行文件是否位于正确的文件夹(%AppData%\Install)中,同时检查是否具有正确的文件名(Host.exe)。如果不是,会将文件重新放置到“%AppData%\Install”目录下并将其重命名为“Host.exe”。
随后,它将运行重新放置的文件,并退出当前进程。然后,新的进程将再次进行上述所有过程。下图是进程树的截图,我们可以看到NetWire重定位到“C:\Users\user_name\AppData\Roaming\Install\Host.exe”的过程。
重定位后的NetWire:
NetWire继续创建其主键(HKCU\SOFTWARE\NetWire),并添加到受害者注册表的自动运行组之中。这样一来,当受感染的系统启动时,它将会自动运行。下图展示了注册表编辑器的屏幕截图。
NetWire被添加到系统注册表的“自动运行”组中:
NetWire创建了一个日志文件夹,用于存储从受害者系统收集的信息的日志文件。日志文件夹位于“%AppData%\Logs”。随后,它将调用_beginthreadex()函数来启动线程,该线程的线程函数注册了一个窗口类,这一窗口类的窗口过程函数是一个按键记录程序。随后,它将记录受害者的所有键盘操作、时间以及受害者所键入内容。记录的数据被编码后存储在日志文件中。
编码后的Keylogger日志文件及其解码后的内容:
上图左侧是编码后的键盘记录器记录,右侧是使用我自行编写的Python脚本解码后的纯文本内容。其中用红色方框标出的,是我在Google Chrome浏览器中输入的网站。
与C&C服务器进行通信
恶意软件通过DNS服务获取C&C服务器的IP地址。在解密的字符串中找到该域名,针对我们所分析的变种,域名是“gbam0001.duckdns[.]org:3366”。
由于我在开始分析该变种时,C&C服务器已经关闭,因此我在一个测试系统上使用了一个伪造的C&C服务器来发送我们精心制作的响应数据包。
一旦建立了与服务器的连接,NetWire就开始等待C&C服务器以“9B”命令包进行答复,我在伪造的C&C服务器上发出了这样的命令宝。
NetWire有一个被我们称为“Task_Fun()”的函数,用于处理来自C&C服务器的所有命令。NetWire在收到“9B”命令后,Task_Fun()将会在一个子进程中对其进行处理,该子进程将收集受害者计算机的基本信息,并将其发送回C&C服务器。
收集的受害者计算机信息被发送到C&C服务器:
上图展示了要发送到C&C服务器上的数据包。其中,前四个字节为十六进制的“56”,表示后面数据的大小。“9B”是命令编号。其余部分都是Payload数据。“07”是用于分隔不同数据字段的特殊分隔符。
所有的数据包都具有以下相同的结构:
从“9B”数据包中,我们可以看到,NetWire从受害者的系统中收集了以下信息:
1、通过调用GetUserNameA() API,或从系统环境变量收集当前登录的用户名。
2、通过调用GetComputerNameA()来获得受害者的计算机名称。
3、通过调用GetVersionExA()来获得受害者的Windows版本信息。
4、获取当前活动的应用程序标题,在我们的分析过程中为“Google Chrome”。
5、获取受害者计算机的当前时间,在我们的分析过程中为“2019-09-14 16:59:34”。
6、获取计算机的IP地址,在我们的分析过程中为“10.0.2.15”。
NetWire的新变种目前仅支持9B命令。
NetWire变种的其他功能
如上所述,函数Task_Fun()将处理命令,并为一个命令调用一个子过程。除了“9B”命令之外,它还包含80多个子程序。这意味着,它可以处理从C&C服务器发送的80多个命令。
下面是这一NetWire变种支持的全部功能集,我们可以具体分析,看看它们可以在受害者的系统上做些什么。
1、获取一个时间值,即从上次输入以来,受害者持续处于非活动状态的时间。
命令编号:097h
2、执行下载的可执行文件,或执行现有的本地文件(例如“cmd.exe”)。
命令编号:09Ch, 09Ch, 0A3h, 0AFh, 0B6h, 0C3h
3、执行以下操作:退出NetWire进程,关闭C&C服务器的套接字,从系统注册表中的Home键读取值,重置或删除指定的注册表键,删除NetWire可执行文件并重新定位其可执行文件(“Host.exe”)。
命令编号:09Fh, 0A0h, 0A1h, 0A2h, 0AEh, 0E5h, 0E7h
4、收集受害者系统的分区和硬盘驱动器信息,获取指定文件夹中的文件信息,通过指定的文件类型获取文件信息,创建指定的目录和文件,将内容写入指定的文件,删除、重定位特定文件,以及其他与文件相关的操作。
命令编号:09Fh, 0A0h, 0A1h, 0A2h, 0AEh, 0AFh, 0B0h ~ 0B5h, 0B7h, 0DFh, 0E8h
5、窃取并收集通过不同软件存储在受害者系统中的凭据。重点针对以下软件:360Chrom、Opera、Mozilla Firefox、Mozilla SeaMonkey、Google Chrome、Comodo Dragon浏览器、YandexBrowser、Brave-Browser、Mozilla Thunderbird、Microsoft Outlook和Pidgin。除此之外,还会从历史记录文件夹中读取受害者的浏览器历史记录。
命令编号:0D4h, 0D5h, 0D6h, 0D7h, 0D8h, 0D9h
6、操作该文件夹中的日志文件(%AppData%\Log)包括枚举日志文件、获取指定的日志文件属性、读取和删除指定的日志文件。
命令编号:0CCh, 0CEh, 0CFh, 0D0h
7、获取在受害者设备上创建的窗口句柄,通过指定的Windows句柄向窗口发送Windows消息,获取受害者设备上所有正在运行的进程信息,使用特定的进程ID终止正在运行的进程,获取TCP或UDP终端信息(TCP或UDP、本地和远程IP地址、端口、状态)以及连接该终端的进程信息(进程名称、进程ID)的列表。
下面是我从我的测试环境中,收集到的终端数据的示例:
1E6D8050 73 76 63 68 6F 73 74 2E 65 78 65 07 37 30 38 07 svchost.exe708 1E6D8060 54 43 50 07 30 2E 30 2E 30 2E 30 3A 31 33 35 07 TCP0.0.0.0:135 1E6D8070 30 2E 30 2E 30 2E 30 3A 30 07 4C 69 73 74 65 6E 0.0.0.0:0Listen 1E6D8080 69 6E 67 2E 2E 2E 07 6E 63 2E 65 78 65 07 33 34 ing...nc.exe34 1E6D8090 32 38 07 54 43 50 07 30 2E 30 2E 30 2E 30 3A 34 28TCP0.0.0.0:4 1E6D80A0 34 33 07 30 2E 30 2E 30 2E 30 3A 30 07 4C 69 73 430.0.0.0:0Lis 1E6D80B0 74 65 6E 69 6E 67 2E 2E 2E 07 53 79 73 74 65 6D tening...System 1E6D80C0 07 34 07 54 43 50 07 30 2E 30 2E 30 2E 30 3A 34 4TCP0.0.0.0:4 1E6D80D0 34 35 07 30 2E 30 2E 30 2E 30 3A 30 07 4C 69 73 450.0.0.0:0Lis 1E6D80E0 74 65 6E 69 6E 67 2E 2E 2E 07 77 6D 70 6E 65 74 tening...wmpnet 1E6D80F0 77 6B 2E 65 78 65 07 32 37 32 30 07 54 43 50 07 wk.exe2720TCP 1E6D8100 30 2E 30 2E 30 2E 30 3A 35 35 34 07 30 2E 30 2E 0.0.0.0:5540.0. 1E6D8110 30 2E 30 3A 30 07 4C 69 73 74 65 6E 69 6E 67 2E 0.0:0Listening. 1E6D8120 2E 2E 07 53 79 73 74 65 6D 07 34 07 54 43 50 07 ..System4TCP 1E6D8130 30 2E 30 2E 30 2E 30 3A 32 38 36 39 07 30 2E 30 0.0.0.0:28690.0 1E6D8140 2E 30 2E 30 3A 30 07 4C 69 73 74 65 6E 69 6E 67 .0.0:0Listening […]
命令编号:0BEh, 0C0h, 0C1h, 0C2h, 0E3h
8、收集受害者的计算机基本信息,包括当前用户名、登录会话信息、计算机名、CPU信息、Windows版本、内存状态、网络状态和Windows安装路径。此外,还会收集PowerShell安装路径、NetWire可执行文件的完整路径和其Log文件夹的完整路径等等。
命令编号:0BAh, 0BCh
9、控制受害者的输入设备,包括键盘和鼠标。通过发送keybd_event和mouse_event,可以模拟键盘和鼠标操作。
命令编号:0C5h, 0C6h, 0C7h, 0C8h
在上述命令操作完成后,还会将带有执行状态或所收集数据的数据包发送到其C&C服务器。
解决方案
目前,网络钓鱼电子邮件中的原始下载URL和C&C服务器域名都已经被FortiGuard Web过滤服务标记为“恶意网站”。
FortiGuard反病毒服务将7z文件和解压缩后的exe文件检测为“W32/NetWire.A!tr”。
样本SHA-256
[PROFORMA-INVOICE 0990.exe]
C9EC52AE2DDB993E2DA0EFD4FBAB0BFECDC7CC6DA16E446AC9C92E7981733E6E
[PROFORMA-INVOICE 0990.7z]
56BB4AAC4E52FD5D71824782D1DBE05D4209045C1E5DD80936690E81652183B8