该工具是 Cobalt Strike 传统 fork and run 执行的替代品。加载器可以注入任何进程,包括当前的 Beacon。长时间运行的程序集将继续运行并将输出发送回 Beacon,类似于 execute-assembly 的行为。
注入装配有两个组成部分:
-
BOF 初始值设定项:一个小程序,负责将程序集加载程序注入远程进程,并传递任何参数。它使用 BeaconInjectProcess 来执行注入,这意味着可以在 Malleable C2 配置文件中或使用流程注入 BOF(从版本 4.5 开始)自定义此行为。
-
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
指定 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 程序集注入现有进程