Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
ScareCrow — ScareCrow - 围绕EDR绕过设计的载荷创建框架。 | Kitploit
工具/GitHubGitHub/optiv/scarecrow
漏洞利用框架Payload生成Shellcode渗透测试红队Payload 开发Archived
GitHuboptiv/scarecrow

ScareCrow

ScareCrow - 围绕EDR绕过设计的载荷创建框架。

查看仓库
2.9k52963年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

此仓库已归档

要查看最新版本的 ScareCrow 或提交问题,请参考 https://github.com/Tylous/ScareCrow。



ScareCrow

更多信息

如果你想了解本框架所用技术的更多细节,请查看第1部分和第2部分

描述

ScareCrow 是一个载荷生成框架,用于侧加载(而非注入)到合法的 Windows 进程中(绕过应用程序白名单控制)。一旦 DLL 加载器被加载到内存中,它就会利用一种技术清除进程内存中运行的系统 DLL 上的 EDR 钩子。这之所以有效,是因为我们知道 EDR 的钩子是在进程生成时放置的。

ScareCrow 可以针对这些 DLL,通过使用 API 函数 VirtualProtect 在内存中操作它们。VirtualProtect 可以将进程内存的某个区域权限更改为不同的值,具体来说是从“执行-读取”改为“读取-写入-执行”。

ScareCrow 使用以下两种方法之一来解除钩子:

磁盘方法

执行时,ScareCrow 会复制存储在 C:\Windows\System32\ 磁盘上的系统 DLL 的字节。这些磁盘上的 DLL 是“干净”的,没有 EDR 钩子,因为系统会使用它们在生成新进程时加载未修改的副本。由于 EDR 只在内存中钩住这些进程,它们保持不变。ScareCrow 不会复制整个 DLL 文件,而是只关注 DLL 的 .text 段。该段包含可执行汇编代码,通过这样做,ScareCrow 有助于降低检测的可能性,因为重新读取整个文件可能导致 EDR 检测到系统资源被修改。然后,数据通过每个函数的偏移量被复制到内存的正确区域。每个函数都有一个偏移量,表示从基地址开始的确切字节数,从而确定函数在堆栈上的位置。

为此,ScareCrow 使用 VirtualProtect 更改 .text 内存区域的权限。尽管这是系统 DLL,但由于它已被加载到我们的进程(由我们控制)中,我们可以在不需要提升权限的情况下更改内存权限。

间接系统调用

ScareCrow 将 shellcode 加载到内存中,首先解密 shellcode(通过三种加密方法之一加密,如下所述)。解密并加载后,shellcode 被执行。根据指定的加载器选项,ScareCrow 会为 DLL 设置不同的导出函数。加载的 DLL 也不包含所有 DLL 通常需要的标准 DLLMain 函数。DLL 仍然可以毫无问题地执行,因为我们加载到的进程会寻找那些导出函数,而不会关心 DLLMain 是否存在。

二进制示例

之后

KnownDLLs

KnownDLLs 是 Windows 系统启动过程中加载的一组 DLL。由于这些 DLL 被认为是操作系统运行所必需的,它们会被缓存以帮助减少加载时间并提高应用程序启动时的性能。KnownDLLs 包括 kernel32.dll、kernelbase.dll 和 ntdll.dll 等 DLL。

利用这些 KnownDLLs,ScareCrow 通过结合使用 NtOpenSection 和 NtMapViewOfSection,从 \KnownDlls\<dllname> 映射一份 DLL 副本加载到进程内存中。ScareCrow 不会加载整个 DLL,而只加载 DLL 的 .text 段(因为它在包含所有系统调用)。然后,ScareCrow 使用间接系统调用来调用 NtProtectVirtualMemory,更改 DLL 的 .text 内存段的权限,以允许 ScareCrow 覆盖 EDR 的钩子,最后恢复权限。

有关更多信息,你可以阅读 modexp 的详细文章

