重新编译 Metasploit/Meterpreter 以绕过杀毒软件和网络检测

我真的很想谈谈这个话题。但请注意,这将会有一些超前,所以你很可能在编译期间遇到一些问题。有很多很棒的工具,比如 Metasploit / Meterpreter,但是每个防病毒和网络入侵检测(NID)工具都为它开发了签名。我们可以尝试使用 Shikata Ga Nai 来混淆通过 HTTPS 传输的 payload,但也仅此而已。任何类型的混淆通常都会有一个检测的存根签名,杀毒软件会检查内存,查看特定某些位置的特殊字符串。网络流量可以通过 HTTPS 执行中间人检查。那么我们怎样才能继续使用我们喜欢的工具,同时绕过所有常见的保护措施呢?让我们以 Metasploit/Meterpreter 为例,看看我们如何绕过所有这些障碍。我们的目标是处理和解决二进制文件的杀毒软件签名(静态特征),内存运行中的特征和网络流量特征。

为了躲避所有这些检测方法,我们需要做一些事情。首先,我们需要修改 Meterpreter 的 payload,以确保不会在网络和内存中使用签名轻松检测到它们。其次,我们修改 metsvc 持久性模块以防止它标记反病毒。第三,我们用 Clang 编译部分 metsrv(实际的 Meterpreter payload),以防止它也标记反病毒签名。最后,我们将编写自己的 stage0 payload,下载并执行 Meterpreter,以绕过所有的反病毒。

使用 Clang 编译 metsrvMeterpreter 的网络服务包装器)并删除 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 的环境设置:

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:

虽然我们已经对仓库做了包括修改字符串、用 clang 编译和为 payload 添加随机空指令滑行区等这些更改,但请务必检查这两个仓库之间的 Metasploit 差异,以明确具体的更改内容。

编译 Metasploit/Meterpreter:
我们要做的第一件事情是重新编译我们更改后的 metsvcmetsvc-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,然后将其注入到内存中并执行它。

译者注:

  1. 在 metasploit 里面,payload 简单可以分为三类:singlestager,stage
  • single:实现单一、完整功能的 payload,比如说 bind_tcp 这样的功能。
  • stagerstage 就像 web 入侵里面提到的小马和大马一样。

由于 exploit 环境的限制,可能不能一下子把 stage 传过去,需要先传一个 stager,stager 在攻击者和攻击目标之间建立网络连接,之后再把 stage 传过去进行下一步的行动。Reflective DLL Injection 就是作为一个 stage 存在。也即是说,你已经有了和攻击目标之间的连接会话,你可以传送数据到攻击目标上,之后 meterpreter 与 target 之间的交互就都是和发送过去的反射 dll 进行交互。
参考资料: Meterpreter 载荷执行原理分析

  1. 关于 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