幽灵进程攻击 Bypass | 红队攻防
2023-5-5 09:7:16 Author: 0x00实验室(查看原文) 阅读量:33 收藏

    该技术涉及创建一个幽灵进程,这是作者用来描述在运行之前从磁盘中删除有效负载的机制的术语,本质上使它成为一个幽灵。

表中的内容

  • 流程创建和安全漏洞

  • 可执行文件、进程和线程

  • 创建流程

  • 进程重影

  • 使用 SharpGhosting 处理重影演示

流程创建和安全漏洞

    在 Windows 生态系统中,反病毒解决方案开发人员调用 API(如 PsSetCreateProcessNotifyRoutineEx)可以告知他们的 AV 解决方案有关特定进程执行的信息,但是,回调不会在进程执行时发送,而是在该进程中的第一个线程时发送被执行。因此,创建进程和向反病毒解决方案发送创建通知之间的间隙是攻击者可以实现进程重影的地方。

可执行文件、进程和线程

    可执行文件是包含要由机器运行的程序的编译文件。可执行文件可以具有多个要执行的功能,当运行这些功能中的每一个时,它被称为一个进程。进程 ,用最简单的术语来说,就是一个正在执行的程序。每个进程都链接到特定的 PE(exe、dll 等)。一个可执行文件也可以有多个进程。这可以在任务管理器-> 详细信息中查看。

    线程是操作系统分配处理器时间的进程的基本单元。线程可以执行流程代码的任何部分。一个进程中存在多个线程。多线程意味着多个线程运行同一部分进程代码。Windows 支持多任务处理,因此可以创建尽可能多的线程,因为有许多处理器可同时运行它们。它可以有三种状态:运行、就绪和阻塞。

创建流程

    可以使用CreateProcess或NtCreateUserProcess函数在 Windows 中创建进程。此函数是可单独修改的其他函数的组合,可以对句柄、截面图像、线程等进行操作。

    例如,CreateProcess (lpApplicationName)定义要执行的应用程序。

进程重影

    现在我们已经介绍了基础知识,让我们了解如何处理重影作品。这是一种技术,攻击者创建一个文件(恶意软件),将其标记为删除(删除挂起状态),将恶意软件复制/映射到内存(图像部分),关闭句柄(将其从磁盘中删除) ,然后从 now-fileless 部分创建一个进程。在了解攻击之前,我们必须了解以下内容:

句柄用于内存管理,这些是对内核空间中资源的引用。这些不仅包含有关资源的信息,还提供访问权限。

int fh = open(“/etc/passwd”, O_RDWR);

fh 是一个文件句柄。当我们使用 open() 函数打开文件时,它会返回变量 fh 的句柄。现在 fh 可用于对文件执行以下功能:

            fh.read()

            fh.append()

            fh.close()

而且,被 fh 访问的文件不能被任何其他句柄(或任何其他进程)读取、写入或执行。fh.close() 将关闭文件句柄,即不会访问该文件。

图像部分部分是文件到内存的映射。图像部分是一种特殊类型的部分,对应于可移植可执行 (PE) 文件,只能从 PE(EXE、DLL 等)文件创建。

Delete_Pending 状态:与文件可能存在的读取、写入、删除状态一样,Delete_Pending 是文件尚未删除的状态。该文件尚未删除,因为句柄可能使它保持打开状态。一旦句柄关闭,文件将被删除。在 Delete_Pending 状态下,没有其他进程可以对该文件进行操作。

因此,整个Process Ghosting流程如下所示:

第 1 步:使用 NtCreateFile() 函数创建一个文件。这将创建我们预期的恶意软件。另外,会给我们一个文件句柄

比如:hFile = NtCreateFile(C:\Users\a_cha\Desktop\random.exe)

hFile 是这个文件的句柄

第 2 步:将文件置于 delete_pending 状态。

这可以使用NtSetInformationFile () 函数来完成。

通过使用FileDispositionInformation标志,文件将被置于删除挂起状态。我们可以使用 hFile 在我们的文件上执行此任务。

第 3 步:将有效负载(恶意软件)写入这个新创建的文件。由于文件处于 delete_pending 状态,一旦关闭,数据就会消失。但我们会在它消失之前执行第 4 步!

