黑客组织攻击政治机构,其植入程序进化地更加隐秘

lucywang
我们还没有看到任何最近使用rundll的攻击。事实上,在最近的攻击活动中,攻击者发起KONNI Rat的唯一方式就是注册一个Windows服务。因此,在真实世界的攻击中并没有使用rundll32分支。

2345截图20211028093243.png

KONNI是一种远程访问木马,至少在8年前就被发现了。使用这款恶意软件的朝鲜威胁者已经在金苏基的保护伞下被确认。这个组织一直试图发起攻击,主要目标是俄罗斯和韩国的政治机构。

近日,研究人员发现朝鲜APT组织Konni的攻击活动,该组织向俄罗斯大使馆外交官发送以新年问候为主题的电子邮件,以进行情报收集活动。在本次攻击活动中,最终的植入程序被称为Konni RAT,其代码和行为与其以前的版本相似。攻击中所使用的攻击链与该组织的TTP重叠,包括使用CAB文件作为感染阶段以及使用bat文件自动安装Konni RAT并设为服务。

攻击链

攻击通常开始于恶意Office文档地利用,当这个文档被受害者打开时,一个多阶段攻击就开始了,涉及多个步骤。但这些步骤只是攻击者设法完成提升权限、逃避检测和部署所需文件任务的方式。正如我们在之前的一篇文章中所描述的,攻击链可以用下图来概括:

2345截图20211028093243.png

简化后的攻击链

可以看到攻击是从利用恶意Office文档开始的。当这个文档被受害者打开时,一个多阶段攻击就开始了,包括各个步骤。但这些步骤只是攻击者设法完成提升权限、逃避检测和部署所需文件任务的方式。

攻击的最终目标是安装所谓的“KONNI Rat”,这是一个由.ini文件支持的.dll文件。简而言之,.dll文件包含RAT的功能,.ini文件包含第一个C&C服务器的地址。KONNI Rat的一般行为与以前的版本几乎相同,但我们将在下面介绍一些变化。

不再支持Rundll

在之前的KONNI Rat示例中,有两个途径。一个处理恶意软件是否通过Windows服务启动,另一个通过rundll处理执行。下图显示了这两个过去的途径,svchost.exe和rundll32.exe字符串可见:

2345截图20211028093243.png

显示svchost.exe和rundll32.exe字符串的老式主函数

但是,新示例不会显示这些字符串。实际上,rundll不再是执行示例的有效方式。相反,当使用rundll发生执行尝试时,会在早期阶段引发异常。

2345截图20211028093243.png

rundll执行产生的异常

在我们分析的早期阶段,我们认为他们正在使用经典的进程名称检查或任何其他常用技术。现实要简单得多。实际的导出只是实现了SvcMain原型,因此程序在访问其中一个参数时会在某个时候中断。

在上图中,我们看到了出现此异常时设备的状态。此时的RDI应包含指向一个服务名称的指针。发生异常是因为Service Main函数满足一个原型,而rundll32将期望另一个不同的原型:

VOID WINAPI SvcMain(DWORD dwArgc,LPTSTR*lpszArgv)

VOID WINAPI runnableExport(HWND hwnd,HINSTANCE hinst,LPSTR lpszCmdLine,int nCmdShow)

基本上,在执行过程中,hinst将被视为lspzArgv,从而导致异常。但为什么攻击者要删除该功能呢?有多种好处。

首先,我们还没有看到任何最近使用rundll的攻击。事实上,在最近的攻击活动中,攻击者发起KONNI Rat的唯一方式就是注册一个Windows服务。因此,在真实世界的攻击中并没有使用rundll32分支。

但沙盒无法收集示例的真实行为还有另一个重要原因,因为它无法以这种方式执行。

字符串现在使用AES保护

多个恶意软件家族保护他们的字符串,目的就是为了防止字符串分析。KONNI也不例外,他也使用了这种技术。老式示例使用base64进行模糊处理处理。而且,他们使用的是自定义字母表。为了使解码任务更加困难,这个习惯字母表不时地发生变化:

2345截图20211028093243.png

旧的Konni示例包括他们自定义的base64字母,后面跟着模糊处理的字符串

现在,攻击者在这方面做了一个重大的改变,使用AES加密来保护字符串。新的Konni RAT示例所遵循的算法可以表示如下:

