Payload工具包,用于利用暂停进程、直接系统调用和其他执行方法绕过EDR——Freeze
作者:Sec-Labs | 发布时间:
工具介绍
Freeze是一个Payload创建工具,用于规避EDR安全控制,以隐蔽的方式执行shellcode。Freeze利用多种技术,不仅删除了Userland EDR钩子,而且还以这样一种方式执行shellcode,以规避其他终端监控控制。
创建一个暂停的进程
当一个进程被创建时,Ntdll.dll是第一个被加载的DLL。这发生在任何EDR DLLs被加载之前。这意味着在EDR被加载并开始钩住和修改系统DLLs的装配之前有一些延迟。在查看Ntdll.dll中的Windows系统调用时,我们可以看到还没有任何东西被钩住。如果我们创建一个处于暂停状态的进程(一个在时间上被冻结的进程),我们可以看到除了Ntdll.dll之外,没有其他DLL被加载。你也可以看到没有EDR DLLs被加载,这意味着位于Ntdll.dll的系统调用没有被修改。

地址空间布局的随机化
为了使用这个干净的暂停进程来移除Freeze loader的钩子,我们需要一种方法来以编程方式找到并读取干净暂停进程的内存。这就是地址空间布局随机化(ASLR)开始发挥作用的地方。ASLR是一种安全机制,用于防止基于堆栈内存损坏的漏洞。ASLR随机化进程内部的地址空间,以确保所有内存映射的对象、堆栈、堆和可执行程序本身都是唯一的。现在,这就是有趣的地方,因为虽然ASLR有效,但它对位置无关的代码,如DLLs不起作用。DLLs(特别是已知的系统DLLs)的情况是,地址空间在启动时被随机化一次。这意味着我们不需要列举一个远程进程的信息来寻找其ntdll.dll的基址,因为它在所有进程中都是一样的,包括我们控制的进程。由于每个DLL的地址在每次启动时都是相同的地方,我们可以从自己的进程中提取这个信息,而永远不需要枚举暂停的进程来找到这个地址。

有了这些信息,我们可以使用API ReadProcessMemory来读取一个进程的内存。这个API调用通常与读取LSASS有关,作为任何基于凭证的攻击的一部分;然而,它本身并不是恶意的,特别是如果我们只是读取任意一段内存。唯一一次ReadProcessMemory会被标记为可疑情况的一部分,就是你正在读取你不应该读取的东西(比如LSASS的内容)。EDR产品不应该标记调用ReadProcessMemory的事实,因为这个功能有合法的操作用途,会导致许多误报。
我们可以更进一步,只读取Ntdll.dll中存储所有系统调用的部分--其.text部分,而不是读取整个DLL。
结合这些元素,我们可以以编程方式获得Ntdll.dll的.text部分的副本,在执行shellcode之前覆盖我们现有的挂钩.text部分。
ETW的补丁
ETW利用内置的系统调用来产生这种遥测。由于ETW也是一个内置于Windows的本地功能,安全产品不需要 "钩住 "ETW的系统调用来访问这些信息。因此,为了防止ETW,Freeze修补了大量的ETW系统调用,冲掉了寄存器并将执行流返回到下一条指令。现在,在所有的加载器中,修补ETW是默认的。
Shellcode
由于只有Ntdll.dll被恢复,所有后续执行shellcode的调用都需要驻留在Ntdll.dll中。使用Go(注意你可以在其他语言中这样做,但在Go中,它很容易实现),我们可以定义并调用分配、写入和保护shellcode所需的NT系统调用,有效地跳过位于kernel32d.dll和Kernelbase.dll中的标准调用,因为这些可能仍然被钩住。



工具地址
https://github.com/optiv/Freeze
安装
要安装Freeze,请运行以下命令,或使用编译好的二进制文件。
go build Freeze.go
帮助
___________
\_ _____/______ ____ ____ ________ ____
| __) \_ __ \_/ __ \_/ __ \\___ // __ \
| \ | | \/\ ___/\ ___/ / /\ ___/
\___ / |__| \___ >\___ >_____ \\___ >
\/ \/ \/ \/ \/
(@Tyl0us)
Soon they will learn that revenge is a dish... best served COLD...
Usage of ./Freeze:
-I string
Path to the raw 64-bit shellcode.
-O string
Name of output file (e.g. loader.exe or loader.dll). Depending on what file extension defined will determine if Freeze makes a dll or exe.
-console
Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
-encrypt
Encrypts the shellcode using AES 256 encryption
-export string
For DLL Loaders Only - Specify a specific Export function for a loader to have.
-process string
The name of process to spawn. This process has to exist in C:\Windows\System32\. Example 'notepad.exe' (default "notepad.exe")
-sandbox
Enables sandbox evasion by checking:
Is Endpoint joined to a domain?
Does the Endpoint have more than 2 CPUs?
Does the Endpoint have more than 4 gigs of RAM?
-sha256
Provides the SHA256 value of the loaders (This is useful for tracking)
二进制文件与DLL文件
Freeze可以生成一个.exe或.dll文件。为了指定这一点,请确保-O命令行选项以二进制文件的.exe或动态链接库的.dll结尾。目前不支持其他文件类型。在DLL文件的情况下,Freeze还可以增加额外的导出功能。要做到这一点,请使用带有特定导出功能名称的-export。