Process Ghosting 一种新的绕过杀软检查方式

  • A+
所属分类:安全文章

前言

Elastic Security安全团队最近公布了一种反防病毒软件的行为查杀的新技术Process Ghosting,即在Windows上通过篡改内存中的可执行文件映射达到绕过杀软的行为查杀。该技术是已知攻击方法(例如Process Doppelgänging和Process Herpaderping)的演变。

简介

本文将要介绍以下内容:

  • Process Ghosting原理
  • 代码实例
  • 利用思路
  • 参考文章和项目

Process Ghosting原理

一个进程的创建

想要了解Process Ghosting的原理首先需要知道在windows中一个进程是如何被创建的。Windows 任务管理器可以显示系统中运行的进程列表。在操作系统中每一个进程都与磁盘上的一个可执行文件相关联,例如 进程svchost.exe与磁盘文件c:WindowsSystem32svchost.exe所对应。 这是因为 Windows 从可执行文件启动进程,可执行文件通常以 EXE 文件扩展名结尾。需要注意的是,进程不是可执行文件。如下图所示任务管理器中,有多个从 svchost.exe 启动的进程。

Process Ghosting 一种新的绕过杀软检查方式

Windows启动一个新的进程就必须执行下面这一系列步骤。在现代版本的 Windows 中进程通常由 NtCreateUserProcess 函数创建。但是,windows为了考虑向前兼容,其他Windows  API(NtCreateProcessEx 等)也可以去创建一个进程。创建进程的步骤如下:

1.打开要启动的可执行文件的句柄。

