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的系统调用没有被修改。

9c55146a87082326

地址空间布局的随机化

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

c3409287b3082355

有了这些信息,我们可以使用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中的标准调用,因为这些可能仍然被钩住。

41b4325a56082449

58a378fff3082500

4a0b792484082516

 

工具地址

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。

标签:工具分享, 免杀工具, EDR产品