一旦这些钩子被移除,ScareCrow 随后使用自定义系统调用将 shellcode 加载到内存并执行。即使在移除 EDR 钩子之后,ScareCrow 这样做是为了帮助避免被基于非用户态的钩子遥测收集工具(如 Windows 事件跟踪 (ETW) 或其他事件日志记录机制)检测到。这些自定义系统调用也用于执行上述的 VirtualProtect 调用来移除 EDR 放置的钩子,以避免被任何 EDR 的反篡改控制检测到。这是通过调用自定义版本的 VirtualProtect 系统调用 NtProtectVirtualMemory 来完成的。ScareCrow 利用 Go 语言生成这些加载器,然后使用汇编语言编写这些自定义系统调用函数。

在加载器的创建过程中,ScareCrow 利用一个库来在信标回连后融入后台。该库做两件事:

使用代码签名证书签名的文件通常受到较少的审查,使得它们更容易被执行而不被质疑,因为由受信任名称签名的文件通常比其他文件更不容易引起怀疑。大多数反恶意软件产品没有时间验证这些证书(现在有些产品会验证,但常见的供应商名称通常包含在白名单中)。ScareCrow 通过使用工具 limelighter 的 Go 包版本创建一个 pfx12 文件来生成这些证书。该包接受用户输入的域名,为该域名创建代码签名证书。如果需要,你也可以使用自己的代码签名证书,通过 valid 命令行选项。

  • ScareCrow 还能够从文件中获取合法代码签名证书的完整链和所有属性,并将其复制到另一个文件上。这包括签名日期、计数器签名和其他可度量的属性。此选项可以使用 DLL 或 .exe 文件进行复制,通过 clone 命令行选项以及要复制证书的文件的路径。

操作安全考虑:

root@kitploit:~
  当使用 microsoft.com 对加载器进行签名时,针对 WINDOWS DEFENDER ATP 产品效果可能不佳,因为它们可以验证该证书是否属于自己。如果你在针对 Windows 产品使用加载器,可能应该使用不同的域名。
  • 伪造加载器的属性: 这是通过使用 syso 文件实现的。syso 文件是一种嵌入式资源文件,当与我们的加载器一起编译时,会修改已编译代码的属性部分。在生成 syso 文件之前,ScareCrow 会生成一个随机文件名(基于加载器类型)以供使用。一旦选定,该文件名将映射到与该文件名关联的属性,从而确保分配正确的值。

文件属性示例

通过这些文件和 Go 代码,ScareCrow 使用 c-shared 库选项将它们交叉编译为 DLL。DLL 编译完成后,会被混淆成一个断裂的 base64 字符串,并嵌入到一个文件中。这样,该文件可以被远程拉取、访问并以编程方式执行。

自定义属性文件

虽然 ScareCrow 有大量的文件属性列表,但在某些情况下,需要自定义(可能是特定环境)的属性集。为适应这种情况,ScareCrow 允许输入包含属性的 JSON 文件。使用 -configfile 命令行选项,ScareCrow 将使用这些属性和文件名,而不是 ScareCrow 中预先存在的属性。文件 main.json 包含一个示例模板,展示了 JSON 结构应该如何才能正常工作。请注意,你用作 "InternalName" 的值将成为文件名。

要求

ScareCrow 现在需要 golang 1.19.1 或更高版本来编译加载器。如果你运行的是旧版本,请使用 1.19.1 或更高版本。

新版本请参见:https://golang.org/dl/。

安装

第一步总是克隆仓库。在编译 ScareCrow 之前,你需要安装依赖项。

要安装它们,请运行以下命令:``` go get github.com/fatih/color go get github.com/yeka/zip go get github.com/josephspurrier/goversioninfo go get github.com/Binject/debug/pe go get github.com/awgh/rawreader

root@kitploit:~
确保你的操作系统上已安装以下内容:```
openssl
osslsigncode
mingw-w64

