探索网络安全新技术
攀登黑客技术最高峰

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode

工具简介

Freeze.rs 是一种有效负载创建工具,用于绕过 EDR 安全控制以隐秘方式执行 shellcode。Freeze.rs 利用多种技术,不仅可以删除 Userland EDR 挂钩,还可以以绕过其他端点监控控制的方式执行 shellcode。

创建暂停进程

创建进程时,Ntdll.dll 是第一个加载的 DLL;这发生在加载任何 EDR DLL 之前。这意味着在加载 EDR 并开始挂钩和修改系统 DLL 的程序集之前会有一些延迟。查看 Ntdll.dll 中的 Windows 系统调用,我们可以看到还没有任何东西被挂钩。如果我们创建一个处于挂起状态(及时冻结的进程)的进程,我们可以看到除了 Ntdll.dll 之外没有其他 DLL 被加载。您还可以看到没有加载任何 EDR DLL,这意味着位于 Ntdll.dll 中的系统调用未被修改。

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode-威武网安

地址空间布局随机化

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

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode-威武网安

有了这些信息,我们就可以使用 API ReadProcessMemory 来读取进程的内存。此 API 调用通常与读取 LSASS 相关联,作为任何基于凭证的攻击的一部分;然而,就其本身而言,它本身并不是恶意的,尤其是当我们只是读取内存的任意部分时。ReadProcessMemory 唯一会被标记为可疑内容的一部分的情况是,如果您正在阅读不应该阅读的内容(例如 LSASS 的内容)。EDR 产品不应该标记 ReadProcessMemory 被调用的事实,因为此功能有合法的操作用途,并且会导致许多误报。

我们可以更进一步,只读取存储所有系统调用的 Ntdll.dll 的一部分 – 它的 .text 部分,而不是读取整个 DLL。

结合这些元素,我们可以通过编程方式获取 Ntdll.dll 的 .text 部分的副本,以在执行 shellcode 之前覆盖我们现有的钩子 .text 部分。

ETW补丁

ETW 利用内置系统调用生成此遥测数据。由于 ETW 也是 Windows 内置的本机功能,因此安全产品不需要“挂钩”ETW 系统调用来访问信息。因此,为了防止 ETW,Freeze.rs 修补了许多 ETW 系统调用,刷新寄存器并将执行流程返回到下一条指令。修补 ETW 现在是所有加载程序的默认设置。

Shellcode

由于只恢复了 Ntdll.dll,所有后续执行 shellcode 的调用都需要驻留在 Ntdll.dll 中。使用 Rust 的 NTAPI Crate(注意你可以在其他语言中做到这一点,但在 Rust 中,它很容易实现)我们可以定义和调用分配、编写和保护 shellcode 所需的 NT 系统调用,有效地跳过位于在 Kernel32.dll 和 Kernelbase.dll 中,因为它们可能仍被挂钩。

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode-威武网安

使用 Rust 的 NTAPI crate,您可以看到所有这些调用都没有出现在 ntdll.dll 下,但是它们仍然存在于进程中。

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode-威武网安

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode-威武网安

Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode-威武网安

安装工具

如果Rust没有Rustup安装请安装它们。如果您从 OSX 或 Linux 编译它,请确保您添加了目标“x86_64-pc-windows-gnu”。为此,请运行以下命令:

rustup target add x86_64-pc-windows-gnu

完成后,您可以编译 Freeze.rs,运行以下命令,或使用编译后的二进制文件:

cargo build –release

从那里编译的版本将在 target/release 中找到(注意如果你不把–release文件放在 target/debug/ 中)

帮助选项

    ___________                                                      
    \_   _____/______   ____   ____ ________ ____     _______  ______
     |    __) \_  __ \_/ __ \_/ __ \\___   // __ \    \_  __ \/  ___/
     |     \   |  | \/\  ___/\  ___/ /    /\  ___/     |  | \/\___ \ 
     \___  /   |__|    \___  >\___  >_____ \\___  > /\ |__|  /____  >
         \/                \/     \/      \/    \/  \/            \/    
                                        (@Tyl0us)
    Soon they will learn that revenge is a dish... best served COLD & Rusty...
    
     

USAGE:
    Freeze-rs [FLAGS] [OPTIONS]

FLAGS:
    -c, --console    Only for Binary Payloads - Generates verbose console information when the payload is executed. This
                     will disable the hidden window feature
    -h, --help       Prints help information
    -n, --noetw      Disables the ETW patching that prevents ETW events from being generated.
    -s, --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?
    -V, --version    Prints version information

OPTIONS:
    -E, --Encrypt     Encrypts the shellcode using either AES 256, ELZMA or RC4 encryption
    -I, --Input       Path to the raw 64-bit shellcode.
    -O, --Output       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.
    -p, --process     The name of process to spawn. This process has to exist in C:\Windows\System32\. Example
                               'notepad.exe'  
    -e, --export       Defines a custom export function name for any DLL.

二进制与 DLL

Freeze.rs 可以生成一个.exe或.dll文件。要指定这一点,请确保-O命令行选项以.exe二进制文件或.dlldll 结尾。当前不支持其他文件类型。对于 DLL 文件,Freeze.rs 还可以添加额外的导出功能。为此,请使用-export特定的导出函数名称。

加密

加密 shellcode 是一项重要技术,用于保护它不被 EDR 和其他安全产品检测和分析。Freeze.rs 带有多种加密 shellcode 的方法,包括 AES、ELZMA 和 RC4。

AES

AES(高级加密标准)是一种广泛用于加密数据的对称加密算法。Freeze.rs 使用 AES-256 位大小来加密 shellcode。使用 AES 加密 shellcode 的优点是它提供了强大的加密功能,并得到密码库的广泛支持。然而,使用固定块大小可能使其容易受到某些攻击,例如填充预言机攻击。

ELZMA

ELZMA 是一种压缩和加密算法,通常用于恶意软件中以混淆代码。要使用 ELZMA 加密 shellcode,首先使用 ELZMA 算法压缩 shellcode。然后使用随机密钥对压缩数据进行加密。然后将加密数据和密钥嵌入漏洞利用代码中。使用 ELZMA 加密 shellcode 的优点是它在单一算法中同时提供压缩和加密。这有助于减小漏洞利用代码的大小并使其更难检测。

RC4

RC4 是一种对称加密算法,通常在恶意软件中用于加密 shellcode。它是一种可以使用可变长度密钥的流密码,以其简单性和速度而著称。

工具下载

Freeze.rs

赞(0) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Freeze.rs:使用Rust编写的EDR绕过免杀工具 可隐藏执行Shellcode》
文章链接:https://www.wevul.com/980.html
本站所有内容均来自互联网,只限个人技术研究,禁止商业用途,请下载后24小时内删除。

评论 3

  1. #2

    老哥 有意向合作吗?

    555嘿嘿9个月前 (05-21)回复
  2. #1

    大佬 有视频教程吗? :dinosaur-ok:

    57136919个月前 (05-20)回复
    • 直接 -h ?

      DSEC9个月前 (05-21)回复

如果文章对你有帮助 可以打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册