项目地址
https://github.com/NVISOsecurity/CobaltWhispers
项目介绍
CobaltWhispers 是一个攻击者脚本,它利用 Cobalt Strike 的信标对象文件 (BOF) 集合来执行进程注入、持久化等,利用直接系统调用 (SysWhispers2) 绕过 EDR/AV
CobaltWhispers
作者:@Cerbersec
CobaltWhispers 是一个攻击者脚本,它利用 Cobalt Strike 的 Beacon 对象文件集合来执行进程注入、持久化等,利用直接系统调用绕过 EDR/AV。
CobaltWhispers 由SysWhispers2和InlineWhispers2
提供支持 CobaltWhispers 基于StayKit并来自Hasherezade和Forrest Orr。
CobaltWhispers 是在 NVISO Security 的红队实习的一部分。可以在此处 (process-injection)和此处 (kernel karnage)找到相关的博文。
从源代码编译
CobaltWhispers 需要几个工具来编译:
- MingW-w64 –
apt install mingw-w64
- 制作 –
apt install make
- Python3
- SysWhispers2
- InlineWhispers2
每个项目需要 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)
名称:逗号单独的模块名称列表或单个供应商名称(请参阅:信息 – 供应商)(有条件的)
选择“进程”、“线程”、“图像”、“注册表”、“对象进程”或“对象线程”时需要值。选择“供应商”或“模块”时需要名称。
没有回复内容