然后构建它``` go build ScareCrow.go

root@kitploit:~
此外,ScareCrow 利用 [Garble](https://github.com/burrowers/garble) 来混淆所有加载器。

注意:部分依赖在 Windows 上编译时可能不兼容,因此建议在 OSX 或 Linux 上编译您的加载器。

## 帮助```

./ScareCrow -h

  _________                           _________                       
 /   _____/ ____ _____ _______   ____ \_   ___ \_______  ______  _  __
 \_____  \_/ ___\\__  \\_  __ \_/ __ \/    \  \/\_  __ \/  _ \ \/ \/ /
 /        \  \___ / __ \|  | \/\  ___/\     \____|  | \(  <_> )     / 
/_______  /\___  >____  /__|    \___  >\______  /|__|   \____/ \/\_/  
        \/     \/     \/            \/        \/                      
                                                        (@Tyl0us)
        “Fear, you must understand is more than a mere obstacle. 
        Fear is a TEACHER. the first one you ever had.”

Usage of ./ScareCrow:
  -Evasion string
        Sets the type of EDR unhooking technique:
        [*] Disk - Retrives a clean version of the DLLs ".text" field from files stored on disk.
        [*] KnownDLL - Retrives a clean version of the DLLs ".text" field from the KnownDLLs directory in the object namespace.
        [*] None - The Loader that WILL NOT removing the EDR hooks in system DLLs and only use custom syscalls. (default "Disk")
  -Exec string
        Set the template to execute the shellcode:
        [*] RtlCopy - Using RtlCopy to move the shellcode into the allocated address in the current running process by making a Syscall.
        [*] ProcessInjection - Process Injection Mode.
        [*] NtQueueApcThreadEx - Executes the shellcode by creating an asynchronous procedure call (APC) to a target thread.
        [*] VirtualAlloc - Allocates shellcode into the process using custom syscalls in the current running process (default "RtlCopy")
  -I string
        Path to the raw 64-bit shellcode.
  -Loader string
        Sets the type of process that will sideload the malicious payload:
        [*] binary - Generates a binary based payload. (This type does not benefit from any sideloading)
        [*] control - Loads a hidden control applet - the process name would be rundll32 if -O is specified a JScript loader will be generated.
        [*] dll - Generates just a DLL file. Can be executed with commands such as rundll32 or regsvr32 with DllRegisterServer, DllGetClassObject as export functions.
        [*] excel - Loads into a hidden Excel process using a JScript loader.
        [*] msiexec - Loads into MSIexec process using a JScript loader.
        [*] wscript - Loads into WScript process using a JScript loader. (default "binary")
  -O string
        Name of output file (e.g. loader.js or loader.hta). If Loader is set to dll or binary this option is not required.
  -clone string
        Path to the file containing the certificate you want to clone
  -configfile string
        The path to a json based configuration file to generate custom file attributes. This will not use the default ones.
  -console
        Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
  -delivery string
        Generates a one-liner command to download and execute the payload remotely:
        [*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader (Compatible with Binary, Control, Excel, and Wscript Loaders).
        [*] hta - Generates a blank hta file containing the loader along with an MSHTA command to execute the loader remotely in the background (Compatible with Control and Excel Loaders). 
        [*] macro - Generates an office macro that will download and execute the loader remotely (Compatible with Control, Excel, and Wscript Loaders).
  -domain string
        The domain name to use for creating a fake code signing cert. (e.g. www.acme.com) 
  -encryptionmode string
        Sets the type of encryption to encrypt the shellcode:
                [*] AES - Enables AES 256 encryption.
                [*] ELZMA - Enables ELZMA encryption.
                [*] RC4 - Enables RC4 encryption. (default "ELZMA")
  -export string
        For DLL Loaders Only - Specify an Export function for a loader to have.
  -injection string
        Enables Process Injection Mode and specify the path to the process to create/inject into (use \ for the path).
  -noamsi
        Disables the AMSI patching that prevents AMSI BufferScanner.
  -noetw
        Disables the ETW patching that prevents ETW events from being generated.
  -nosign
        Disables file signing, making -domain/-valid/-password parameters not required.
  -nosleep
        Disables the sleep delay before the loader unhooks and executes the shellcode.
  -obfu
        Enables Garbles Literal flag replaces golang libray strings with more complex variants, resolving to the same value at run-time. This creates a larger loader and times longer to compile
  -outpath string
        The path to put the final Payload/Loader once it's compiled.
  -password string
        The password for code signing cert. Required when -valid is used.
  -sandbox
        Enables sandbox evasion using IsDomainJoined calls.
  -url string
        URL associated with the Delivery option to retrieve the payload. (e.g. https://acme.com/)
  -valid string
        The path to a valid code signing cert. Used instead -domain if a valid code signing cert is desired.

加载器

加载器决定了将Shellcode加载到目标系统中使用的技术类型。如果没有选择加载器选项,ScareCrow将仅编译一个标准DLL文件,该文件可以通过rundll32、regsvr32或其他使用DLL的技术来使用。ScareCrow利用三种不同类型的加载器将Shellcode加载到内存中:

  • 控制面板 – 生成一个控制面板小程序(例如,程序和功能或自动播放)。通过编译加载器使其具有特定的DLL导出函数,并结合文件扩展名.cpl,它将生成一个控制面板进程(rundll32.exe),并将加载器加载到内存中。
  • WScript – 生成一个WScript进程,该进程利用清单文件和无注册COM技术将DLL加载器加载(而不是注入)到其自身的进程中,并排运行。这避免了在内存中注册DLL,因为清单文件会告诉进程加载哪个DLL、从何处加载以及加载哪个版本。
  • Excel – 生成一个XLL文件,这些是基于Excel的DLL文件,当加载到Excel中时会执行加载器。将生成一个隐藏的Excel进程,强制加载XLL文件。
  • Msiexec – 生成一个隐藏的MSIExec进程,该进程会将DLL加载到内存中并执行Shellcode。

如果需要,ScareCrow还可以通过使用-Loader命令行选项生成基于二进制的有效载荷。这些二进制文件不享受任何并排加载技术的好处,但根据情况可作为执行Shellcode的附加技术。

控制台

ScareCrow使用一种技术,首先创建进程,然后将其移动到后台。这有两个作用:首先,它有助于保持进程隐藏;其次,避免被任何EDR产品检测到。立即在后台生成进程可能非常可疑,并且是恶意的指标。ScareCrow通过在进程创建并且EDR钩子加载后调用GetConsoleWindow和ShowWindow Windows函数,然后将窗口属性更改为隐藏来实现这一点。ScareCrow使用这些API,而不是传统的-ldflags -H=windowsgui,因为后者在大多数安全产品中被高度签名并归类为入侵指标。

如果选择了-console命令行选项,ScareCrow将不会将进程隐藏到后台。相反,ScareCrow将添加几条调试消息,显示加载器正在做什么。

执行方法

ScareCrow使用不同的模板来执行Shellcode。要选择使用哪个模板,请使用-Exec命令行选项。这些模板包括:

  • RtlCopy
  • NtQueueApcThreadEx
  • VirtualAlloc
  • ProcessInjection

进程注入

ScareCrow具备进行进程注入攻击的能力。为了避免加载器进程或注入进程本身中的任何钩子或检测,ScareCrow首先像往常一样取消加载器进程的钩子,以确保进程中没有钩子。完成后,加载器将生成创建命令中指定的进程。一旦生成,加载器将创建一个进程句柄,以检索加载的DLL列表。找到DLL后,它将枚举远程进程中每个DLL的基地址。使用WriteProcessMemory函数,加载器将磁盘上存储的系统DLL字节(因为它们“清洁”且没有EDR钩子)写入,而无需先更改内存权限。ScareCrow使用WriteProcessMemory,因为该函数包含一个主要用于调试的功能:即使内存段是只读的,如果对WriteProcessMemory的调用一切正确,它会临时将权限更改为读写,更新内存段,然后恢复原始权限。完成后,加载器可以毫无问题地将Shellcode注入到生成的进程中,因为两个进程中都没有EDR钩子。

此选项可与任何加载器选项一起使用。要启用进程注入,请使用-injection命令行选项以及要注入到的进程的完整路径。在将路径作为参数输入时,务必用""将完整路径括起来,或者为路径中的每个目录使用双反斜杠\\。

AMSI和ETW绕过

ScareCrow具备修补AMSI(反恶意软件扫描接口)和ETW函数的能力,从而防止进程生成任何事件。

AMSI是一个Windows原生API,允许Windows Defender(或其他反恶意软件产品)深入Windows操作系统接口,提供更强的保护,特别是针对基于内存的攻击。AMSI使安全产品能够更好地检测恶意指标并帮助阻止威胁。由于AMSI是Windows原生的,产品不需要“挂钩”AMSI,而是加载必要的DLL以获得对进程更深入的了解。因此,ScareCrow加载AMSI.dll DLL,然后进行修补,以确保扫描接口的任何结果都返回为清洁。在所有加载器中,修补AMSI是默认行为,如果您希望不修补AMSI,请使用-noamsi命令行选项在加载器中禁用它。

ETW利用内置的系统调用来生成遥测数据。由于ETW也是Windows内置的原生功能,安全产品不需要“挂钩”ETW系统调用即可获取信息。因此,为了防止ETW,ScareCrow修补了多个ETW系统调用,清空寄存器并将执行流返回到下一条指令。在所有加载器中,修补ETW现在是默认行为,如果您希望不修补ETW,请使用-noetw命令行选项在加载器中禁用它。

目前,这些选项仅适用于父进程,如果使用了-injection命令行选项,主进程会修补AMSI和ETW,但注入的进程不会。

加密

加密Shellcode是一种重要技术,用于保护其不被EDR和其他安全产品检测和分析。ScareCrow提供多种加密Shellcode的方法,包括AES、ELZMA和RC4。

AES

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

ELZMA

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

RC4

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

混淆

使用-obfu命令行选项可以在编译过程中启用Garble的Literal标志。这会将任何Go库引用和字符串替换为更复杂的版本,这些版本在运行时解析为相同的值。此过程需要更长时间完成,导致生成的Go文件更大。文件编译后,ScareCrow解析新创建的文件,剥离任何基于Go字符串的IOC。

交付

交付命令行参数允许您生成一个命令或代码字符串(对于宏的情况),以从远程源将文件远程拉取到受害者的主机上。这些交付方法包括:

  • Bits – 将生成一个bitsadmin命令,该命令远程下载加载器、执行它并删除它。此交付命令与二进制、控制、Excel和Wscript加载器兼容。
  • HTA – 将生成一个包含加载器的空白HTA文件。此选项还将提供一个命令行,用于远程执行HTA。此交付命令与控制和Excel加载器兼容。
  • Macro – 将生成一个Office宏,可以放入Excel或Word宏文档中。执行此宏时,加载器将从远程源下载并执行,然后删除。此交付命令与控制、Excel和Wscript加载器兼容。(请注意,此方法可能比默认计时器花费更长时间,具体取决于受害者端点的可用资源速度)

待办事项

  • 某些较旧版本的Windows操作系统(例如Windows 7或Windows 8.1)在重新加载系统DLL时存在问题,因此内置了版本检查以确保稳定性。
  • 在注入的进程中修补ETW和AMSI。

鸣谢

  • 特别感谢josephspurrier的仓库
  • 特别感谢mvdan开发Garble
  • 特别感谢mvdan开发Binject
  • 特别感谢modexp的详细文章
下载工具