概述
在这篇文章中,我将跟大家介绍我在红队安全评估中所使用的一种通用技术,通俗一点来说就是一种“分而治之”的思想吧!这种技术可以用来绕过基于行为的NextGen AV检测,而它的工作原理主要是将恶意操作和API调用拆分为不同的进程从而实现我们的目标。
技术介绍
早在2019年,我当时还是红队的一名成员,我的日常工作就是绕过特定的NextGen AV。当时我们所采用的核心思想就是“分而治之”。不过当时我并不想公开这种技术,而且我也没有想要去在互联网上介绍这种思想。时间一天天过去,我差不多都把这件事给忘了。直到几天前,我看到了Adam(@Hexacorn)发布的一篇帖子,主要内容如下:
绕过检测核心概念
OperationSpraying-生成一个级联的进程,其中新实例执行的单个原子操作可能不足以触发检测并中断操作/进程属性。比如说:
1 - 生成一个记事本进程(Notepad);
2 - 打开进程句柄(传递到子进程);
3 - 在记事本内存中分配缓冲区,将句柄和地址传递给子进程;
4 - 将其标记为RWX,并将句柄和地址传递给子进程;
5-N - 每个实例注入几个字节的Payload;
N+1 - 触发Payload;
他完美地描述了我的这项技术,根据他在Twitter上的回复,其他人也在默默地做着同样的事情(比如我)结果还发现,Kyriakos Ispoglou(ispo)和Mathias Payer开发出了malWASH,它以更具扩展灵活性的方式实现了同样的功能。它是在五年前发布的,所以我想,不管你在信息安全领域做过什么,很可能有人以前也做过:)
说到这里,我想是时候公布我所做的一些细节了。
背景知识
NextGen AV会试图检测那些想要执行恶意操作的进程,因此它们需要实时监视这些进程的活动。很多时候,我们会发现metermeter shell竟然是可以“生存”下去的,但如果你做了一些不好的事情,那就说不定了,比如说导出哈希或lsass访问之类的,这个时候你的进程将会被终止运行。这种安全监控主要通过两种方式实现:
-
在内核级别的监控,但是Windows在这方面并不友好。对于文件和注册表操作或进程加载,只能执行一组有限的回调。你无法通过一般形式监控API调用,如果你是反病毒产品的供应商,那这就变成一个大问题了。
-
由于这些限制,每个反病毒产品都会将钩子放在用户模式下,通常会放在ntdll中,但也有很多其他地方,比如说放在被恶意软件滥用的API中。反病毒产品的DLL是从内核模式强制进入我们的进程的,所以我们无法真正绕过它。
总的来说,检测将依赖于监视我们所做的API调用,如果它们符合某个模式,我们将被检测到并被终止运行。比如说,最典型的流程注入之一是调用以下API调用:
-
OpenProcess
-
VirtualAlloc
-
WriteProcessMemory
-
CreateRemoteThread
如果我们真的这样做的话,那我们可就没戏了!
一个典型的绕过方法是取消用户模式钩子,或者直接从代码中执行系统调用,以此来完全避免触及到ntdll。我们所分析的反病毒产品能够检测到这种取消钩子以及直接进行系统调用的行为,因此我们还是需要想办法!
解决方案核心思想-“分而治之”
既然反病毒产品的检测依赖的是检测进程中的API调用,那我们为什么不可以在多个进程之间分割API调用呢?我们可以通过两个(或更多)步骤将代码注入远程进程,然后让我们的“恶意软件”根据初始获取到的输入来做不同的事情。根据前文所介绍的进程注入步骤,我们可以做到下列事情:
首先,在第一次执行的时候我们将调用下列API:
-
OpenProcess
-
VirtualAlloc
-
WriteProcessMemory
接下来,在第二次执行的时候,我们再调用下列API:
-
OpenProcess(尽管使用了句柄继承,但我认为这个调用是可以被删掉的)
-
CreateRemoteThread
没错,就是这样!反病毒产品此时将看到两个不同的进程都只做部分注入。因此,如果有一个操作涉及多个API调用,然后我们又可以拆分它们的话,我们就赢了。某些特定的AV在检测进程注入方面可能会非常厉害,因此我采用了三种不同的注入技术来实现这种方法,并且在每个场景中都成功绕过了AV。
但是,我发现将API调用拆分为两个就足够绕过AV了,但是正如Adam(@Hexacorn)所描述的,我们在某些场景下可能需要疯狂拆分API调用才能实现绕过。
下面给出的是一个技术验证PoC,可以使用具有上述方法的部分执行进程注入:【点击底部阅读原文获取】。此时,进程将调用自身并将步数和注入的内存地址传递给子进程。
精彩推荐
本文始发于微信公众号(FreeBuf):分而治之:一种绕过NextGen AV的技术
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论