Ivy
项目地址:https://github.com/optiv/Ivy一、更多信息
如果想了解有关此框架中使用的技术以及防御它的措施,请查看 此篇文章。
二、描述
lvy 是一个 payload 生成框架,用于在内存中直接执行任意 VBA 宏代码,lvy 的 loader 通过滥用 VBA object 环境来加载、解密和执行 shellcode。这种技术尽可能接近真正的无文件,因为如今大多数 无文件攻击 都需要将某种文件放在磁盘上,从而绕过标准的基于签名的规则来检测 VBA 代码。 典型的 VBA payload 具有以下特征:
[*]存在于启用宏的 Office 文档中;
[*]这些宏文件存在于磁盘上;
通过在内存中运行,这些行为特征使其更难被 EDR 检测到。
Ivy 的 loader 使用 RC4 进行加密 (AES 加密会导致膨胀,解密需要花费很长时间),然后分解成单独的字符串,防止任何 sandbox 将这些字符串识别为应调查的加密字符串,这也可以防止任何解码机制将这些 payload 识别为垃圾字符以外的任何内容。
Ivy 的 loader 首先会执行注册表查询以启用 "Trust access to the VBA project object mode"。此注册表项值存储在用户模式下,允许用户修改此值而无需任何提升的权限。注册表值从零设置为 1。如果注册表项不存在,Ivy 将使用值 "1" 创建它。启用此值后,允许从不同进程以编程方式访问 VBA object 环境。
完成此操作后,loader 将生成一个隐藏的 Excel 进程并将加密的字符串加载到 VBA 函数中。这是通过使用 ActiveX 来模拟执行相同任务的 GUI 操作来完成的。这有助于绕过许多传统的控制来监控执行。结果,解密函数和 shellcode 从一个内存缓冲区移动到另一个,从不落地。最后,loader 使用 -GUI 命令调用并执行运行函数,该函数模拟在 VBA 的 GUI 面板中单击运行宏按钮的行为,开始解密函数,然后执行 shellcode。
重要:目标端点必须安装并激活 Microsoft Office 才能运行,因为 Ivy 依赖 Microsoft Office 的 VBA 编程环境。
三、EDR Unhook 模式
这允许 Ivy 通过间接引用直接内存地址和寄存器值,使用低级系统调用构建自己版本的 Windows 函数 WriteProcessMemory,Ivy 可以覆盖内存的不可写部分,而无需调用任何更改内存的 API 函数,这样做是因为 WriteProcessMemory 的一个特性,它临时将内存区域的权限更改为可写 (如果您有足够的权限,我们会这样做,因为我们拥有该进程),它写入值并恢复原始权限而不调用 VirtualProtect 函数,而是自动调用关联的系统调用 (NtProtectVirtualMemory)。
Ivy 没有使用自己的 NtWriteVirtualMemory 版本,因为不会发生这种临时更改内存权限的过程,这意味着对特定内存地址的保护不会被修改,执行会失败。这是微软为使调试器更加稳定而发布的一项 "功能"。由于调试器想要动态修改内存,他们可以简单地修改一个部分,而不必执行多个任务 (有关信息请参阅 devblogs.microsoft.com)。
让我们看看 EDR 的一系列事件:
[*]Ivy 创建 WriteProcessMemory 函数,手动设置正确的注册表值;
[*]我们的函数调用存储 WriteProcessMemory 的确切内存地址 (这看起来像是对寄存器 RAX 的调用,而不是调用 kernel32.WriteProcessMemory);
[*]这意味着我们没有直接调用 WriteProcessMemory,但仍然利用了所有的特性;
[*]EDR 只能看到与内存地址不匹配的程序集字符串;
[*]该内存地址将是函数的开始,但由于 ASLR,函数地址是唯一的,需要对每个函数进行查找;
[*]在执行写操作之前,执行 syscall ZWQueryVirtualMemory 以查看内存区域上的保护;
[*]如果此内存未设置为可写,则会调用 NtProtectVirtualMemory 更改权限;
[*]然后将 8 个字节的程序集写入特定的内存地址;
[*]再次调用 NtProtectVirtualMemory 来恢复原始保护值;
一旦 EDR 所有的钩子都被清除,loader 就会执行其正常操作来建立远程会话。
Ivy 通过 unhooking 通用系统 DLL EDR 的钩子来解决这个问题,这包括:
[*]Ntdll.dll
[*]Kernel32.dll
[*]Kernelbase.dll
[*]Advapi32.dll
[*]Sechost.dll
[*]Ws2_32.dll
[*]Winmmbase.dll
当使用 payload 类型 Injectivy 的 unhook 时,loader 将首先 unhook office 进程的挂钩,从中移除 edr,然后移除注入进程中的挂钩,这确保了两个进程都是无钩子的,从而防止来自父进程和子进程的任何遥测数据被发送到 EDR。
四、ETW Patching
使用相同的技术 unhook 挂钩,Ivy 可以 patch ETW 功能,防止过程中产生任何事件。ETW 利用内置系统调用生成该遥测。由于 ETW 是内置于 Windows中 的本机功能,安全产品不需要 "hook" ETW 系统调用来获取信息。因此,为了防止 ETW,Ivy patch 了大量 ETW 系统调用,清除寄存器并将执行流返回到下一条指令。patch ETW 现在是所有 loader 中的默认设置,如果您不希望 patch ETW,请使用 -noetw 命令行选项在 loader 中禁用它。
五、安装
lvy 是用 go 语言开发的,首先将仓库克隆到本地,在编译 lvy 之前,需要安装相关依赖,运行如下命令来进行安装:
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go然后 build:
go build Ivy.go六、Help
$ ./Ivy -h
___ ___ ______ ___
|\\ |\\ //||\\//|
\ \\\ \\// /\ \\// /
\ \\\ \\// /\ \ / /
\ \\\ \ / / \///
\ \__\\ \__/ / __// /
\|__| \|__|/ |\___/ /
\|___|/
(@Tyl0us)
The suffering. The pain. Can't you hear them?
Their cries for mercy?
Usage of ./Ivy:
-Ix64 string
Path to the x64 payload
-Ix86 string
Path to the x86 payload
-O string
Name of output file
-P string
Payload type "Inject" (Which performs a process injection) or "Local" (Which loads the payload directly into the current process)
-debug
Print debug statements
-delivery string
Generates an one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader.
[*] hta - Generates a blank hta file containing the loader along with a one liner command execute the loader remotely.
[*] macro - Generates an office macro that would download and execute a the loader remotely.
[*] xsl - Generates a xsl stylesheet file containing the loader along with a one liner command execute the loader remotely.
-process32 string
The full path to the x86 application to spawn. Only use applications that are found in System32 & SYSWOW64 (default is rundll32.exe)
-process64 string
The full path to the x64 application to spawn. Pleasespecify the path to the process to create/inject into (use \ for the path) (default is explorer.exe)
-product string
Name of the office product to use (Excel, Word, PowerPoint) (default "Excel")
-sandbox
Enable sandbox evasion controls (i.e. checks if the system is domain joined)
-stageless
Enables stageless payload. When this option is enabled use a raw payload (aka .bin files) instead of .c code
-unhook
Unhooks EDR's hooks before loading payload
-url string
URL assoicated with the Delivery option to retrieve the payload. (e.g https://acme.com/)
七、生成一个 Loader
使用 Ivy 生成 loader 时,需要生成 64 位和 32 位 payload,并使用 -Ix64 和 -Ix86 命令行参数输入它们。这是因为操作系统可能是 64 位,但运行的 Office 版本实际上可能是 32 位,因此,Ivy 将在注入 payload 之前检测到要使用的合适架构。
此外,在生成 loader 时,有两种 payload 类型 (Inject 和 Local),第一个,Inject,执行进程注入攻击,其中一个新进程在挂起状态下产生,shellcode 被注入到进程中,然后再恢复它。虽然进程注入可以很方便并生成一个非 excel 进程,但 EDR 非常擅长检测创建要注入的挂起进程的行为,这可能会让我们陷入困境,更隐蔽的选项是本地,这会将 shellcode 直接加载到当前的 Office 进程中。Local 选项还带有其他功能以避免检测,利用对某些 Windows 系统调用的直接调用,这是由于 VBA 环境允许我们根据堆栈定义和调用确切的函数 (前提是我们事先已对齐所有正确的寄存器)。最后,这种 payload 类型的 Ivy loader 有一个未记录的调用来执行 shellcode,这使得捕获执行变得更加困难。
注入进程
在注入模式下,Ivy 将创建一个处于挂起状态的进程来注入 shellcode,根据是 32 位还是 64 位系统,将产生不同的进程。Ivy 带有一些默认的进程名称来生成,但是可以使用 process32 或 process64 标志来更改这些名称。指定路径时,请确保使用 \\ 作为路径。
八、Staged vs Stageless Shellcode
首先,应该始终使用 -stageless 参数 (不分阶段),但是,如果需要运行分阶段的 payload,可以不使用 -stageless 参数来实现。使用 -stageless 时,可以使用原始 shellcode,但是,当选择运行分阶段的 payload 时,重要的是对于 Inject payload 类型,shellcode 必须是 VBA 格式,对于 Local 类型,shellcode 是 C 格式。
九、Delivery
delivery 命令行参数允许生成命令或代码字符串 (在宏情况下) 以远程方式将文件从远程源拉至受害者的主机,这些 delivery 方法包括:
[*]Bits:这将生成一个 bitsadmin 命令,远程下载 loader,执行并删除它;
[*]HTA:这将生成一个包含 loader 的空白 HTA 文件,该选项还将提供一个命令行,该命令行将在后台远程执行 HTA;
[*]Macro:这将生成可放入 Excel 或 Word 宏文档中的 Office 宏。执行此宏时,loader 将从远程源下载并执行,然后删除;
[*]XSL:生成包含 loader 的 XSL 样式表文件,以及远程执行加载程序的一行命令;
{:5_150:} 好内容值得分享!
页:
[1]