对Windows Rootkit的细粒度动态分析

2015-03-23 9,026

近期发现的针对Windows用户的复杂攻击中都至少有一部分代码运行在系统内核中。例如:Equation, Regin, Dark Hotel, or Turla/Uroburos这些APT攻击。他们已经受到各种安全公司和研究团队的关注和检查。

由于他们在系统内核中运行的部分具有当前计算机的最高权限,因此这样的威胁是非常致命的。同样的,由于他们同传统反病毒软件运行在相同的系统权限下,使得他们很难被发现/防御。

与此同时,因为此类内核级APT的行为是处于使用传统Hook手段的沙盒的监视范围之外的,因此通过,此类传统沙盒进行分析也只是杯水车薪。

在后面,我们将展示最新的版本的Lastline Breach检测平台是如何使用全系统模拟的方法来击败最新的内核级攻击的。在后面的内容中,我们将集中介绍单一的APT家族和技术,以及我们的沙盒是如何发现和分析这些攻击的。

rootkit

分析内核中的恶意代码

当今大部分的传统沙盒是通过,在被分析程序加载用户层DLL的时候,设置Hook的方法来实现API调用劫持的。这个思路是拦截(有时甚至是篡改)那些可以在系统上引发安全相关行为的传入参数。

那些更先进一丢丢的沙盒还可以通过分析程序拦截系统调用,以防恶意程序绕过用户层的Hook拦截,直接进行系统调用。这两种沙盒系统的中心思想是,对所分析的程序,通过在它们感兴趣的关键点上接管恶意代码的执行,然后记录下所调用的函数(和它们的参数)。

当恶意程序设法加载内核中的部分时(例如通过一个溢出,这个我们会在后面补充),这个部分代码被无差别的当成可信的系统代码被载入。到了这里,通过传统Hook技术出发动作的监视已经不可行了。因为,恶意软件的行为已经不再依靠用户层API或者系统调用了。

随着内核级APT的流行,克服这一问题对于防御这些最新的攻击变得至关重要。

Lastline Breach的细粒度沙盒使用全系统模拟的方法,允许我们查看测试环境中的每一条汇编指令。这就可以让我们在任何时间(无论恶意程序代码是处于用户层还是系统层)让沙盒中的程序停在我们感兴趣的代码片上(而不是只能在API调用或者系统调用时才能停下程序),以此来记录程序的行为。与此同时,我们的方法还可以跟踪代码段被不可信的模块(例如:刚刚加载的驱动)加载或者修改。通过跟踪,可以分辨出代码片是属于可信任的内核模块还是需要特别注意的恶意程序。

解析传统Rootkit

首先,让我们简单的回顾一下内核级攻击在过去是如何实现的。尽管,下面所描述的攻击是非常浅显的,他们仍然强调了一些关键的概念。这也正是,新一代分析沙盒所需要具备可以分析恶意内核代码的能力。

大部分传统Rootkit可以实现用户层部分代码的隐藏。这个功能是用来对抗杀毒软件和病毒分析者寻找攻击线索。这可以通过Hook、篡改关键的系统表(例如:SSDT或者IDT)或者篡改系统其它内存区域(例如:系统模块的代码段或者数据段)

对于这些Rootkit,攻击的流程通常是:首先,攻击程序溢出,以获取当前系统权限(例如:攻击者欺骗用户访问一个可以溢出用户浏览器的地址)然后加载一部分恶意代码到系统内核。这部分代码拦截了来自用户层的所有系统调用,并过滤掉了所有可能泄露恶意程序的返回。例如:一个安全产品正在搜索一个目录下新生成的文件时,这部分代码将在目录列表返回前移除其中恶意程序的相关部分。通过相同的方式,这部分代码可以过滤并隐藏掉注册表的修改,当前正在运行的进程,或者其他攻击所产生的系统事件。

1-anatomy-of-traditional-kernel-rootkits

 

大家可能已经猜到了,这部分内核中的过滤代码正是恶意程序存在的证明。正因为如此,Lastline Breach的分析引擎可以分析沙盒中最新载入的系统内核的代码。此外,当任何一个关键的函数或者内存地址被Hook或者篡改,分析系统将凭借这条信息,将这部分代码的行为定义为恶意的。与此同时,分析报告中将详细的列出所有的类似上面提到的被Hook或者篡改的具体信息,用以向分析者提供非常有价值的信息:

