重新编译 Metasploit/Meterpreter 以绕过杀毒软件和网络检测
我真的很想谈谈这个话题。但请注意,这将会有一些超前,所以你很可能在编译期间遇到一些问题。有很多很棒的工具,比如 Metasploit / Meterpreter,但是每个防病毒和网络入侵检测(NID)工具都为它开发了签名。我们可以尝试使用 Shikata Ga Nai
来混淆通过 HTTPS 传输的 payload,但也仅此而已。任何类型的混淆通常都会有一个检测的存根签名,杀毒软件会检查内存,查看特定某些位置的特殊字符串。网络流量可以通过 HTTPS 执行中间人检查。那么我们怎样才能继续使用我们喜欢的工具,同时绕过所有常见的保护措施呢?让我们以 Metasploit/Meterpreter 为例,看看我们如何绕过所有这些障碍。我们的目标是处理和解决二进制文件的杀毒软件签名(静态特征),内存运行中的特征和网络流量特征。
为了躲避所有这些检测方法,我们需要做一些事情。首先,我们需要修改 Meterpreter 的 payload,以确保不会在网络和内存中使用签名轻松检测到它们。其次,我们修改 metsvc
持久性模块以防止它标记反病毒。第三,我们用 Clang
编译部分 metsrv
(实际的 Meterpreter payload),以防止它也标记反病毒签名。最后,我们将编写自己的 stage0 payload,下载并执行 Meterpreter
,以绕过所有的反病毒。
使用 Clang 编译 metsrv
( Meterpreter
的网络服务包装器)并删除 metsrv/metsvc-server 引用:
修改Payload,删除像 Mimikatz
这样的字符串:
修改反射 DLL 注入以删除像 ReflectiveLoader
这样的字符串:
许多网络产品会检测 Meterpreter 的0/1/2级加载器。除了混淆我们的 payload,我们还可以混淆实际的 shellcode。一个例子是遍历所有 Ruby 文件以获取不同的 payload 类型,并添加随机空指令滑行区(nop sled)以避免被检测到:
译者注:一个空指令雪橇(NOP sled)(也被称为空指令滑行区)是在 shellcode 之前的一段很长的指令序列。参考资料: 空指令雪橇
自定义 Stage0 payload:
实验:
在本实验中,我们将采用所有我们修改过的 Metasploit/Meterpreter 代码,重新编译它,并确保它可以躲避基本的杀毒软件检测。
在开始之前,请查看搭建 Metasploit 的环境设置:
- https://github.com/rapid7/metasploit-payloads/tree/master/c/meterpreter
- https://github.com/rapid7/metasploit-framework/wiki/Setting-Up-a-Metasploit-Development-Environment
Windows 要求:
- Visual Studio 2013(VS2013)—— 社区版就行。需要随安装时一并安装 C/C++。
- LLVM 32位 Windows版本(一定要在安装完 VS 之后再安装 LLVM 而且一定要安装 LLVM 工具链) —— 在此地址下载 LLVM 6。
- Windows 版本的 GNU make 工具程序 —— 确保它位于你的路径中,或者从它的可用的已安装路径运行它。
- Git-SCM
如何在 Windows 上构建(build) Metasploit/Meterpreter:
首先拉取所有的 cyberspacekitten 仓库。这些文件已经针对你的实验进行了大量修改来作为 POC。然后我们需要下载框架和所有 payload:
- git clone https://github.com/cyberspacekittens/metasploit-framework
- cd metasploit-framework && git submodule init && git submodule update && cd ..
- git clone https://github.com/cyberspacekittens/metasploit-payloads
- cd metasploit-payloads && git submodule init && git submodule update && cd ..
虽然我们已经对仓库做了包括修改字符串、用 clang 编译和为 payload 添加随机空指令滑行区等这些更改,但请务必检查这两个仓库之间的 Metasploit 差异,以明确具体的更改内容。
编译 Metasploit/Meterpreter:
我们要做的第一件事情是重新编译我们更改后的 metsvc
和 metsvc-server
。在 Visual Studio 2013 的开发者命令提示符 VS2013(Command Prompt for VS2013)中执行以下操作:
- 转到我们修改的 metsvc 的源码所在的文件夹:
- cd metasploit-framework\external\source\metsvc\src
- 使用 make 进行编译:
- “C:\Program Files (x86)\GnuWin32\bin\make.exe”
将我们新创建的二进制文件移到我们的 meterpreter 文件夹:
- copy metsvc.exe ……..\data\meterpreter\
- copy metsvc-server.exe ……..\data\meterpreter\
接下来,修改我们的 Meterpreter payload 并使用提供的 .bat
文件对其进行编译:
- cd metasploit-payloads\c\meterpreter
- make.bat
编译完所有内容后,将生成两个文件夹(x86 和 x64)。将所有已编译的 DLL 复制到 meterpreter 文件夹:
- copy metasploit-payloads\c\meterpreter\output\x86* metasploit-framework\data\meterpreter
- copy metasploit-payloads\c\meterpreter\output\x64* metasploit-framework\data\meterpreter
最后就是要放到服务器上了。我们现在可以将整个 metasploit-framework 文件夹放到你的 Kali 系统上并启动 HTTPS 反向处理程序(windows/x64/meterpreter/reverse_https)。
创建一个修改后的 Stage 0 Payload
我们需要做的最后一件事是创建一个 Stage 0 payload 来让我们的初始可执行文件绕过所有杀毒软件检测。Meterpreter 中的 stage 0
payload 是任何漏洞利用或 payload 的第一阶段。
stage 0
payload 是一段代码,它实现了一个简单的功能:以我们想要的方式(reverse_https,reverse_tcp,bind_tcp 等)进行连接或者监听,然后接收一个 metsrv.dll 文件。它随后将此文件加载到内存中,然后执行它。从本质上讲,任何 Stage 0
payload 都只是一个美化的“下载并执行” payload,因为这就是所有的 Metasploit 运行的方式,所以在许多反病毒解决方案中都有针对 Metasploit 特定行为的高级签名和启发式分析——哪怕修改 shellcode 并添加花指令也仍然会因启发式分析而被标记为恶意。为了解决这个问题,我们编写了自己的 Stage 0,它执行相同的功能(在内存中下载和执行):我们复制 Meterpreter 的 reverse_https payload 的下载调用,从服务器获取 metsrv.dll,然后将其注入到内存中并执行它。
译者注:
- 在 metasploit 里面,payload 简单可以分为三类:
single
,stager
,stage
。
single
:实现单一、完整功能的 payload,比如说 bind_tcp 这样的功能。stager
和stage
就像 web 入侵里面提到的小马和大马一样。由于 exploit 环境的限制,可能不能一下子把 stage 传过去,需要先传一个 stager,stager 在攻击者和攻击目标之间建立网络连接,之后再把 stage 传过去进行下一步的行动。Reflective DLL Injection 就是作为一个 stage 存在。也即是说,你已经有了和攻击目标之间的连接会话,你可以传送数据到攻击目标上,之后 meterpreter 与 target 之间的交互就都是和发送过去的反射 dll 进行交互。
参考资料: Meterpreter 载荷执行原理分析
- 关于
stage 0
了解更多: 探寻 Metasploit Payload 模式背后的秘密
这里提供的 payload 具体示例具有一些更高级的功能。这样做是为了使它成为地址无关代码(PIC),并且不需要导入。这段代码是基于 thealpiste 的代码开发的 ( https://github.com/thealpiste/C_ReverseHTTPS_Shellcode )。
提供的示例 payload 执行以下操作:
- 所有代码都在内存中定位 DLL 和函数以便执行;无需导入任何模块。这是通过手动为所有使用的函数打桩,然后在内存中搜索它们来实现的。
- 使用 Wininet 将实际的 HTTPS 请求执行回配置的 Metasploit 处理程序。
- 接收
metsrv.dll
,并执行 blob 数据。Metasploit 为这些文件提供服务的方式,意味着入口点是缓冲区的开头。
这个功能是与执行 msfvenom 中构建的 payload 完全相同的过程。然而,msfvenom 以一种容易被预测和检测到的方式将这些添加到模板可执行程序中,并且这种方式是不可配置的。因此,大多数杀毒软件一直可以识别到它们。但是,仅仅需要一点编码技巧,你就可以重新编写这个 payload 的功能。重写的 payload 很小,并且可以绕过当前存在的任何检测。在撰写本文时,已经测得此 payload 可以绕过所有杀毒软件,包括 Windows Defender。
创建 payload(完整的 payload 位于这里):
- 在 VS 2013中,打开 metasploit-payloads\c\x64_defender_bypass\x64_defender_bypass.vcxproj
- 在 x64_defender_bypass 下有一个 settings.h 文件。打开此文件并将 HOST 和 PORT 信息修改为你的 Meterpreter 处理程序(handler)信息。
- 确保将构建模式设置为
Release
并编译x64
- 保存并构建
- 在
metasploit-payloads\c\x64_defender_bypass\x64\Release
下,将创建一个新的二进制文件x64_defender_bypass.exe
。在运行了 Windows Defender 的受害计算机上执行此 payload。当此项目构建成功,Windows Defender 不能检测到这个 payload。
你现在拥有一个深度混淆过的 Meterpreter 二进制文件和混淆过的传输层,以绕过所有默认的保护。现在这仅仅是一个让你入门的 POC。只要本书一发布,我可以预见到其中一些技术不久就会被检测出签名。你还可以采取更多措施来更好地规避检测工具。例如,你可以:
- 使用 clang 混淆工具链来构建
- 对所有字符串使用字符串加密库
- 更改 Meterpreter 入口点(目前是 Init )
- 创建一个自动化脚本,为所有 payload 类型添加空指令(nops)
- 编辑 payload 生成的实际 ruby,以便在每次运行时随机化 payload