将 .NET 程序集注入现有进程

将 .NET 程序集注入现有进程

该工具是 Cobalt Strike 传统 fork and run 执行的替代品。加载器可以注入任何进程,包括当前的 Beacon。长时间运行的程序集将继续运行并将输出发送回 Beacon,类似于 execute-assembly 的行为。


注入装配有两个组成部分:

  1. BOF 初始值设定项:一个小程序,负责将程序集加载程序注入远程进程,并传递任何参数。它使用 BeaconInjectProcess 来执行注入,这意味着可以在 Malleable C2 配置文件中或使用流程注入 BOF(从版本 4.5 开始)自定义此行为。

  2. PIC assembly loader:项目的主体。加载程序将初始化 .NET 运行时、加载提供的程序集并执行程序集。加载程序将在目标进程中创建一个新的 AppDomain,以便在执行完成时可以完全卸载已加载的程序集。

远程进程和 Beacon 之间的通信通过命名管道进行。Aggressor 脚本生成一个管道名称,然后将其传递给 BOF 初始化程序。

特点

  • 修补 Environment.Exit() 以防止远程进程退出。

  • .NET 程序集标头踩踏(MZ 字节、e_lfanew、DOS 标头、富文本、PE 标头)。

  • 基于SourcePoint的随机管道名称生成。

  • 不会阻塞 Beacon,即使程序集已加载到当前进程中也是如此。


inject-assembly.cna Aggressor 脚本并将其加载到 Cobalt Strike 中。然后您可以使用以下命令执行程序集:

inject-assembly pid assembly [args...]

指定 0 作为 PID 在当前 Beacon 进程中执行。

建议使用其他工具(如FindObjects-BOF)来定位已加载 .NET 运行时的进程,但这不是注入程序集运行的必要条件。


https://github.com/kyleavery/inject-assembly


  • 目前仅支持 x64 远程进程。

  • 整个程序中有几项检查以减少远程进程崩溃的可能性,但它仍然可能发生。

  • 默认的 Cobalt Strike 进程注入可能会让你被抓到。考虑自定义注入 BOF 或 UDRL IAT 挂钩。

  • 一些程序集依赖于 Environment.Exit() 来完成执行。这将防止加载程序的清理阶段发生,但您仍然可以使用断开命名管道jobkill

  • 取消注释 scmain.c 的第 3 行或第 4 行以分别启用错误或详细模式。默认情况下禁用这些以减少 shellcode 大小。


原文始发于微信公众号(Khan安全攻防实验室):将 .NET 程序集注入现有进程

版权声明:admin 发表于 2023年1月10日 上午8:26。
转载请注明:将 .NET 程序集注入现有进程 | CTF导航

相关文章

暂无评论

暂无评论...