介绍
Gabriel Landau 在这里 发布了一篇关于 Elastic Security 的帖子,其中讨论了一种可以发现防病毒规避的技术。该技术涉及创建幽灵进程,这是作者使用的一个术语,用于描述在运行之前从磁盘中删除有效负载的机制,本质上使其成为幽灵。
表中的内容
·流程创建和安全差距
·可执行文件、进程和线程
·进程的创建
·进程重影
·使用 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.第 1 步:使用 NtCreateFile() 函数创建文件。这将创建我们预期的恶意软件。另外,会给我们一个文件句柄。比如:hFile = NtCreateFile(C:Usersa_chaDesktoprandom.exe)
hFile 是这个文件的句柄
1.第 2 步:将文件置于 delete_pending 状态。这可以使用NtSetInformationFile () 函数来完成。通过使用FileDispositionInformation标志,文件将被置于删除挂起状态。我们可以使用 hFile 对我们的文件执行此任务。
1.第 3 步:将有效负载(恶意软件)写入这个新创建的文件。由于文件处于delete_pending状态,一旦关闭,数据就会消失。但我们会在它消失之前执行第 4 步!
2.第 4 步:使用函数NtCreateSection(hFile, SEC_IMAGE)创建文件的图像部分。可以这样做:hSection = NtCreateSection(hFile, SEC_IMAGE)。这就是为什么需要我们的句柄,因为 NtCreateSection() 将文件句柄作为输入。现在我们可以安全地删除我们的句柄了。
3.第 5 步:删除我们新创建的句柄。这也会从磁盘中删除我们相应的文件(恶意软件),但是,它的副本仍然存在于图像部分。
4.第 6 步:从图像部分创建一个新进程。由于代码存在于虚拟内存中,因此可以使用NtCreateProcessEx(hSection)创建新进程它将像 hProcess = NtCreateProcessEx(hSection) 一样完成
5.第 7 步:分配进程参数和环境变量。这很重要,因为如果没有进程参数和环境变量,操作系统将不会执行进程并且代码将保持暂停状态。
6.第8步:创建一个线程在进程中执行。可以使用CreateThread()函数并提供要执行的进程的起始地址来完成。
一旦为恶意软件的执行创建线程,就会调用反病毒回调并阻止文件。由于线程是在文件被删除后创建的,因此永远不会调用防病毒回调。防病毒软件打开此文件的任何尝试都将引发 STATUS_FILE_DELETED 错误。
IkerSaint 为进程重影攻击创建了一个概念证明,称为“KingHamlet”,可在此处下载。该工具首先加密文件,然后执行攻击。让我们运行一个快速演示,看看如何处理重影作品。
使用 SharpGhosting 处理重影演示
基于上面解释的方法,自从 Gabriel 发表关于 Elastic Security 的帖子以来,许多 POC 已经浮出水面。在这个演示中,我们将使用 Wra7h 开发的 Process Ghosting 的 C# 实现。在你尝试之前,你必须拥有一个较旧的 Windows 10 版本,因为微软在这种技术浮出水面后修补了防御者检测。如果您正在测试并找到较旧的 Windows 10,那么您知道该怎么做!
你可以在这里阅读 github repo 上的代码。
您可以使用以下命令编译此源代码:
C:Windows微软。NET Framework64v3. 5 csc。exe /out:SharpGhost。exe /unsafe C:ProcessGhostingSharpGhosting-main*.cs
随意更改路径。此外,您需要 .NET framework v3.5 自行编译
为了让事情变得简单并为您省去编译的麻烦,我已经分叉了 repo 并为您创建了一个 EXE,可以在这里下载。下载文件后,我们可以继续进行演示。正如你所看到的,我们有后卫活跃和工作。
现在,我们可以使用以下命令启动我们的 ghost 进程:
.SharpGhost。exe -real <路径> 名称。可执行程序
在这里,我启动了 mimikatz 实例,它被任何可以想象的反病毒解决方案检测为恶意软件。目的是在运行时绕过反病毒检测。
.SharpGhost。exe -real C:ProcessGhostingmimikatz。可执行程序
这个命令会启动 mimikatz 作为一个幽灵进程。您可以打开任务管理器并转到详细信息以查看正在运行的幽灵进程。此进程没有名称,因为相关的 EXE 不存在。
如您所见,防御者在运行时并未将 mimikatz 检测为恶意软件。这是因为当调用 AV 回调并且为执行恶意软件创建线程时立即阻止文件。由于线程是在文件被删除后创建的,因此永远不会调用防病毒回调。
原文始发于微信公众号(阿斯嘉特Sec安全团队):Process Ghosting Attack
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论