介绍本文是介绍恶意软件的持久性及传播性技术这一系列的第一次迭代,这些技术中大部分是研究人员几年前发现并披露的,在此介绍的目的是建立这些技术和取证方面的知识框架。 用于证明概念的代码可以在CERT的GitHub上查看。由于CERT分析师Devoteam在这个领域的经验,知识框架会不断完善。 第一篇文章将讨论DKOM(直接内核对象操纵)进程隐藏的以下几个方面:
这个概念在2004年的美国黑帽大会上被介绍,不过到现在还被用于几个内核工具,比如介绍者本人所开发的FU-rootkit。 Windows进程Windows内核使用EPROCESS来处理进程,这些是不透明进程,且没有被微软记录,标准编译头也没有详细标明。 MSDN链接:EPROCESS (Windows Driver) 但是这仍然能通过使用KD通过内核调试被分析。 该示例中的结构有207个字段(Windows 10 64位系统)。 只有三个相关的可以解释该技术。 此列表包含两个链接:Flink和Blink。这些链接很有趣,因为它们指向属于属于下一个进程(Forwardlink)和之前的进程(Backlink)的另外两个LIST_ENTRY结构。 Windows系统中的所有进程通过其ActiveProcessLinks结构中的指针来引用。它们构成了诸如taskmgr.exe(任务管理器)或某些SysInternals(例如procexp.exe)等工具使用的双链表。 双链表会被定时检查以更新进程显示。 隐藏直接内核对象的修改DKOM技术隐藏了一个取消链接它自己的ActiveProcessLinks的进程,并将“前一个”和“下一个”进程直接相互链接。 从双链表中获取进程(示例图中的smss.exe)使得它不依赖于此列表的工具来显示进程。 取消链接流程不会影响其执行流程。调度器将计算时间分配给线程,而不是进程。 当修改恶意进程的ActiveProcessList时,它的Blink和Flink被修改以指向它们自己的结构。这样做是为了避免在进程退出时出现任何问题。如果Blink或Flink指向的是旧的或无效的内存地址,那么当尝试更新“相邻”进程时,内核可能会引发异常。 实现关于概念性证明(PoC)的评论CERT在Github上的代码是一个测试驱动程序,它是从使用内核模式驱动程序框架的Windows示例中实现的。驱动配置的初始化使用WDF_DRIVER_CONFIG_INIT()被hook。该hook搜索一个ImageFileName字段为virus.exe的进程,并使用DKOM技术进行隐藏。 注意:这不是一个功能性的工具(只是在安装的时候会尝试隐藏一个进程),而且只被用于教学目的。 该代码大量使用Windows 10 64位测试的硬编码的存储器偏移。它们被用于直接访问EPROCESS字段,并且在其他Windows版本上可能无法正常工作。 以上显示的偏移可以在Windows进程部分的第一个KD截图中找到。 代码很容易被改进,可以使用更稳定的访问这些字段的方式然后提供一个用户控制界面。 EPROCESS字段访问及版本Windows API没有提供EPROCESS的结构定义,但是可以使用API调用来检索这些结构的指针。 PoC中使用的函数是PsGetCurrentProcess(),它返回一个当前进程“EPROCESS”结构的指针。在执行的过程中,它返回一个指向System进程结构的指针,一旦找到一个EPROCESS结构,就调用一个搜索函数,以便通过EPROCESS循环列表来查找virus.exe ImageFileName。 如果搜索返回一个EPROCESS结构,那么它的ActiveProcessLinks就会被修以隐藏它。这通过EPROCESS结构在内存中的操作来实现。 其他相关与当前操作系统的保护PoC生成的驱动程序已提交到https://nodistribute.com/平台,以检查是否会报毒。 没有一个报了毒,考虑到代码十分简单,系统调用量也很低,这样一来就一点也不奇怪了。另外,虽然这种技术非常隐蔽,但是并不是在所有Windows版本上都很稳定。 一个叫PatchGuard的对Windows 64位的保护可以检测前面提到的操作。PatchGuard也被称为内核补丁保护(KPP),于2005年在Windows XP 64位和Windows Server 2003 SP1中被引入。 KPP以一个随机频率验证内核结构,几十分钟可以分开成两个检查。当检测到异常时,会引发0×109 - CRITICAL_STRUCTURE_CORRUPTION内核错误,然后强制阻止系统执行。其实KPP并没有真正阻止这种技术的执行,它只是关闭了操作系统。 由于该技术旨在提供隐蔽性,而蓝屏的显示会破坏其有效性。另外,该保护仅在64位版本的Windows中实现,所以32位系统就会容易受到攻击。如今,大多数人安装的都是64位,因此他们会被保护免受这种威胁。 不过即使使用了KPP,这种技术也不能忽视,因为:
使用Volatility进行内存检测使用工具在受感染的主机上检测这种技术可能有点棘手,不过它可以很容易地在内存捕获中被检测到。事实上,许多监控/系统工具(例如SysInternals Microsoft套件)都是基于双链表的进程枚举。 为了演示这个概念,PoC已在运行Windows 10 Professional版本的主机上执行。 在PoC系统上执行的Process Explorer,VMMap,ListDlls和Handle64的示例这个进程对于这几个工具是不可见的。但是该进程其实正在运行,并且其系统事件可以被进程监视器捕获。 在现实生活中,很多rootkit可以修改和劫持大量的系统功能,使得大多数实时检测变得更加困难。这里推荐使用诸如Volatility等适应框架对RAM转储然后脱机研究。 以前提到的Windows版本由拥有Win10x64_14393的配置文件的Volatility 2.6支持。 内存转储由Winpmem实现,该工具是Google Rekall项目分发的工具。 在Winpmem的输出中列出了驱动程序名称,我们可以看到PoC二进制文件(这里称为2017_remote_helloworld)。 一旦内存捕获过程完成,研究就可以开始了。 Volatility有几个插件来分析转储中的运行进程,可以通过以下方式进行快速比较: 只有psscan和psxview发现了我们的隐藏过程。 这些插件的文档可以帮助我们了解为什么有些人会发现这个进程,为什么有些人没有发现。
在这些插件中,psxview是分析正在运行的进程的最快方法,它为用户提供了不同检测技术。 我们知道隐藏的进程称为virus.exe,且PID为4952,现在可以利用Volatility进一步研究。 在这种“隐藏”情况下,PID不能直接被Volatility插件使用,因此必须指定进程内存偏移量。 对于大多数波动插件,可以使用存储器偏移(P代表Physical)代替PID。 有了这个信息,可以获得很多东西,例如:
References
|
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|