2-malware-analysis-report-showing-kernel-modification

 

3-malware-analysis-showing-SSDT-hooks-modification

 

 

4-analysis-showing-critical-kernel-memory-region-modification

解析内核级APT

从最近几波内核级的APT攻击(例如:Equation, Regin, Dark Hotel, or Turla/Uroburos)中我们可以看到恶意程序作者通过Hook技术已经不仅限于隐藏用户层部分的代码,同时也施加于其内核部分,并在内核部分融入了更复杂的功能。例如:新加入的功能可以直接在内核中对任意的运行中的进程插入任意代码,或者下载并安装其他恶意代码。

与此同时,这些APT攻击程序在对抗传统的给予特征判断的系统中变得更加隐蔽。通常,他们使用加密和分段加载的方式来绕过分析。他们通常将加密过后的文件保存在文件系统未分区的部分磁盘区段中来达到隐藏的目的,即使使用一个可信的系统来分析,也无法找到这个恶意程序。

5-anatomy-of-kernel-based-APTs

 

由于用户层和系统层内存都可见,Lastline Breach可以对任意代码段进行全面的分析。我们的引擎可以实时的发现不可信代码段中存在篡改或者出入其他用户进程,或者系统存在篡改用户进程的行为。

通过以上的方式,我们的分析结果反映出了攻击的全部过程,从最初的溢出篡改内核,到通过内核代码篡改用户进程。

6-kernel-memory-hooking-and-user-mode-injections

 

通过Necrus,理解内核篡改

通过我们之前的文章所描述的对进程快照进行的分析(地址:http://labs.lastline.com/exploit-analysis-via-process-snapshotting)Lastline Breach引擎除了交给安全研究员分析过程中的详细行为报告外,还允许Dump下各个恶意代码段。

由于也可以对内核级的恶意代码进行Dump,所以让我们来深入的观察一下Necrus Rootkit变种的内核部分的行为。

分析过Necrus 的安全研究员(或者研究过任意Rootkit的人)一定知道,各种解密和混淆的冗长过程,严重影响到了我们分析内核部分代码的兴趣!

下面就是Necrus的一部分解密代码片:

7-understanding-kernel-modifications-necrus

 

除了混淆和解密外,Necrus还加入了很多无关的导入函数:

8-necrus-fake-entries-import-table

 

幸运的是由于Necrus的内核部分已经解密过了,所以本次分析我们可以跳过设置内核断点的步骤。Lastline Breach引擎已经自动为我们分析好了,并为我们提供了一份去混淆、解过密,且可以用IDA加载的重新打包过的程序快照。

通过IDA打开,这个快照展示了解密过后代码的全部信息。例如“Rebuilt APIs”表中包含了导入函数对应的解密后的调用信息。

9-deobfuscated-function-pointers-extracted-analysis-engine

 

通过这张表,分析者可以轻松的找到他们感兴趣的Hook点。例如,我们可以通过跟踪KeServiceDescriptorTable的调用,找到SSDT被Patch的地方,并看到了NtOpenProcess和NtOpenThread同时也被Hook了。

10-malware-sample-patches-the-SSDT

 

这里通过MDL映射SSDT表,并找到NtOpenProcess和NtOpenThread对应的位置,并用自身的函数地址覆盖。随后的,从用户层的NtOpenProcess和NtOpenThread的调用都被劫持到Rootkit的函数中。

总结

在最近几年,内核级的恶意代码已经变成最高级最复杂的攻击程序的一部分。因此,安全方案和分析沙盒需要适应和具备分析、理解内核代码并防范这累威胁的能力。Lastline Breach具有细粒度沙盒通过全系统模拟的方法并可以对系统层和用户层进行有效的分析。这允许我们获得一份完整的恶意程序行为记录,来发现和缓解这类威胁。

想要了解Lastline Breach更多的功能,可以通过我们今天刚刚发布的公告

【原著:lastline labs 翻译:360安全播报

本文作者:SP胖编

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/5542.html

Tags:
评论  (0)
快来写下你的想法吧!

SP胖编

文章数:59 积分: 0

神器 神器 神器

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号