就在几天前,FortiGuard实验室从野外捕获了一个恶意的MS Word文档,其中包含可自动执行的恶意VBA代码,可以在受害者的Windows系统上传播和安装NanoCore RAT软件。NanoCore RAT是在.Net框架中开发的,其最新版本为“1.2.2.0”。它的作者“泰勒·哈德尔斯顿”被联邦调查局抓获并于去年初被送进监狱。我们捕获的样本使用NanoCore在受害者的系统上执行恶意行为。
在本博文中,我将展示它如何传播并安装到受害者的系统上。
一、恶意Word文档
图1.打开的恶意Word文档
捕获的Word文档的名为“eml _-_ PO20180921.doc”。当它在MS Word中打开时,我们会看到如图1所示的内容。如您所见,窗口顶部有一条黄色警告消息。
一旦受害者点击图1中的黄色按钮“启用内容”,恶意VBA代码就会在后台执行。 VBA代码从“Document_Open”函数自动执行。它的代码被混淆了,如图2所示。
图2.部分混淆的VBA代码
从图2中的API函数名称和调试输出信息中,我们可以看到VBA代码做了一件事:它从URL “hxxp://www.wwpdubai.com/wp-content/plugins/jav/inv.exe”下载一个EXE文件并将其保存为%temp% \CUVJN.exe。然后,在下载完成后执行此EXE文件。
图3.下载的CUVJN.exe的文件信息
CUVJN.exe是一个.Net框架程序。它的原始名称是“icce.exe”。图3中的屏幕截图显示了详细信息。但是,这不是真正的NanoCore RAT,它是在运行CUVJN.exe时提取的。让我们继续看看它是如何做到的。
二、执行下载的CUVJN.exe
我用.Net调试器dnSpy加载了CUVJN.exe。跟踪其主要功能,可以看到它从其资源部分加载了大量数据块,然后将它们放在一起进行解密。
从下面的图4中,可以看到CUVJN.exe通过“9”资源文件夹中的名称重复加载资源块。然后将所有数据合在一起放入本地数组变量“array10”。然后解密数据获得新的PE文件,可以在图5中看到它。
图4.从CUVJN.exe资源部分加载数据
图5.解密资源数据获取PE文件
解密的PE文件是另一个.Net框架程序。它的原始名称是“dll.exe”。此时,它的“主要”功能尚未被调用。下面是函数“МđыдĐäѦГБуѦ”的代码片段,显示它通过“invoke”调用“main”函数,其中参数“crap”包含“main”函数。这就像执行函数“invoke(crap)”。这意味着解密的“dll.exe”将在CUVJN.exe进程内运行。
public static void МđыдĐäѦГБуѦ(object fileName, object crap) { checked { try { NewLateBinding.LateCall(crap, null, "invoke", new object[] {null, new object[0] }, null, null, null, true); int num = 0; object instance; [ ... ]
根据我的分析,解密的.Net程序是守护进程。让我们继续从main函数中跟踪它。首先,它创建一个Mutex并检查该进程是否已存在,以确保只运行该程序的一个进程。接下来,它通过检测是否加载了“snxhk.dll”模块来检查受害者的系统上是否运行Avast。如果是的话,它会一直等到它被卸载。Avast是一款AntiVirus软件,“snxhk.dll”是其模块之一。
public static void avast() { try { IntPtr moduleHandle = RunPE.GetModuleHandle("snxhk.dll"); while (moduleHandle != IntPtr.Zero) { moduleHandle = RunPE.GetModuleHandle("snxhk.dll"); Thread.Sleep(500); } } catch (Exception ex) { } }
然后,它执行与上面的CUVJN.exe类似的活动,从其资源部分加载数据,这是一个gzip存档。然后执行以下函数解压缩gzip存档并获取PE文件。这才是真正的NanoCore RAT客户端。
public static byte[] DEC(byte[] ThrowApples, int VAR12 = 70) { int num = 0; GZipStream gzipStream = new GZipStream(new MemoryStream(ThrowApples), CompressionMode.Decompress, true); int num2 = ThrowApples.Length; byte[] result; try { byte[] array; for (;;) { array = (byte[])Utils.CopyArray((Array)array, new byte[num + num2 + 1]); int num3 = gzipStream.Read(array, num, num2); if (num3 == 0) { break; } num += num3; } array = (byte[])Utils.CopyArray((Array)array, new byte[num - 1 + 1]); result = array; } [ … ]
在运行真正的NanoCore客户端之前,它会执行一些检查。它检查当前进程的完整路径是否为“%AppData%\Microsoft\Windows\ScreenToGif\netprotocol.exe”。当然,结果是“FALSE”。我们仍在进程CUVJN.exe中,因此其完整路径为“%temp%\ CUVJN.exe”。然后它停止并将CUVJN.exe文件复制到文件夹“%AppData%\Microsoft\Windows\ScreenToGif\”,然后将其重命名为“netprotocol.exe”。之后,它使用新文件创建一个新的“Process”对象,并调用“Process”对象的“Start()”函数来运行。最后,它调用“ProjectData.EndApp()”来终止CUVJN.exe进程。
图6显示了将恶意软件复制到新路径,运行,然后退出CUVJN.exe的代码段。
图6.将恶意软件复制到新文件夹并运行
netprotocol.exe正在运行,因为它是“CUVJN.exe”的副本,可以预见它与我们上面介绍的CUVJN.exe完全相同。
1.从资源部分加载数据,然后解密获取“dll.exe”
2.在“netprotocol.exe”中运行“dll.exe”的主函数,而不是在“CUVJN.exe”中运行
3.从“dll.exe”的资源中解压缩NanoCore
4.检查当前进程的完整路径是否为“%AppData%\Microsoft\Windows\ScreenToGif\netprotocol.exe”。这次答案是“TRUE”。
让我们从中断的位置继续跟踪,其中只有进程名更改为“netprotocol.exe”。
三、守护进程无法终止
通过我的分析,“dll.exe”是一个守护进程。它启动另一个“netprotocol.exe”,将解压缩的NanoCore注入其内存,然后运行它。作为守护进程, “dll.exe”的一个任务是保持NanoCore在第二个“netprotocol.exe”中运行良好。它有一个“ProtectMe”类,包含有一个函数“ProtectMe.Protect()”,防止被杀。当第一次在测试环境中测试这个恶意软件时,我很惊讶我根本无法杀死进程“netprotocol.exe”。它既不是系统服务,也没有比我更高的特权。做了一些研究之后,我得到了这个类和函数,如下所示。
[DllImport("ntdll.dll")] private static extern IntPtr ZwSetInformationProcess(IntPtr _1, IntPtr _2, IntPtr _3, IntPtr _4); public static void Protect(){ ProtectMe.ZwSetInformationProcess(ProtectMe.GetCurrentProcess(), (IntPtr)33L, (IntPtr)ProtectMe.VarPtr(-2147421911), (IntPtr)4L);
事实证明它使用来自NTDLL.dll的未记录的函数ZwSetInformationProcess。这个函数可以修改进程的状态,这就是我无法杀死进程的原因。图7是当我试图通过命令“taskkill”杀死“netprotocol.exe”时的屏幕截图,守护进程“netprotocol.exe”(PID 3428)无法被杀死。
图7.无法终止守护进程
有一个名为“RunPE.doIt()”的函数用于运行和保护NanoCore RAT客户端。它调用API CreateProcessA来启动一个新的“netprotocol.exe”,然后暂停它。接下来,它在新的“netprotocol.exe”中分配内存,并使用API WriteProcessMemory将整个NanoCore放入新分配的内存中。最后,它将线程上下文的入口点修改为NanoCore的入口点,并通过调用API ResumeThread恢复在第二个“netprotocol.exe”内运行的NanoCore。
四、NanoCore RAT客户端
NanoCore是2013年首次发现的RAT(远程访问特洛伊木马)。它能够在受害者的机器上执行大量恶意操作,例如注册表编辑、进程控制、升级、文件传输、键盘记录、密码窃取等。
NanoCore是一个.Net框架程序。它的代码被完全混淆,如图8所示。
图8.混淆的NanoCore客户端代码
一旦在第二个“netprotocol.exe”中运行,它就会在“%AppData%”文件夹下创建一个新文件夹作为其主文件夹。新文件夹在我的测试环境中命名为“AA401429-5100-45C4-9496-689224150CC3”。它还会创建许多子文件夹,例如“DHCP Manager”和“Logs”,然后将“netprotocol.exe”复制到“DHCP Manager”并将其重命名为“dhcpmgr.exe”。然后,它在Windows注册表中创建一个自动运行项,其值为“DHCP Manager”,其数据是“dhcpmgr.exe”的完整路径。图9显示了该项的详细信息。
图9.添加到Windows注册表的自动运行项
“Logs”子文件夹包含从受害者系统收集的不同子文件夹中的数据,其名称是不同登录用户的当前登录用户名。
为了演示,我将展示如何记录输入。打开Chrome浏览器并进入了一个网上银行网站,在登录页面上输入了测试帐号和测试密码。可以发现我输入的所有内容都是由NanoCore客户端获取的,并保存在“Logs”子文件夹中我的登录用户文件夹下的文件中。文件名伪装成Windows更新日志文件。可以从图10中获得有关此内容的更多信息。
图10.键盘记录数据
五、解决方案
恶意Word文档已被检测为“VBA/Agent.1B7E!tr.dldr”,并且FortiGuard AntiVirus服务已将“CUVJN.exe”检测为“MSIL / Injector.REB!tr”。
恶意软件下载URL已被FortiGuard WebFilter服务评为“恶意网站”。
六、如何移除恶意软件
1>从系统注册表“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”或“HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”(取决于Windows系统版本)中删除值“DHCP Manager”并保存该值的数据供后续使用,如“%AppData%\[Random string]\DHCP Manager\dhcpmgr.exe”。
2>重新启动Windows系统。
3>删除文件夹“%AppData%\Microsoft\Windows\ScreenToGif”。
4>删除在步骤1中保存的文件夹。
IoC:
URL:
hxxp://www.wwpdubai.com/wp-content/plugins/jav/inv.exe
Sample SHA256:
eml_-_PO20180921.doc
FFEE1A33C084360B24C5B987B80887A2D77248224DBD6A0B6574FF9CEF74BDD6
CUVJN.exe / icce.exe / dhcpmgr.exe / netprotocol.exe
32BB5F767FE7788BCA4DD07F89F145D70EC3F58E2581CAB9CA6182D3FCE9BC86