hFile = CreateFile("C:WindowsSystem32svchost.exe"

2.为文件创建一个image section。节将文件或文件的一部分映射到内存中。SEC_IMAGE是一种特殊类型的节,对应于可移植可执行 (PE) 文件,并且只能从 PE(EXE、DLL 等)文件中创建。示例:

hSection = NtCreateSection(hFile, SEC_IMAGE)

3.调用NtCreateProcessEx 函数创建一个进程。示例:

hProcess = NtCreateProcessEx(hSection)

4.分配环境变量。示例:

CreateEnvironmentBlock/NtWriteVirtualMemory

5.创建一个线程在进程中执行。示例:

NtCreateThreadEx

Process Ghosting 一种新的绕过杀软检查方式

进程从可执行文件启动,但可执行文件中的某些数据在映射到进程时可能会被修改。Windows 内存管理器在创建时缓存 image sections。这意味着image sections可以做修改,可以和原文件不保持一致

杀软扫描过程

Microsoft 为杀软开发厂商提供注册进程创建的回调的功能,这些回调将在系统上创建进程和线程时调用。驱动开发者可以调用PsSetCreateProcessNotifyRoutineEx、PsSetCreateThreadNotifyRoutineEx等API来接收此类事件。

尽管名称如此,PsSetCreateProcessNotifyRoutineEx 回调实际上并不是在创建进程时调用,而是在创建这些进程中的第一个线程时调用。这会在创建进程和通知杀软创建进程之间产生差距。它还为恶意软件作者提供了一个窗口,可以在安全产品扫描它们之前篡改image文件和section。

请注意未记录的进程创建 API NtCreateProcess如何处理一个section,而不是文件:

NTSYSCALLAPI
NTSTATUS
NTAPI
NtCreateProcess(
    _Out_ PHANDLE ProcessHandle,
    _In_ ACCESS_MASK DesiredAccess,
    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
    _In_ HANDLE ParentProcess,
    _In_ BOOLEAN InheritObjectTable,
    _In_opt_ HANDLE SectionHandle,
    _In_opt_ HANDLE DebugPort,
    _In_opt_ HANDLE ExceptionPort
    )
;

启动进程时,安全产品会提供有关正在启动进程的以下信息:

typedef struct _PS_CREATE_NOTIFY_INFO {
  SIZE_T              Size;
  union {
    ULONG Flags;
    struct {
      ULONG FileOpenNameAvailable : 1;
      ULONG IsSubsystemProcess : 1;
      ULONG Reserved : 30;
    };
  };
  HANDLE              ParentProcessId;
  CLIENT_ID           CreatingThreadId;
  struct _FILE_OBJECT *FileObject;
  PCUNICODE_STRING    ImageFileName;
  PCUNICODE_STRING    CommandLine;
  NTSTATUS            CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

有趣的是 FILE_OBJECT,它是与上一节中传递给 NtCreateSection 的 HANDLE 对应的内核对象。此 FILE_OBJECT 通常对应于磁盘上的文件,可以扫描该文件以查找恶意软件。

安全产品还可以使用文件系统微过滤回调,在文件创建、交互或关闭时接收通知。扫描每个读取和写入操作对系统的影响可能很大,因此出于性能原因,文件通常在打开和关闭时进行扫描。

还有其他潜在的安全产品拦截点请参阅BlackHat2017演讲。

Process Ghosting

Process Ghosting主要基于Process DoppelgängingProcess Herpaderping ,允许运行有效负载并且使杀软无法检测。

Process DoppelgängingProcess Herpaderping 的详细介绍见下方:

  • 代码注入技术Process Doppelgänging利用介绍
  • Process Herpaderping :通过替换进程的映像文件来躲避杀软检测的技术

我们可以在 Doppelgänging 和 Herpaderping 的基础上运行已被删除的可执行文件。在 Windows 上有多种删除文件的方法:

  • 在设置了FILE_SUPERSEDE或CREATE_ALWAYS标志的旧文件上创建一个新文件。
  • 创建或打开文件时设置FILE_DELETE_ON_CLOSE或FILE_FLAG_DELETE_ON_CLOSE标志。
  • 通过NtSetInformationFile调用FileDispositionInformation文件信息类时,将FILE_DISPOSITION_INFORMATION结构中的 DeleteFile 字段设置为 TRUE 。

Windows 尝试阻止修改映射的可执行文件。一旦文件被映射到图像部分,尝试使用 FILE_WRITE_DATA 打开它(以修改它)将失败并显示 ERROR_SHARING_VIOLATION。通过 FILE_DELETE_ON_CLOSE/FILE_FLAG_DELETE_ON_CLOSE 尝试删除失败并显示 ERROR_SHARING_VIOLATIONNtSetInformationFile(FileDispositionInformation) 需要 DELETE 访问权限。即使将 DELETE 访问权限授予映射到图像部分的文件,NtSetInformationFile(FileDispositionInformation) 也会因 STATUS_CANNOT_DELETE 而失败。通过 FILE_SUPERCEDE/CREATE_ALWAYS 尝试删除失败并显示 ACCESS_DENIED

然而,一个重要的注意事项是,此删除限制仅在可执行文件映射到映像部分后才生效。这意味着可以创建一个文件,将其标记为删除,将其映射到image部分,关闭文件句柄以完成删除,然后从现在无文件部分创建一个进程。这就是Process Ghosting。详细攻击流程如下所示:

Process Ghosting 一种新的绕过杀软检查方式

  1. 创建文件
  2. 使用NtSetInformationFile(FileDispositionInformation)将文件置于删除挂起状态。注意:尝试使用 FILE_DELETE_ON_CLOSE 不会删除文件。
  3. 将有效负载可执行文件写入文件。内容未保留,因为文件已处于删除待处理状态。删除挂起状态还会阻止外部文件打开尝试。
  4. 为文件创建一个image section。
  5. 关闭删除挂起句柄,删除文件。
  6. 使用image section创建一个进程。
  7. 分配流程参数和环境变量。
  8. 创建一个线程在进程中执行。

代码实例

Process Ghosting 一种新的绕过杀软检查方式

https://github.com/hasherezade/process_ghosting

编译工具:VS2019

64位程序适用64位系统

32位程序适用32位系统

Process Ghosting 一种新的绕过杀软检查方式

利用思路

在实际利用中,为了绕过静态查杀,需要对POC做进一步修改,利用思路如下:

首先对执行文件做加密,然后PoC在buffer_payload函数位置文件读入内存做解密,然后返回解密后的内存文件地址,最后执行。

补丁

Elastic 安全研究人员向Microsoft 安全响应中心(MSRC)报告了该问题,并提供了PoC的源代码。不过,微软认为问题并不严重,补丁的发布也不是必须的。

参考文章和项目

https://www.elastic.co/cn/blog/process-ghosting-a-new-executable-image-tampering-attack

https://github.com/hasherezade/process_ghosting

https://www.andreafortuna.org/2021/06/18/how-process-ghosting-works/


号外

宽字节安全 JAVA安全线上进阶课程:开讲啦!!!

宽字节安全首次推出 JAVA安全进阶课程,系统性讲解JAVA反序列化漏洞,代码执行漏洞等开发中可能出现的安全问题。

培训采用 线上授课 + 视频录播 的授课方式,交流群随问随答。首期班加入即送 宽字节安全知识星球  名额,涉及 java安全,红蓝对抗,漏洞研究等安全领域。

每周只安排两天课,共 6 周 36 课时,由浅入深,感受 java 安全魅力。

  • 周三 19:30 - 21:30
  • 周日 14:00 -18:00

现在报名即可享受立减1000元!!!名额有限欢迎咨询。

点击查看详情


扫码添加客服微信,期待您的加入


Process Ghosting 一种新的绕过杀软检查方式



本文始发于微信公众号(宽字节安全):Process Ghosting 一种新的绕过杀软检查方式

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: