几天前,Fortinet
的FortiGuard实验室
在网络中获取到一个恶意的MS Word文档。在文档中,研究人员发现了可自动执行的恶意VBA代码,并且可以在受害者的Windows系统上安装NanoCore RAT
软件。 NanoCore RAT
是在.Net框架中进行开发,其目前最新版本是“1.2.2.0”。 该软件的作者“泰勒·哈德尔斯顿
”被联邦调查局抓获并于去年初被送进监狱。 而本次我们获取的样本就是使用NanoCore
,从而在受害者的系统上执行恶意代码。
在这篇文章中,我将展示它如何进行传播并安装到受害者的系统上。
我们获取的Word文档的名称是“eml _-_ PO20180921.doc”
。 当把它在MS Word中打开时,我们会看到如图1所示的内容。正如图中所示,应用窗口顶部有一条黄色警告消息。
一旦受害者点击图中的黄色按钮“启用内容”,恶意VBA代码就会在后台执行。 VBA代码可以从“Document_Open”
中自动执行。 它的代码进行过混淆操作,如图所示。
在图中,我们观察API函数名称并调试输出信息,我们可以看到VBA代码做了一件事:它从指定的URL处下载了一个EXE文件“hxxp://www.wwpdubai.com/wp-content/plugins/jav/inv.exe
“并将其保存到”%temp%\ CUVJN.exe
“中。 然后在下载完成后执行此EXE文件。
CUVJN.exe
是一个.Net
框架程序。 它的原始名称是“icce.exe
”。 图中的截图显示了相关的详细信息。然而我们是在运行CUVJN.exe
时进行提取的,并不是真正的NanoCore RAT
应用。让我们继续看看恶意代码如何运行。
我用.Net
调试器dnSpy
加载了CUVJN.exe
。我们对其主要功能进行跟踪,我们可以看到它从其资源部分加载了大量数据块,然后将它们放在一起并对它们进行解密。
从下面的图中我们看到CUVJN.exe
通过“9”资源文件夹中的名称重复加载资源块。 然后将所有数据放在一起形成本地数组变量“array10”。 然后进行解密数据操作以获得新的PE文件。
从CUVJN.exe
资源部分加载数据。
解密源文件得到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
”。 当然,这里的结果是“假”。 此时我们仍在进程CUVJN.exe中
,因此其完整路径为“%temp%\ CUVJN.exe
”。 然后它停止上述操作并采取分支将CUVJN.exe
文件复制到文件夹“%AppData%\Microsoft\Windows\ScreenToGif\
”,然后将其重命名为“netprotocol.exe
”。 之后,它使用新文件创建一个新的“Process”对象,并调用“Process”对象
的“Start()
”函数来运行它。 最后,它调用“ProjectData.EndApp()”
来终止CUVJN.exe
进程。
下图显示了如何将恶意软件复制到新路径,并进行运行操作,然后退出CUVJN.exe
的代码段。
作为“CUVJN.exe”的副本,由于“netprotocol.exe”正在运行,所以我们可以预期它与我们上面回顾的CUVJN.exe完全相同。 他们是:
1.从资源部分加载数据,然后解密它以获取“dll.exe”文件。
2.在“netprotocol.exe”中运行“dll.exe”的主要功能,而不是“CUVJN.exe”。
3.从“dll.exe”的资源中解压缩NanoCore
。
4.检查当前进程的完整路径是否为“%AppData%\Microsoft\Windows\ScreenToGif\netprotocol.exe
”。 这次答案是“正确”。
让我们从中断的位置继续跟踪,其中只有进程的名称已更改为“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
。 这个函数可以修改进程的状态,这就是我无法杀死进程的原因。 下图是当我尝试通过命令“taskkill”
杀死“netprotocol.exe”
时的屏幕截图,守护进程“netprotocol.exe”(PID 3428)
无法被杀死。
此处有一个名为“RunPE.doIt()
”的函数用于运行和保护NanoCore RAT
客户端。 它调用API CreateProcessA
来启动一个新的“netprotocol.exe
”应用,之后暂停它。 接下来,它在新的“netprotocol.exe”
中分配内存,并使用API WriteProcessMemory
将整个NanoCore
放入新分配的内存中。 最后,它将线程上下文的入口点修改为NanoCore
的入口点,并通过调用API ResumeThread
在第二个“netprotocol.exe”内运行NanoCore
。
NanoCore
是2013年首次发现的RAT(远程访问特洛伊木马)
。它能够在受害者的机器上执行许多恶意操作,例如修改注册表、进程控制、提权操作、文件传输、键盘记录、密码窃取等。
NanoCore是一个.Net框架程序。 它的代码被完全混淆。入下图所示。
一旦它在第二个“netprotocol.exe”
中运行,它会在“%AppData%”
文件夹下创建一个新的主文件夹。 新文件夹在我的测试环境中命名为“AA401429-5100-45C4-9496-689224150CC3
”。 它还会创建许多子文件夹,例如“DHCP Manager
”和“Logs
”,然后将“netprotocol.exe
”复制到“DHCP Manager
”并将其重命名为“dhcpmgr.exe
”。 然后,它在Windows注册表中创建一个自动运行项,其值为“DHCP Manager”,其数据内容是“dhcpmgr.exe”的完整路径。 下图显示了详细信息。
“Logs”
子文件夹包含从受害者系统收集的不同子文件夹中的数据,其名称是不同登录用户的当前登录用户名。
为了方便演示,我将展示如何输入消息。 我打开了Chrome浏览器并访问了一个网上银行网站,我在登录页面上输入了测试帐号和测试密码。 我们可以发现我输入的所有内容都被NanoCore客户端获取,并保存在“Logs”子文件夹相关登录用户的文件中。 文件名伪装成Windows更新日志文件。
恶意Word文档已被检测为“VBA/Agent.1B7E!tr.dldr”
,并且FortiGuard AntiVirus服务已将“CUVJN.exe
”检测为“MSIL/Injector.REB!tr”
。
恶意软件下载的URL已被FortiGuard WebFilter
服务评为“恶意网站”。
1> 从系统注册表“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”
中删除值“DHCP Manager
”(取决于Windows系统版本)并保存数据供以后使用,例如“%AppData%\ [随机字符串]\DHCP Manager\dhcpmgr.exe”
。
2> 重新启动Windows系统。
3> 删除“%AppData%\Microsoft\Windows\ScreenToGif
”文件夹。
4> 删除在步骤1中保存的文件夹。
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
文章为翻译稿件。原文:https://www.fortinet.com/blog/threat-research/-net-rat-malware-being-spread-by-ms-word-documents.html