CobaltWhispers利用Cobalt Strike的BOF执行进程注入、持久化 | 免杀AV、EDR

项目地址

https://github.com/NVISOsecurity/CobaltWhispers

项目介绍

CobaltWhispers 是一个攻击者脚本,它利用 Cobalt Strike 的信标对象文件 (BOF) 集合来执行进程注入、持久化等,利用直接系统调用 (SysWhispers2) 绕过 EDR/AV

CobaltWhispers

作者:@Cerbersec

CobaltWhispers 是一个攻击者脚本,它利用 Cobalt Strike 的 Beacon 对象文件集合来执行进程注入、持久化等,利用直接系统调用绕过 EDR/AV。

CobaltWhispers 由SysWhispers2InlineWhispers2
提供支持 CobaltWhispers 基于StayKit并来自HasherezadeForrest Orr

CobaltWhispers 是在 NVISO Security 的红队实习的一部分。可以在此处 (process-injection)此处 (kernel karnage)找到相关的博文。

从源代码编译

CobaltWhispers 需要几个工具来编译:

每个项目需要 3 个由 SysWhispers2 / InlineWhispers2 生成的文件才能运行:

  • syscalls-asm.h
  • syscalls.c
  • syscalls.h

这些文件可以根据 InlineWhispers2 文档生成,但这不是最佳方法,因为会包含很多未使用的代码:

git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py

 

相反,使用 SysWhispers2 仅为必要的 API 生成输出文件,然后手动(或编写脚本)将它们提供给 InlineWhispers2,InlineWhispers2 会将它们转换为正确的格式。有关其他信息,请参阅包含的 makefile 或使用包含的文件需要您自担风险。

注入

生成过程

载荷类型 目标 可靠性(0-5) 升高的 评论
5个 继承父进程的权限

描述

生成一个新的挂起进程,启用代码完整性保护 (CIG) 以阻止非 Microsoft 签名的二进制文件。欺骗指定的父进程。PID 被返回。

参数

父进程:设置为父进程的名称
可执行位置:磁盘上用于生成新进程的可执行文件的完整路径

创建远程线程

载荷类型 目标 可靠性(0-5) 升高的 评论
外壳代码/原始 PID 5个

描述

使用 NtCreateThreadEx 将有效负载注入远程进程

参数

Process PID:远程进程的进程 ID
Payload location:二进制形式的 payload 在磁盘上的位置(有条件 | 可选)
Payload b64: base64 编码字符串格式的原始 shellcode(有条件 | 可选)
Listener:用于生成有效负载的侦听器(有条件)

应指定侦听器以生成信标负载。如果需要手动有效载荷,则应通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。

排队用户APC

载荷类型 目标 可靠性(0-5) 升高的 评论
外壳代码/原始 PID 2个 潜在崩溃目标进程

描述

使用 NtQueueApcThread 将有效负载注入远程进程

参数

进程 PID:远程进程的进程 ID
线程:将APC调用添加到的线程数负载
位置:磁盘上二进制形式的负载位置(条件 | 可选)可选)监听器:为(条件)生成有效载荷的监听器

应指定侦听器以生成信标负载。如果需要手动有效载荷,则应通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。

地图视图部分

载荷类型 目标 可靠性(0-5) 升高的 评论
外壳代码/原始 代孕过程 5个

描述

使用 NtMapViewOfSection 将有效负载注入代理进程

参数

父进程:设置为父进程的名称
可执行文件位置:磁盘上用于生成新进程的可执行文件的位置
负载位置:磁盘上二进制形式的负载位置(条件 | 可选)
负载 b64:原始base64 编码字符串格式的 shellcode(有条件 | 可选)
监听器:为(有条件)生成有效载荷的监听器

应指定侦听器以生成信标负载。如果需要手动有效载荷,则应通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。

交易跟踪

载荷类型 目标 可靠性(0-5) 升高的 评论
聚乙烯 代孕过程 5个 需要 x64 PE 负载

描述

