0%

APT29 / Cozy Bear使用的Miniduke

这篇文章详细分析了APT29使用的Miniduke,Minicuke是纯汇编编写的一个后门 ,该恶意软件采用了控制流整平迷惑并且实现了多种数据泄露的方法,比如用POST和PUT HTTP方法发送数据给C2服务器,或者在无网络连接的情况下用一个命名管道。后门实现37种不同的功能,如下图。

img

技术分析

首先用IDA打开文件,看到第一个函数setunhandledexceptionfilter,恶意软件将异常过滤器函数设置为特定函数。

img

前面的函数有点看不出来是个啥,我们注意看最后一个函数,可以看到用了GetStartupInfo获取STARTUPINFO结构的内容。Sub_4030A4如下图,可见是创建了一个线程。我们点进StartAddress看看

img

img

StartAddress函数前部分非常多的Switch case函数,即使是后半段的这些函数也有非常多的switch case结构,非常多的无用的计算,并且加载了三个dll。

img

在IDA的图中可以看到startAddress如下,这就是前面说的控制流整平诱惑。StartAddress中的loc_4036F2中就实现了30个case,我们将该跳转用nop替换掉,因为该命令占6字节,nop一个字节,所以要用6个nop。

img

img

img

img

SetErrorCode函数参数为2,作用是让系统不显示Windows错误报告对话框 (0x2 = SEM_NOGPFAULTERRORBOX)。加载的三个dll后的sub_407B60中有一个函数sub_417DCC,将在执行期间运行,并使用哈希机制定位。基本上,对于DLL中的每个函数名,恶意软件计算一个4字节的值,并与硬编码的值进行比较。这些函数都是目标:GetProcAddress, GetLongPathNameA, GetLastError, CreateProcessWithLogonW, CryptAcquireContextW, CryptGenRandom, InternetOpenA, InternetConnectA, InternetSetOptionA, HttpOpenRequestA, (httpsendRequestA, HttpQueryInfoA, InternetReadFile, InternetCloseHandle, HttpAddRequestHeadersA。

img

img

在该函数中有一个sub_423FC8函数,红框圈起来的函数就是hashing函数

img

img

现在回到加载dll的目标函数中,下图中的API用于连接CSP,获得指定CSP(真正实行加密的独立模块)的密钥容器的句柄(0x1 = PROV_RSA_FULL, 0xF0000040 = CRYPT_VERIFYCONTEXT | CRYPT_SILENT****)

img

img

下图函数使用一个子权限分配和初始化安全标识符(SID)

img

通过将新的访问控制或审核控制信息合并到现有的ACL结构中来创建新的访问控制列表(ACL)

img

通过恶意进程初始化新的安全描述符

(0x1 = SECURITY_DESCRIPTOR_REVISION),并使用setseCurityDescriptordACL API设置DACL(自定义访问控制列表)中的信息

img

进程创建了一个Software\Microsoft\ApplicationManager注册键值

img

一个新的值AppId被创建,使用GetTickCount函数调用的输出计算此值,它检索自系统启动以来经过的毫秒数

img

img

img

继续查看下一个函数sub_41CD30,

从上面的一个输出被转换并写入缓冲区,以及“AppID”值。将使用传统算法加密此缓冲区,该算法还包括XOR运算符(sub_420200):

img

img

img

控制流整平

if-else、while、for具有典型的跳转等结构,即使通过多层嵌套、拓展条件等方法,依然可以通过“切片技术”来判断。有了这些依据,就给程序分析带来很多便利。
正是这个原因,为了增加程序逆向的难度,我们得使得这些特征结构变得模糊,并且能让类似“切片技术”这样基于具体语义分析的方法失效,迫使逆向分析人员进行完整的抽象语义分析,斩断所谓的“捷径”。
控制流整平的策略是这样的,它把所有的典型控制流以及其衍生结构“统而为一”,各种控制流的区别只是语义方面的,增加了理解控制流转换关系的难度。

控制流整平迷惑,是通过打破程序原有的控制流之间的嵌套和顺序关系,使得变换后的程序控制流扁平化的混淆方法,其基本思想是令程序中所有的基本块拥有共同的前驱和后继代码块。如下图

img

进行控制流整平后,使得面向过程的代码片段,原来比较清晰的控制流向混杂在一起,同时这也比较好的并行图形态,也有利于进一步的迷惑处理。