2345截图20211028093243.png

新的KONNI示例现在使用AES加密来保护字符串

这一变化背后的原因是显而易见的。由于用于解密的密钥是服务名,不同服务名运行的示例将无法正常工作。此外,在不知道服务名称的情况下仅拥有示例变得毫无用处,因为这些字符串包含有关示例行为的核心信息。

文件也使用AES进行保护

KONNI Rat在执行时会使用各种支持文件,其中一个文件是.ini文件,其中包含主要的C&C服务器,但还有其他文件,例如应该最终删除的.dat文件,以及用于发送有关计算机的一些基本信息的临时文件。

调查显示,所有这些文件都使用AES进行了删除和保护。巧妙的地方在于,他们重用了用于字符串保护的算法,使文件布局与受保护的字符串布局相同,因为它们出现在原始内存中:

2345截图20211028093243.png

新的KONNI示例现在也使用AES加密来保护文件

从图中可以看出,文件本身包含了IV和加密的数据。使用的密钥是从其原始文件名中提取的。在某些情况下,名称与服务名称匹配,因此.ini和.dat文件中使用的密钥也是对服务名称应用SHA256的结果。

此外,发送到C&C服务器的文件使用AES进行保护。IV是使用QueryPerformanceCounter API CALL生成的。文件名由表示数据的2个字母和当前时间戳连接而成,后面跟着扩展名。此外,他们将使用这个新生成的名称作为AES密钥,因此他们通过请求将这个名称发送到C&C服务器。

2345截图20211028093243.png

即将发送到服务器的请求片段

由于文件名是使用时间戳自动生成的,因此相同的文件将产生不同的请求内容,因为它们是使用该文件名加密的。因此,网络签名也可能无法检测到此恶意活动。

其他模糊处理技术

除了发现一些仅通过我们之前描述的方式受到保护的示例,我们还发现了其他使用身份不明的封装程序的示例。我们想分享一些关于该封装程序的注释,因为其他人可能会发现它在识别和归因任务中很有用。

指令连续模糊处理

模糊处理程序的流程将使用一系列推送调用指令对,其中推送的值将指示程序将采取的行动。下图可以更好地解释其过程:

2345截图20211028093243.png

推送调用指令对

特别值得注意的是,攻击者在这些对之间放置了随机字节。这个愚蠢的技巧会导致反编译程序错误的代码解释,这些反编译程序会假定push指令之后的字节是下一条指令的一部分。下图显示了IDA无法分析代码的原因:

2345截图20211028093243.png

与前面的代码相同,显示了IDA为何不能表示真正的代码

模糊处理程序流程

使用的封装程序会模糊处理原始程序流程。这是通过不同的步骤中完成的。第一个需要的步骤是找到Image Base值,放置在一个固定位置和RIP(指令指针)值。

2345截图20211028093243.png

EBX将保存RIP值

一旦封装程序知道这两个值,它就会开始从一个地方跳到另一个地方,使分析变得更加困难。为此,它将存储在下一个地址的某个寄存器值中以跳转到寄存器中。这些寄存器的值是在jmp指令之后立即计算的,使用像POP[reg]-jmp[reg]或ADD[reg1,reg2]-jmp[reg1]这样的结构。请注意,反编译程序将无法显示实际流程,因为跳转地址是由一个未定义的寄存器确定的。

2345截图20211028093243.png

显示最终jmp变为RBX的模糊处理代码

这些简单技术的组合使封装程序现在处于流的控制中,但静态反编译程序无法表示代码将遵循的路径。最后,封装程序会执行大量的垃圾指令,并最终执行真正有趣的代码。例如,在IAT构建任务中,原始代码在GetProcAddress调用之间将使用不超过20条指令。但封装后的代码可执行超过30000条指令。

但根据最近的追踪分析,最近的攻击不再使用该封装程序。

总结

如上所述,KONNI Rat每隔一段时间就会更新迭代一次。开发者会不断改进代码。在我们看来,他们的努力旨在打破沙盒规则,使检测更加困难,特别是通过常规签名,因为可执行文件的关键部分现在已加密。

本文翻译自:https://blog.malwarebytes.com/threat-intelligence/2022/01/konni-evolves-into-stealthier-rat/

THEEND

最新评论(评论仅代表用户观点)

更多
暂无评论