pyCobaltHound 是一个用于 Cobalt Strike 的 Aggressor 脚本扩展,旨在提供 Cobalt Strike 与 Bloodhound 之间的深度集成。
pyCobaltHound 旨在通过以下方式帮助红队操作人员:
BloodHound 数据库,发现新收集凭证所打开的提权路径。为此,pyCobaltHound 使用一组内置查询。操作人员还可以添加/删除自己的查询,以微调 pyCobaltHound 的监控能力。这使他们能够在行动过程中灵活调整 pyCobaltHound,以适应特定目标(用户、主机等)。
要安装 pyCobaltHound,请克隆此仓库。不要忘记同时克隆包含的子模块!
您可以使用以下命令:
git clone https://github.com/NVISOsecurity/pyCobaltHound.git --recurse-submodules确保已正确安装以下依赖项:
PyCobalt 是 Cobalt Strike 的 Python API。它公开了许多 Aggressor 函数,可直接在 Python 中使用。
确保已安装 Python3+。虽然 PyCobalt 可能也适用于 macOS 和 Windows,但我们仅在 Linux 上进行了实际测试。
有两种使用 PyCobalt Python 库的方法:
pyCobaltHound 采用此方法,在 Python 程序中使用 sys.path 变量设置搜索路径。PyCobalt Python 库。为此,请运行 python3 setup.py install。您需要修改 pycobalthound.py,以确保它使用已安装的库,而不是包含仓库中的库。PyCobalt 项目能否在未来得到维护并无保证。事实上,该项目的最新更新是为了适应 Cobalt Strike 4.2 的变更。但由于 pyCobaltHound 仅使用基本的 Aggressor 函数与 Cobalt Strike 及其操作人员交互,这对 pyCobaltHound 来说并不是大问题。PyCobalt 子模块是我们自己维护的一个分支。不过,我们不控制 PyCobalt 仓库。PyCobalt 附带一些脚本控制台命令,用于管理正在运行的 Python 脚本。当您重新加载 Aggressor 脚本时,应首先显式停止 Python 脚本。否则它们将永远运行但无所作为。在 pyCobaltHound 的开发过程中,我们注意到这还可能导致未定义的行为。
重新加载 pyCobaltHound 的操作如下:
aggressor> python-stop-all`
[pycobalt] Asking script to stop: /root/pycobalthound/pycobalthound.py
[pycobalt] Script process exited: /root/pycobalthound/pycobalthound.py
aggressor> reload example.cna`
[pycobalt] Executing script /root/pycobalthound/pycobalthound.py
PyCobalt 正常工作,您只能在一个 Aggressor 脚本中调用 PyCobalt。如果您想将 pyCobaltHound 与其他使用 PyCobalt 的 Aggressor 脚本一起使用,请牢记这一点。我们的方法是拥有一个包含对每个基于 PyCobalt 的工具进行 python() 和 include() 调用的 Aggressor 脚本。notify2 是(或曾经是)一个在 Linux 上显示桌面通知的包。稍后我们将看到,pyCobaltHound 支持几种通知操作人员的方式。notify2 用于在 Linux 上通过 D-Bus 向通知守护进程发送通知。
要启用此功能,需要使用以下命令安装 notify2:
pip install notify2
在 Cobalt Strike 中使用 pyCobaltHound 就像将 pycobalthound.cna Aggressor 脚本导入您的客户端一样简单。完成后,您应该会在 Cobalt Strike 菜单栏中看到一个 pyCobaltHound 菜单。

pyCobaltHound 最初的目标是监控 Cobalt Strike 的凭据缓存(视图 > 凭据)中的新条目。它通过响应 Cobalt Strike 在凭据存储变更时触发的 on_credentials 事件来实现这一点。
当此事件触发时,pyCobaltHound 将:
Cobalt Strike 接收到的数据BloodHound 数据库中BloodHound 数据库。由于所有这些操作都是异步于主 Cobalt Strike 客户端进行的,因此该过程不应阻塞您的用户界面,您可以在 pyCobaltHound 后台调查时继续工作。
pyCobaltHound 为每个团队服务器使用独立的缓存,以防止在使用多个团队服务器时出现问题。
有时,您可能希望重新调查特定用户(或整个凭据存储)。例如当您将新数据上传到 BloodHound 数据库时。
由于 pyCobaltHound 应该已经调查过(因此缓存了)凭据存储中的所有实体,因此如果不进行人工干预,它不会针对这些新数据评估它们。
操作人员有两种方法可以控制哪些实体被缓存。
如果您希望从缓存中移除某个特定实体(或多个),可以在凭据查看器中操作(视图 > 凭据)。只需选择您的目标,然后点击 pyCobaltHound 菜单下的从缓存中移除选项。

如果您希望移除缓存中的所有实体,可以在 pyCobaltHound 的主菜单中操作(Cobalt Strike > pyCobaltHound > 擦除缓存)。当您想重新评估整个凭据存储时,这最为有用。

将目标从缓存中移除后,您可以手动提示 pyCobaltHound 重新调查凭据存储的内容。此过程与上述完全相同。
pyCobaltHound 包含与现有 Beacon 会话交互的功能。这些功能可以在 Beacon 上下文菜单中找到。请注意,这些命令可以针对单个 Beacon 或选定的 Beacon 组执行。

当处理那些尚未(或尚未)被攻陷凭据但实际上已受我们控制的用户和计算机(例如,因为我们有一个 Beacon 在其会话令牌下运行)时,此功能尤其有用。
标记为已控制 功能(pyCobaltHound > 标记为已控制)可用于将 Beacon(或 Beacon 组)在 BloodHound 数据库中标记为已控制。

