Process Herpaderping :通过替换进程的映像文件来躲避杀软检测的技术
2021-03-06 11:20:00 Author: www.4hou.com(查看原文) 阅读量:281 收藏

Process Herpaderping是一种通过在映像映射后修改磁盘上的内容来掩盖进程意图的方法。这会导致杀毒软件和操作系统本身产生奇怪的行为

通常,杀毒软件通过在Windows内核(PsSetCreateProcessNotifyRoutineEx)中注册回调来对进程进行创建。此时,杀毒软件可能会检查用于映射可执行文件的文件,并确定是否应允许执行此过程。这个内核回调在插入初始线程时调用,而不是在创建进程对象时调用。

因此,参与者可以创建和映射进程,修改文件的内容,然后创建初始线程。在创建回调中执行检查的产品将看到修改后的内容。此外,一些产品使用一种on-write扫描方法,它包括对文件写操作的监视。这是一个熟悉的优化方法,它记录已写入文件并推迟实际检查,直到发生IRP_MJ_CLEANUP(例如,关闭文件句柄)为止。因此,使用写入->映射->修改->执行->关闭工作流程的参与者将破坏仅依赖于IRP_MJ_CLEANUP进行检查的on-write扫描。

为了滥用这个约定,我们首先向磁盘上的目标文件写入一个二进制文件。然后,我们映射目标文件的一个映像,并将其提供给操作系统以用于进程创建。这个操作系统很好地为我们映射了原始的二进制代码。使用现有的文件句柄,在创建初始线程之前,我们修改目标文件内容,以模糊或伪造支持映像的文件。一段时间后,我们创建初始线程来开始执行原始二进制文件。最后,我们将关闭目标文件句柄。让我们逐步完成以下步骤:

1.将目标二进制文件写入磁盘,保持句柄打开,该过程将在内存中执行。

2.将文件映射为一个图像段(NtCreateSection, SEC_IMAGE)。

3.使用段句柄(NtCreateProcessEx)创建进程对象。

4.使用相同的目标文件句柄,隐藏磁盘上的文件。

5.创建进程中的初始线程(NtCreateThreadEx),完成这一步时,内核中的进程创建回调将触发。磁盘上的内容与映射的内容不匹配,此时对文件的检查将导致漏洞属性。

6.关闭处理,IRP_MJ_CLEANUP 将在这一步被触发,由于我们已经隐藏了正在执行的内容,此时的检查将导致漏洞。

在这个演示中,你将看到使用CMD.exe作为执行目标。第一次运行使用模式覆盖磁盘上的字节。第二次运行使用ProcessHacker.exe覆盖CMD.exe。Herpaderping工具修复二进制文件,使其看起来尽可能接近ProcessHacker.exe,甚至保留原始签名。请注意同一二进制文件的多次执行,以及与磁盘上的文件相比,用户对该进程的看法。

3.png

通过观察该进程,其中一些可能令人吃惊。让我们试着解释一下这种行为。

背景和动机

在设计保护Windows平台的产品时,这个领域的许多工程师(包括我自己)都对操作系统如何处理数据抱有先入为主的想法。在这种情况下,某些人可能希望磁盘上的文件在创建进程时保持“锁定”状态。此时你虽然不能删除文件,也不能,但是你可以重命名它。在适当的条件下,你可以在此处看到实际上是在其中写入的内容。对你的假设保持警惕,经常质疑它们,并进行实际测试。

当发现如何在编写文件时进行分析时,这项研究的动机就产生了。基于先前的 process Hollowing研究和Doppelganging研究背景,我推测这是可能的。其目标是提供更好的安全性,为此你必须先了解如何破解旧锁,才能创建更好的新锁。

Herpaderping与Hollowing和Doppelganging类似,但是有一些主要区别,区别如下:

Process Hollowing

Process Hollowing是现代恶意软件常用的一种进程创建技术,虽然在使用任务管理器之类的工具查看时,这些进程看起来是合法的,但是该进程的代码实际上已被恶意内容所替代。

Process Hollowing涉及到在执行开始之前修改映射的部分抽象地看起来是这样:map-> Modify section-> execute。这个工作流程导致经过Hollow处理的流程预期执行流程分流为非预期的代码。Doppelganging可能被认为是一种Hollow处理的形式。然而,在我看来,Hollowing更接近于注入,因为Hollowing通常涉及显式地写入已经映射的代码。这与Herpaderping不同,后者没有修改部分。

Process Doppelganging

Process Doppelganging更接近于Herpaderping,Doppelganging滥用事务文件操作,通常包括以下步骤:事务->写入->映射->回滚->执行。在此工作流程中,操作系统将创建映像部分并处理事务,因此缓存的映像部分最终就是你写入事务的内容。操作系统已经修补了这项技术,修补了它造成的崩溃。也许他们认为这是对交易的“合法”使用,值得庆幸的是,Windows Defender确实捕捉到了这种Doppelganging技术。Doppelganging与Herpaderping的不同之处在于,Herpaderping不依赖于事务处理的文件操作,而杀毒软件的开发者却并没有捕获Herpaderping攻击的技术。

可供参考的通用技术有:

4.png

我们可以看到此处列出的差异,虽然Herpaderping比Doppelganging更容易被检测到,但因为恶意的位映射确实会进入到磁盘,所以杀毒软件仍然无法检测到Herpaderping。

在2017欧洲黑帽大会(Black Hat Europe 2017)上,来自网络安全公司enSilo的两名研究人员介绍了一种名为“Process Doppelganging”的新型代码注入技术,一时间引起互联网安全行业的激烈讨论。