使用事务处理部分和映射视图将有效负载注入代理进程。远程入口点和 PEB 已更新,没有异常内存部分或内存权限。有关更多信息,请参见此处

参数

父进程:设置为父进程的名称
可执行文件位置:磁盘上用于生成新进程的可执行文件的位置
负载位置: x64 PE 负载在磁盘上的位置(条件 | 可选)
负载 b64: x64 PE base64 编码字符串格式的有效负载(有条件 | 可选)
监听器:为(有条件)生成有效负载的监听器

应指定侦听器以生成信标负载。如果需要手动有效负载,则应通过指向磁盘上的 x64 PE 或 Base64 编码的 x64 PE 的路径提供。

PhantomDLLHollowing

目前未实施

载荷类型 目标 可靠性(0-5) 升高的 评论
位置独立 Shellcode (PIC) 代孕过程 5个 是的 需要提升权限才能打开具有写入权限的系统 DLL

描述

使用事务处理部分结合 DLL 挖空将有效负载注入代理进程。有关更多信息,请参见此处

参数

父进程:设置为父进程的名称
可执行文件位置:磁盘上用于生成新进程的可执行文件的位置
负载位置:磁盘上二进制形式的负载位置(条件 | 可选)
负载 b64:原始base64 编码字符串格式的 shellcode(有条件 | 可选)
监听器:为(有条件)生成有效载荷的监听器

应指定侦听器以生成信标负载。如果需要手动有效载荷,则应通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。

持久化

提升注册码

描述

在指定位置创建或修改注册表项。

  • HKLM:Software\Microsoft\Windows\CurrentVersion\Run
  • HKLM:Software\Microsoft\Windows\CurrentVersion\RunOnce

参数

键名:值名
命令:使用注册表时要运行的命令
注册表键:将创建注册表键的位置
隐藏:将在键名前添加一个空字节;在 regedit
清理中抛出错误:删除创建的密钥

清理需要密钥名称和注册表项(位置)。

ElevatedUserInitRegKey

描述

在指定位置创建或修改注册表项。

  • HKLM:Software\Microsoft\Windows NT\CurrentVersion\Winlogon [用户初始化]

参数

键名:值名
命令:使用注册表时要运行的命令
注册表键:将创建注册表键的位置
隐藏:将在键名前添加一个空字节;在 regedit
清理中抛出错误:删除创建的密钥

清理需要密钥名称和注册表项(位置)。
UserInit:自动设置“Key name”和“Registry key”。

用户注册码

描述

在指定位置创建或修改注册表项。

  • HKCU:Software\Microsoft\Windows\CurrentVersion\Run
  • HKCU:Software\Microsoft\Windows\CurrentVersion\RunOnce

参数

键名:值名
命令:使用注册表时要运行的命令
注册表键:将创建注册表键的位置
隐藏:将在键名前添加一个空字节;在 regedit
清理中抛出错误:删除创建的密钥

清理需要密钥名称和注册表项(位置)。

UserInitMprRegKey

描述

在指定位置创建或修改注册表项。

  • HKCU:环境 [UserInitMprLogonScript]

参数

键名:值名
命令:使用注册表时要运行的命令
注册表键:将创建注册表键的位置
隐藏:将在键名前添加一个空字节;在 regedit
清理中抛出错误:删除创建的密钥

清理需要密钥名称和注册表项(位置)。
UserInitMprLogonScript:自动设置“Key name”和“Registry key”。

计划任务 COM 劫持

描述

劫持计划任务的 COM 处理程序。在 HKCU:\Software\Classes\CLSID\\InprocServer32 处创建指向 DLL 的注册表项。

参数

类 ID:与任务的 COM 处理程序对应的 CLSID CLSID
DLL 路径:要加载的 DLL 的路径
清理:删除创建的密钥

司机

禁用DSE

可靠性(0-5) 升高的 评论
4个 是的 可以潜在的 BSOD 目标系统

描述