第 4 步:使用函数NtCreateSection(hFile, SEC_IMAGE)创建文件的图像部分。它可以像这样完成:hSection = NtCreateSection(hFile, SEC_IMAGE)。这就是我们需要句柄的原因,因为 NtCreateSection() 将文件句柄作为输入。现在我们可以安全地删除句柄了。

第 5 步:删除我们新创建的句柄。这也会从磁盘中删除我们相应的文件(恶意软件),但是,它的副本仍然存在于图像部分。

第 6 步:从图像部分创建一个新进程。由于代码存在于虚拟内存中,因此可以使用NtCreateProcessEx(hSection)创建新进程,就像 hProcess = NtCreateProcessEx(hSection)

第 7 步:分配流程参数和环境变量。这一点很重要,因为如果没有进程参数和环境变量,操作系统将不会执行该进程并且代码将保持暂停状态。

第8步:创建线程在进程中执行。可以使用CreateThread()函数并提供要执行的进程的起始地址来完成。

    一旦为恶意软件的执行创建了线程,就会调用反病毒回调并阻止文件。由于线程是在文件被删除后创建的,因此永远不会调用反病毒回调。反病毒软件打开此文件的任何尝试都会引发 STATUS_FILE_DELETED 错误。

IkerSaint 创建了一个名为“KingHamlet”的进程重影攻击的概念证明,可以在此处下载。该工具首先加密文件,然后执行攻击。让我们运行一个快速演示,看看如何处理重影作品。

使用 SharpGhosting 处理重影演示

    基于上面解释的方法,自 Gabriel 关于 Elastic Security 的帖子以来,许多 POC 已经浮出水面。在此演示中,我们将使用 Wra7h 开发的 Process Ghosting 的 C# 实现。在尝试之前,您必须拥有较旧的 Windows 10 版本,因为在这种技术出现后,Microsoft 修补了防御者检测。如果您正在渗透测试并找到较旧的 Windows 10,那么您知道该怎么做!

阅读 github 存储库中的代码

https://github.com/Wra7h/SharpGhosting

您可以使用以下命令编译此源代码:

C:\Windows\NET\Framework64\v3.5\csc.exe/out:SharpGhost. exe /unsafe C:\ProcessGhosting\SharpGhosting-main\*.cs

请随意更改路径。此外,您需要 .NET Framework v3.5 自行编译

    为了使事情变得简单并为您省去编译的麻烦,我已经 fork 了 repo 并为您创建了一个 EXE,可以在此处下载。下载文件后,我们可以继续演示。正如你所看到的,我们有防御者工作。

现在,我们可以使用以下命令启动我们的 ghost 进程:

.\SharpGhost。exe -real <路径> \名称。EXE文件

在这里,我启动了 mimikatz 实例,它被任何可以想象的反病毒解决方案检测为恶意软件。目的是在运行时绕过反病毒检测。

.\SharpGhost。exe -real C:\ProcessGhosting\mimikatz. EXE文件

此命令会将 mimikatz 作为幽灵进程启动。您可以打开任务管理器并转到详细信息以查看正在运行的幽灵进程。此进程没有名称,因为相关的 EXE 不存在。

如您所见,防御者在运行时并未将 mimikatz 检测为恶意软件。这是因为当为恶意软件的执行创建线程时,调用 AV 回调并且文件被阻止。由于线程是在文件被删除后创建的,因此永远不会调用反病毒回调。

结论

    这篇文章涵盖了在启动 Process Ghosting PE 注入攻击时使用的各种编码函数的简单易懂的理论解释。在这项技术发布后不久,微软推出了补丁来解决这个问题。这不再适用于最新的 windows 10 和 windows 11,但是,旧的 windows 10 仍在组织和家庭系统中使用,聪明的攻击者可以利用这一点。因此,必须始终保持系统更新并在系统中安装最新补丁。希望你喜欢这篇文章。订阅博客以接收每日更新,感谢阅读。


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247489210&idx=1&sn=f309c55ac72424f46d7743f32acd5343&chksm=cfd86945f8afe053663c4a4ad6b2fb04301bf49f3d31bb1ca4acf56ca26253295f22c0989a03#rd
如有侵权请联系:admin#unsafe.sh