此对话框将要求操作人员提供以下信息:
pyCobaltHound 才会将计算机标记为已控制。调查 功能(pyCobaltHound > 标记为已控制)可用于调查与 Beacon(或 Beacon 组)相关联的用户和主机。

此对话框将要求操作人员提供以下信息:
pyCobaltHound 才会调查计算机。pyCobaltHound 将调查所有实体,而不检查完整性级别。pyCobaltHound 包含自由调查实体的功能。可以在主菜单中找到(Cobalt Strike > pyCobaltHound > 调查)。
当处理那些既未被攻陷凭据也不受我们控制的用户和计算机时,此功能尤其有用。

此对话框将要求操作人员提供以下信息:
pyCobaltHound 的设置菜单位于 Cobalt Strike > pyCobaltHound > 设置。

pyCobaltHound 会将设置保存到磁盘。每次重新加载 pyCobaltHound 时,它都会检查是否存在设置文件,如果找到则加载已保存的设置。
pyCobaltHound 为每个团队服务器保存一个设置文件,因此可以在不同的团队服务器上使用不同的设置。
要认证到 BloodHound 数据库,pyCobaltHound 需要以下信息:
注意: 如果您选择持久保存设置(以便在客户端/主机重启后保留它们),pyCobaltHound 将反序列化并将这些凭据存储在磁盘上。
如前所述,pyCobaltHound 使用缓存来确保不会执行不必要的工作。可以在设置中禁用此缓存。这在开发新查询时尤其有用,这样您就不必不断管理/擦除缓存。
pyCobaltHound 支持几种不同的方法,在识别到感兴趣的实体时通知操作人员。可以禁用这些通知。
默认情况下,pyCobaltHound 会使用默认的 Aggressor 消息框通知操作人员。此选项可以适应操作人员的工作流程。然而,由于它在运行 Cobalt Strike 客户端的每个平台上都受支持,因此是默认方法。

pyCobaltHound 还支持在 Linux 上显示桌面通知。这是我们更喜欢的选项,因为它不会中断操作人员的工作流程。

在某些工作流程中,pyCobaltHound 会生成 HTML 报告。做出这一设计选择是为了避免在调查大量实体时向操作人员推送巨大的通知。这些报告将生成在 reports 文件夹中。可以禁用报告生成。

默认情况下,pyCobaltHound 会使用一个中央文件来同步所有查询相关设置,从而实现跨团队服务器的查询同步。这意味着在一个团队服务器上启用、添加或删除的查询,也会在其他团队服务器的查询中启用、添加或删除。这主要是一个便利选项,可以禁用,这在您运行特定于行动的查询且这些查询不适用于您连接的所有团队服务器时非常有用。
当查询同步被禁用时,pyCobaltHound 会检查是否存在唯一的查询文件。如果存在,它将加载并使用这些查询。如果文件不存在,它将创建并加载它们。此设置将在重新加载后保留。
当查询同步被启用时,pyCobaltHound 会检查是否存在唯一的查询文件。如果存在,将提示操作人员做出选择。

操作人员有以下选择:
pyCobaltHound 将直接移除唯一的查询文件。所有自定义查询将丢失。pyCobaltHound 将尝试将唯一的查询文件合并到通用查询文件中。在合并查询之前,它会检查通用文件中是否已有同名或相同 Cypher 语句的查询。如果发生任何合并冲突,将询问操作人员是否希望保留未合并的查询。它们将保存在一个单独的文件中。然后移除唯一的查询文件。pyCobaltHound 将直接保留唯一的查询文件。所有自定义查询将被保留,如果将来再次禁用查询同步,这些文件将被重新加载。pyCobaltHound 目前支持以下内置查询:
管理 pyCobaltHound 使用的各种查询可以通过主菜单进行(Cobalt Strike > pyCobaltHound > 查询)。

更新查询 对话框允许操作人员启用/禁用特定的查询。使用此对话框时,操作人员首先会被问及要更新哪种类型的查询。这样做是为了在此工作流程中动态地渲染/加载正确的查询。

在回答第一个对话框后,操作人员将看到所选类型的所有可用查询列表。在此他们可以选择要启用/禁用的查询。

查询类型选项是将查询类型传递给工作流中下一个函数的丑陋变通方法,对操作人员无关紧要。
添加查询 功能允许操作人员添加/删除自己的查询,以微调 pyCobaltHound 的调查能力。这使他们能够在行动过程中灵活调整 pyCobaltHound,以适应特定目标(用户、主机等)。

此对话框将要求操作人员提供以下信息:
pyCobaltHound 的工作流程中的各种菜单和报告中使用。pyCobaltHound 需要执行的 Cypher 查询。操作人员可以自由定义查询。唯一的要求如下:
pyCobaltHound 根据正在调查的实体名称动态生成以下 Cypher 字符串:
WITH [账户名称列表] AS samAccountNames UNWIND samAccountNames AS names.MATCH (x) WHERE x.name STARTS WITH names(x:User))。pyCobaltHound 期望查询返回一组唯一的用户名。
RETURN DISTINCT (x.name) 结束查询。pyCobaltHound 用于自定义查询的标题。这将在 pyCobaltHound 工作流程的通知和报告中使用。
pyCobaltHound 将用此查询的结果数量替换它。删除查询 对话框允许操作人员从 pyCobaltHound 中移除特定的自定义查询。使用此对话框时,操作人员首先会被问及要删除哪种类型的查询。这样做是为了在此工作流程中动态地渲染/加载正确的查询。

在回答第一个对话框后,操作人员将看到所选类型的所有可用查询列表。在此他们可以选择要删除的查询。

查询类型选项是将查询类型传递给工作流中下一个函数的丑陋变通方法,对操作人员无关紧要。
pyCobaltHound 使用/借鉴了以下项目: