一个新的免杀payload工具包
2023-5-19 08:31:23
Author: 菜鸟学信安(查看原文)
阅读量:42
收藏
Freeze.rs是一个有效负载工具包,用于使用挂起的进程绕过EDR,直接使用RUST编写的系统调用,用于绕过EDR安全控制,以秘密的方式执行shellcode。Freeze.rs 利用多种技术不仅删除Userland EDR挂钩,而且还以绕过其他端点监控控制的方式执行shellcode。创建挂起的进程
创建进程时,Ntdll.dll是加载的第一个DLL;这发生在加载任何EDR DLL之前。这意味着在加载EDR并开始挂钩和修改系统DLL的程序集之前会有一点延迟。在查看Ntdll.dll中的Windows系统调用时,我们可以看到还没有任何东西被挂钩。如果我们创建一个处于挂起状态的进程(一个在时间上被冻结的进程),我们可以看到除了Ntdll.dll之外没有加载其他DLL。您还可以看到没有加载EDR DLL,这意味着位于Ntdll.dll中的系统调用未被修改。地址空间布局随机化
要使用这个干净的挂起进程从www.example.com加载器中删除钩子Freeze.rs,我们需要一种方法来以编程方式查找和读取干净的挂起进程的内存。这就是地址空间布局随机化(ASLR)发挥作用的地方。ASLR是一种防止堆栈内存损坏漏洞的安全机制。ASLR将进程内部的地址空间随机化,以确保所有内存映射对象、堆栈、堆和可执行程序本身都是唯一的。现在,这就是它变得有趣的地方,因为虽然ASLR工作,但它不适用于位置无关的代码,如DLL。DLL(特别是已知的系统DLL)的情况是,地址空间在靴子时随机化一次。这意味着我们不需要枚举远程进程信息来查找其ntdll.dll的基址,因为它在所有进程中都是相同的,包括我们控制的进程。由于每个DLL的地址在每次靴子时都是相同的,因此我们可以从自己的进程中提取此信息,而不必枚举挂起的进程来查找地址。有了这些信息,我们可以使用API ReadProcessMemory来读取进程的内存。该API调用通常与作为任何基于凭证的攻击的一部分的LSASS的阅读相关联;然而,它本身本质上不是恶意,特别是如果我们只是阅读内存的任意部分。ReadProcessMemory被标记为可疑内容的唯一情况是,您正在阅读不应该读取的内容(例如LSASS的内容)。EDR产品不应标记调用ReadProcessMemory的事实,因为此函数有合法的操作用途,并会导致许多误报。我们可以更进一步,只阅读Ntdll.dll中存储所有系统调用的部分-它的.text部分,而不是读取整个DLL。结合这些元素,我们可以通过编程方式获得Ntdll.dll的.text部分的副本,以在执行shellcode之前覆盖现有的hooked .text部分。ETW利用内置的系统调用来生成该遥测。由于ETW也是Windows中内置的本机功能,因此安全产品不需要“挂钩”ETW系统调用来访问信息。因此,为了防止ETW,Freeze.rs修补了许多ETW syscall,清空寄存器并将执行流返回到下一条指令。修补ETW现在是所有加载器的默认设置。由于只恢复Ntdll.dll,因此执行shellcode的所有后续调用都需要驻留在Ntdll.dll中。使用Rust的NTAPI Crate(注意,你可以在其他语言中做到这一点,但在Rust中,它很容易实现),我们可以定义和调用分配,写入和保护shellcode所需的NT系统调用,有效地跳过位于Kernel32.dll和Kernelbase.dll中的标准调用,因为这些仍然可能被钩住。使用Rust的NTAPI crate,您可以看到所有这些调用都不会显示在ntdll.dll下,但是它们仍然存在于进程中。项目地址
https://github.com/optiv/Freeze.rs
文章来源: http://mp.weixin.qq.com/s?__biz=MzU2NzY5MzI5Ng==&mid=2247496758&idx=1&sn=2dbd70ce103f6bbab7826de2c41a0653&chksm=fc9beea9cbec67bf7243072362dc7cae195c2928318c2e0491085eb54de5c9535684da5a9db0#rd
如有侵权请联系:admin#unsafe.sh