Process Doppelganging技术可针对所有Windows版本的平台发起攻击,而且还可以帮助病毒散播者绕过大部分反病毒方案和取证工具。Process Doppelganging与之前曝光的Process Hollowing技术类似,却又比后者更进一步。Process Hollowing是现代恶意软件常用的一种进程创建技术,虽然使用任务管理器之类的工具查看时,这些进程看起来合法,但该进程的代码实际上已被恶意内容替代。Process Doppelganging除了以上方式外,还同时通过攻击Windows NTFS运作机制和一个来自Windows进程载入器中的过时应用,以此来掩盖已修改可执行文件的加载进程。利用“Process Doppelganging”的恶意代码不会保存到磁盘,也就是所谓的“无文件攻击”,因此大多数主流安全产品无法检测到,甚至高级取证工具(例如Volatility)也检测不到它,堪称是目前为止已发现的“最狡猾”的一种攻击方式。

缓解措施

负责任地说到目前为止还没有一个明确的解决办法,在对文件具有写访问权时,防止映像部分被映射火缓存似乎应该是合情合理的。但是,这可能是实际的解决方案,也可能不是。

如果尚未将文件的更改映射到进程中,则另一个选择可能是将对文件的更改刷新到高速缓存的图像部分。但是,由于映射到新进程的过程发生在NtCreateProcess上,因此这可能不是可行的解决方案。

从检测的角度来看,没有一种很好的方法来标识已映射的实际位,在IRP_MJ_CLEANUP处进行检查或在PsSetCreateProcessNotifyRoutineEx中注册的回调会导致错误的归因,因为磁盘上的位已更改,因此必须从创建的部分开始。需要指出的是,Windows 10中有一个新的回调,你可以注册PsSetCreateProcessNotifyRoutineEx2,但这与上一个回调存在同样的问题,它是在执行初始线程而不是在创建流程对象时调用的。 Microsoft确实添加了PsSetCreateThreadNotifyRoutineEx,如果在PsCreateThreadNotifyNonSystem中注册了初始线程,则在插入初始线程时会调用该PsSetCreateThreadNotifyRoutineEx,这与将要开始执行的时间相反(就像旧的回调一样)。在创建过程对象时将PSCREATEPROCESSNOTIFYTYPE扩展为调用也无济于事,如上所述,映像部分对象被缓存在NtCreateSection调用而不是NtCreateProcess上。

我们无法轻易确定执行了什么,只有在尝试检测攻击者的攻击行为之后才能确定。

已知受影响的平台

以下是截止到2020年8月31日已经测试过的产品和Windows操作系统列表,测试是用已知的恶意二进制文件进行的。

5.png

此漏洞已于2020年7月17日披露给Microsoft安全响应中心(MSRC),并且MSRC于2020年7月22日启动了一个案例。 MSRC在2020年8月25日结束了调查,并确定调查结果有效,但不符合立即修复的标准。目前,该漏洞还没有解决方案,并且已标记为将来审查。

不过我们不同意MSRC的看法,认为此漏洞非常具有攻击性,说明已于2020年8月27日传达给了MSRC。原因如下:

1.出现过类似的漏洞攻击(“Hollowing”和“ Doppelganging”)。2019年,FireEye的研究人员就发现有攻击者将PowerShell、VB脚本和.NET应用整合进了一个代码包中。

2.该漏洞显示出可以破坏操作系统(Windows Defender)固有的安全功能。

3.该漏洞使攻击者可以执行任意代码。

4. 用户不会被通知执行了非预期的代码。

5.提供给用户的进程信息不能准确反映正在执行的操作。

6.准确识别进程的工具不是直观的,也不是不正确的,即使是从内核来看也是如此。

以下的repo包含一个用于执行进程混淆的Herpaderping方法的工具。用法如下:

Process Herpaderping Tool - Copyright (c) Johnny Shaw
ProcessHerpaderping.exe SourceFile TargetFile [ReplacedWith] [Options...]
Usage:
  SourceFile               Source file to execute.
  TargetFile               Target file to execute the source from.
  ReplacedWith             File to replace the target with. Optional,
                           default overwrites the binary with a pattern.
  -h,--help                Prints tool usage.
  -d,--do-not-wait         Does not wait for spawned process to exit,
                           default waits.
  -l,--logging-mask number Specifies the logging mask, defaults to full
                           logging.
                               0x1   Successes
                               0x2   Informational
                               0x4   Warnings
                               0x8   Errors
                               0x10  Contextual
  -q,--quiet               Runs quietly, overrides logging mask, no title.
  -r,--random-obfuscation  Uses random bytes rather than a pattern for
                           file obfuscation.
  -e,--exclusive           Target file is created with exclusive access and
                           the handle is held open as long as possible.
                           Without this option the handle has full share
                           access and is closed as soon as possible.
  -u,--do-not-flush-file   Does not flush file after overwrite.
  -c,--close-file-early    Closes file before thread creation (before the
                           process notify callback fires in the kernel).
                           Not valid with "--exclusive" option.
  -k,--kill                Terminates the spawned process regardless of
                           success or failure, this is useful in some
                           automation environments. Forces "--do-not-wait
                           option.

repo使用子模块,复制后请确保初始化并更新子模块。项目文件针对Visual Studio 2019。

git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init --recursive
MSBuild .\herpaderping.sln

以下内容无需修改即可使用:

1.Windows实现库(WIL):一个仅用于标题的c++库,通过可读的用于常见Windows编码模式的类型安全的c++接口来简化Windows上的开发人员的工作。

2. Process Hacker本机API头文件:它是本机API头文件的集合,从微软标头文件和符号文件以及许多逆向工程和猜测中收集。

本文翻译自:https://jxy-s.github.io/herpaderping/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/qDzy
如有侵权请联系:admin#unsafe.sh