加载具有任意内核内存读/写 (NalDrv/iqvm64.sys) 的易受攻击的签名驱动程序。更改 ntoskrnl.exeg_CiEnabled或 CI.dllg_CiOptions标志以禁用驱动程序签名强制 (DSE)。
加载未签名的驱动程序 (Interceptor/Interceptor.sys),然后恢复 DSE 标志值。已签名的驱动程序和未签名的驱动程序都写入磁盘。

司机 MD5校验和
iqvm64.sys 1898ceda3247213c084f43637ef163b3
拦截器.sys 508c8943359717cfa0c77b61ebea2118

参数

易受攻击的驱动程序位置:磁盘上二进制形式的易受攻击签名驱动程序的
位置 恶意驱动程序位置:磁盘上二进制形式的恶意非签名驱动程序的位置
易受攻击的驱动程序名称:用于创建注册表项的名称 ‘\Registry\Machine\System\ CurrentControlSet\Services\’
易受攻击的驱动程序设备名称:用于联系驱动程序的名称 ‘\DosDevices\’
恶意驱动程序名称:用于创建注册表项的名称 ‘\Registry\Machine\System\CurrentControlSet\Services\’
恶意驱动程序设备名称:用于联系驱动程序的名称 ‘\DosDevices\’
目标路径:写入易受攻击和恶意驱动程序文件的临时路径

卸载驱动程序

可靠性(0-5) 升高的 评论
5个 是的

描述

使用提供的注册表项卸载目标上的驱动程序,并从指定路径的磁盘中删除二进制文件。

参数

驱动注册表项:用于卸载驱动程序的注册表项 ‘\Registry\Machine\System\CurrentControlSet\Services\’
驱动程序安装路径:驱动程序在磁盘上的位置

截距

可靠性(0-5) 升高的 评论
4个 可以潜在的 BSOD 目标系统

描述

Information:查询Interceptor驱动
Hook: Hook目标驱动的主要函数(IRP)
Unhook:恢复目标驱动的主要函数
Patch:修补目标内核回调
Restore:恢复目标内核回调

参数:信息

Vendors:显示支持的厂商
Modules:查询所有加载的驱动
Hooked modules:显示所有hooked的驱动
Callbacks:查询所有注册的回调

参数:挂钩

索引:按索引挂接驱动程序(参见:信息 – 模块)
名称:按设备名称挂接驱动程序 (\Device\Name)
值:逗号分隔的索引列表(条件)
名称:目标驱动程序的设备名称(条件)

选择“索引”时需要值。选择“名称”时需要名称。

参数:Unhook

索引:通过索引取消挂钩驱动程序(请参阅:信息 – 挂钩模块)
全部:取消挂钩所有挂钩的驱动程序
值:逗号分隔的索引列表(有条件的)

选择“索引”时需要值。

参数:补丁

供应商:修补与供应商模块关联的所有回调
模块:修补与模块关联的所有回调
进程:补丁进程回调
线程:补丁线程回调
图像:补丁图像回调
注册表:补丁registry callback(s)
Object process: patch object process callbac(s)
Object thread: patch object thread callback(s)
Values: comma separated list of indexes (see: information – callbacks) (conditional)
名称:逗号分隔的模块名称列表或单个供应商名称(参见:信息 – 供应商)(有条件的)

选择“进程”、“线程”、“图像”、“注册表”、“对象进程”或“对象线程”时需要值。选择“供应商”或“模块”时需要名称。

参数:恢复

供应商:恢复与供应商模块相关的所有回调
模块:恢复与模块相关的所有回调
进程:恢复进程回调
线程:恢复线程回调
图像:恢复图像回调
注册表:恢复registry callback(s)
Object process: restore object process callbac(s)
Object thread: restore object thread callback(s)
All: restore all callbacks
Values: comma separated list of indexes (see: information – callbacks) (conditional)
名称:逗号单独的模块名称列表或单个供应商名称(请参阅:信息 – 供应商)(有条件的)

选择“进程”、“线程”、“图像”、“注册表”、“对象进程”或“对象线程”时需要值。选择“供应商”或“模块”时需要名称。

请登录后发表评论

    没有回复内容