
CobaltWhispers is an aggressor script that utilizes a collection of Beacon Object Files (BOF) for Cobalt Strike to perform process injection, persistence and more, leveraging direct syscalls (SysWhispers2) to bypass EDR/AV
作者:@Cerbersec
CobaltWhispers 是一款 Aggressor 脚本,利用一组用于 Cobalt Strike 的 Beacon Object File 来执行进程注入、持久化等操作,并借助直接系统调用(direct syscalls)绕过 EDR/AV。
CobaltWhispers 由 SysWhispers2 和 InlineWhispers2 提供支持
CobaltWhispers 基于 StayKit 以及 Hasherezade 和 Forrest Orr 的工作成果。
CobaltWhispers 是在 NVISO Security 红队实习期间制作的。相关博客文章可参见此处(进程注入)和此处(kernel karnage)。
CobaltWhispers 需要以下工具才能编译:
apt install mingw-w64apt install make每个项目都需要由 SysWhispers2 / InlineWhispers2 生成的 3 个文件才能运行:
这些文件可以按照 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,后者会将其转换为正确的格式。更多信息请参阅随附的 makefile,或者自行承担风险使用随附的文件。
| 载荷类型 | 目标 | 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|---|---|
| - | - | 5 | 否 | 继承父进程的权限 |
生成一个新的挂起进程,并启用代码完整性保护(CIG)以阻止非 Microsoft 签名的二进制文件。欺骗指定的父进程。返回 PID。
**父进程:**要设置为父进程的进程名称
**可执行文件位置:**用于生成新进程的磁盘上可执行文件的完整路径
| 载荷类型 | 目标 | 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | 否 | - |
使用 NtCreateThreadEx 将载荷注入远程进程
**进程 PID:**远程进程的进程 ID
**载荷位置:**磁盘上二进制形式的载荷位置(条件 | 可选)
**载荷 b64:**Base64 编码字符串格式的原始 shellcode(条件 | 可选)
**监听器:**用于生成载荷的监听器(条件)
应指定监听器以生成 Beacon 载荷。如果需要手动载荷,则可通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。
| 载荷类型 | 目标 | 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | 否 | 可能导致目标进程崩溃 |
使用 NtQueueApcThread 将载荷注入远程进程
**进程 PID:**远程进程的进程 ID
**线程数:**要添加 APC 调用的线程数
**载荷位置:**磁盘上二进制形式的载荷位置(条件 | 可选)
**载荷 b64:**Base64 编码字符串格式的原始 shellcode(条件 | 可选)
**监听器:**用于生成载荷的监听器(条件)
应指定监听器以生成 Beacon 载荷。如果需要手动载荷,则可通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。
| 载荷类型 | 目标 | 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|---|---|
| Shellcode/Raw | 替身进程 | 5 | 否 | - |
使用 NtMapViewOfSection 将载荷注入替身进程
**父进程:**要设置为父进程的进程名称
**可执行文件位置:**用于生成新进程的磁盘上可执行文件的位置
**载荷位置:**磁盘上二进制形式的载荷位置(条件 | 可选)
**载荷 b64:**Base64 编码字符串格式的原始 shellcode(条件 | 可选)
**监听器:**用于生成载荷的监听器(条件)
应指定监听器以生成 Beacon 载荷。如果需要手动载荷,则可通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。
| 载荷类型 | 目标 | 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|---|---|
| PE | 替身进程 | 5 | 否 | 需要 x64 PE 载荷 |
使用事务性节区和映射视图将载荷注入替身进程。更新远程入口点和 PEB,不会产生异常内存节区或内存权限。更多信息请参见此处。
**父进程:**要设置为父进程的进程名称
**可执行文件位置:**用于生成新进程的磁盘上可执行文件的位置
**载荷位置:**磁盘上 x64 PE 载荷的位置(条件 | 可选)
**载荷 b64:**Base64 编码字符串格式的 x64 PE 载荷(条件 | 可选)
**监听器:**用于生成载荷的监听器(条件)
应指定监听器以生成 Beacon 载荷。如果需要手动载荷,则可通过磁盘上 x64 PE 的路径或 Base64 编码的 x64 PE 提供。
当前未实现
| 载荷类型 | 目标 | 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|---|---|
| 位置无关 Shellcode(PIC) | 替身进程 | 5 | 是 | 需要提升权限才能以写入权限打开系统 DLL |
结合 DLL hollowing 和事务性节区,将载荷注入替身进程。更多信息请参见此处。
**父进程:**要设置为父进程的进程名称
**可执行文件位置:**用于生成新进程的磁盘上可执行文件的位置
**载荷位置:**磁盘上二进制形式的载荷位置(条件 | 可选)
**载荷 b64:**Base64 编码字符串格式的原始 shellcode(条件 | 可选)
**监听器:**用于生成载荷的监听器(条件)
应指定监听器以生成 Beacon 载荷。如果需要手动载荷,则可通过磁盘上原始二进制文件的路径或 Base64 编码的 shellcode 提供。
在指定位置创建或修改注册表项。
**项名称:**值名称
**命令:**使用注册表时要运行的命令
**注册表项:**将创建注册表项的位置
**隐藏:**将在项名称前添加一个空字节;在 regedit 中会引发错误
**清理:**删除已创建的项
清理时需要提供项名称和注册表项(位置)。
在指定位置创建或修改注册表项。
**项名称:**值名称
**命令:**使用注册表时要运行的命令
**注册表项:**将创建注册表项的位置
**隐藏:**将在项名称前添加一个空字节;在 regedit 中会引发错误
**清理:**删除已创建的项
清理时需要提供项名称和注册表项(位置)。
UserInit:自动设置“项名称”和“注册表项”。
在指定位置创建或修改注册表项。
**项名称:**值名称
**命令:**使用注册表时要运行的命令
**注册表项:**将创建注册表项的位置
**隐藏:**将在项名称前添加一个空字节;在 regedit 中会引发错误
**清理:**删除已创建的项
清理时需要提供项名称和注册表项(位置)。
在指定位置创建或修改注册表项。
**项名称:**值名称
**命令:**使用注册表时要运行的命令
**注册表项:**将创建注册表项的位置
**隐藏:**将在项名称前添加一个空字节;在 regedit 中会引发错误
**清理:**删除已创建的项
清理时需要提供项名称和注册表项(位置)。
UserInitMprLogonScript:自动设置“项名称”和“注册表项”。
劫持计划任务的 COM 处理器。在 HKCU:\Software\Classes\CLSID\\InprocServer32 处创建一个指向 DLL 的注册表项。
**类 ID:**与任务的 COM 处理器 CLSID 对应的 CLSID
**DLL 路径:**要加载的 DLL 的路径
**清理:**删除已创建的项
| 可靠性 (0-5) | 需提权 | 备注 |
|---|---|---|
| 4 | 是 | 可能导致目标系统蓝屏(BSOD) |
加载一个具有任意内核内存读写能力的易受攻击的已签名驱动程序(NalDrv/iqvm64.sys)。修改 ntoskrnl.exe 的 g_CiEnabled 或 CI.dll 的 g_CiOptions 标志,以禁用驱动程序签名强制(DSE)。
加载一个未签名驱动程序(Interceptor/Interceptor.sys),然后恢复 DSE 标志值。已签名驱动程序和未签名驱动程序都会写入磁盘。
| 驱动程序 | MD5 校验和 |
|---|---|
| iqvm64.sys | 1898ceda3247213c084f43637ef163b3 |
| Interceptor.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) |
**信息:**查询 Interceptor 驱动程序
**挂钩:**挂钩目标驱动程序的主要函数(IRP)
**取消挂钩:**还原目标驱动程序的主要函数
**修补:**修补目标内核回调
**还原:**还原目标内核回调
**供应商:**显示支持的供应商
**模块:**查询所有已加载的驱动程序
**已挂钩模块:**显示所有已挂钩的驱动程序
**回调:**查询所有已注册的回调
**索引:**按索引挂钩驱动程序(参见:信息 - 模块)
**名称:**按设备名称挂钩驱动程序(\Device\Name)
**值:**逗号分隔的索引列表(条件)
**名称:**目标驱动程序的设备名称(条件)
选择“索引”时,“值”为必填项。选择“名称”时,“名称”为必填项。
**索引:**按索引取消挂钩驱动程序(参见:信息 - 已挂钩模块)
**全部:**取消挂钩所有已挂钩的驱动程序
**值:**逗号分隔的索引列表(条件)
选择“索引”时,“值”为必填项。
**供应商:**修补与供应商模块关联的所有回调
**模块:**修补与模块关联的所有回调
**进程:**修补进程回调
**线程:**修补线程回调
**映像:**修补映像回调
**注册表:**修补注册表回调
**对象进程:**修补对象进程回调
**对象线程:**修补对象线程回调
**值:**逗号分隔的索引列表(参见:信息 - 回调)(条件)
**名称:**逗号分隔的模块名称列表或单个供应商名称(参见:信息 - 供应商)(条件)
选择“进程”、“线程”、“映像”、“注册表”、“对象进程”或“对象线程”时,“值”为必填项。选择“供应商”或“模块”时,“名称”为必填项。
**供应商:**还原与供应商模块关联的所有回调
**模块:**还原与模块关联的所有回调
**进程:**还原进程回调
**线程:**还原线程回调
**映像:**还原映像回调
**注册表:**还原注册表回调
**对象进程:**还原对象进程回调
**对象线程:**还原对象线程回调
**全部:**还原所有回调
**值:**逗号分隔的索引列表(参见:信息 - 回调)(条件)
**名称:**逗号分隔的模块名称列表或单个供应商名称(参见:信息 - 供应商)(条件)
选择“进程”、“线程”、“映像”、“注册表”、“对象进程”或“对象线程”时,“值”为必填项。选择“供应商”或“模块”时,“名称”为必填项。