反取证技术:内核模式下的进程隐蔽

新闻 Windows
本文是介绍恶意软件的持久性及传播性技术这一系列的第一次迭代,这些技术中大部分是研究人员几年前发现并披露的,在此介绍的目的是建立这些技术和取证方面的知识框架。

本文是介绍恶意软件的持久性及传播性技术这一系列的第一次迭代,这些技术中大部分是研究人员几年前发现并披露的,在此介绍的目的是建立这些技术和取证方面的知识框架。

用于证明概念的代码可以在 CERT的GitHub 上查看。由于CERT分析师Devoteam在这个领域的经验,知识框架会不断完善。

第一篇文章将讨论DKOM(分布式组件对象模式)进程隐藏的以下几个方面:

Windows进程

隐藏直接内核对象的修改

概念性证明(PoC)

使用Volatility进行内存检测

这个概念在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 ,这种技术也不能忽视,因为:

在32位系统的事件响应中可以遇到。

内核模式驱动(仍然是一个活跃的研究领域)存在对 PatchGuard 的攻击。

使用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发现了我们的隐藏过程。

这些插件的文档可以帮助我们了解为什么有些人会发现这个进程,为什么有些人没有发现。

pslist – 通过检查双链表来检测进程

pstree – 使用了相同技术,只是显示有小小的差别

psscan – 在内存中扫描_POOL_HEADER结构(内存页池)以识别相关进程

psxview – 几种技术的组合:

pslist :如上所述

psscan :如上所述

thrdproc :线程扫描,检索调度程序使用的_KTHREAD列表(不能在不中断进程执行的情况下修改它),然后搜索相关的_EPROCESS对象。

pspcid

csrss :csrss.exe进程保留着可以在其内存中检索到的进程的独立列表。

session

deskthrd

在这些插件中,psxview是分析正在运行的进程的最快方法,它为用户提供了不同检测技术。

我们知道隐藏的进程称为virus.exe,且PID为4952,现在可以利用Volatility进一步研究。

在这种“隐藏”情况下,PID不能直接被Volatility插件使用,因此必须指定进程内存偏移量。

对于大多数波动插件,可以使用存储器偏移(P代表Physical)代替PID。

有了这个信息,可以获得很多东西,例如:

打开系统资源的处理(文件,注册表项…)

进程命令行

驱动程序/rootkit也可以从内存转储中恢复

 

 

责任编辑:张燕妮 来源: 推酷
相关推荐

2023-03-02 15:48:02

2024-08-26 08:39:26

PHP孤儿进程僵尸进程

2017-06-05 09:35:39

2011-05-24 09:30:26

Findbugs

2021-07-26 07:47:36

数据库

2016-08-23 09:17:08

LinuxD状态TASK_RUNNIN

2014-07-30 10:08:13

Python反模式

2012-02-02 09:21:39

编程

2021-10-29 05:53:51

前端测试开发代码

2018-04-09 03:43:41

零宽字符秘密字符数据泄露

2023-10-30 18:59:38

REST API开发

2020-09-14 08:30:44

Kubernetes容器

2023-09-13 11:58:17

云原生反模式

2019-01-29 10:10:09

Linux内存进程堆

2012-11-30 10:44:06

网络回溯分析技术

2019-04-10 13:43:19

Linux内核进程负载

2018-08-08 14:55:32

KVM虚拟化取证

2021-01-11 05:37:54

仓储模式接口

2015-10-10 11:23:17

Java常量反模式

2015-09-22 10:56:13

Java反模式
点赞
收藏

51CTO技术栈公众号