Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cypherhound — 你的基于模板的BloodHound终端伴侣工具 | Kitploit
工具/GitHubGitHub/fin3ss3g0d/cypherhound
侦察信息收集渗透测试实用工具与框架
GitHubfin3ss3g0d/cypherhound

cypherhound

你的基于模板的BloodHound终端伴侣工具

查看仓库
454367个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CypherHound

logo

一款Python3终端应用程序,包含用于BloodHound数据集的Neo4j Cypher查询,并附带一个脚本,可自动将这些查询导入BloodHound CE。

输出样例

终端

demo

HTML报表

report summary

HTML报表(续)

details sample

为什么?

BloodHound 是每位渗透测试人员的必备工具。然而,它的设计也带来了一些负面影响。以下是我遇到的最棘手的痛点,以及本工具旨在解决的问题:

  1. 我的工具以列表形式思考 – 在我的工具能解析导出的JSON图之前,我需要将图结果以逐行格式的.txt文件呈现,才能从其他工具中实际攻击目标。
  2. 复制/粘贴图结果 – 这延续了第一点,但我们真的需要解释这个吗?
  3. 图可能太大而无法绘制 – 大型AD环境、多条最短路径绘制在同一张图上等。任何 图中包含的信息都能帮助我们达成攻击者的目标,我们必须 能够高效地查看所有 数据。
  4. 手动运行自定义Cypher查询耗时 – 让我们把它自动化 :)

本工具对红队和蓝队都极具价值。

功能特性

用CypherHound重新掌控你的BloodHound数据!

  • 从YAML文件中读取Cypher模板
    • 设置基于用户输入(用户、组和计算机相关)的搜索查询
    • 用户自定义正则表达式查询
  • 用户自定义导出所有结果
    • 提供grep/cut/awk友好格式的示例
    • 将任意查询组合导出为现代、流畅的HTML报表
  • 在BloodHound CE GUI中运行相同的查询
    • YAML → JSON转换器及自动化的BloodHound CE查询导入器
    • 附带BloodHound Legacy customqueries.json 导入脚本至BloodHound CE

安装

确保已安装python3并运行:

python3 -m pip install -r requirements.txt

用法

启动程序:python3 cypherhound.py -c config.json -y queries.yaml

config.json

程序将读取json格式的配置文件。示例如下:

root@kitploit:~
{
    "user": "neo4j",
    "pwd": "password",
    "database": "neo4j"
}

其中:

  • user 是你的Neo4j用户名
  • pwd 是你的Neo4j密码
  • database 是你的Neo4j数据库

YAML格式

程序从以下格式的YAML文件中读取查询。ad-queries.yaml 已作为示例提供,包含与Active Directory相关的查询。对于最短路径查询,msg_template不是必需的,但查询必须返回包含路径的变量

root@kitploit:~
queries:
- group: general
  desc: List all AddKeyCredentialLink privileges for owned principals
  cypher: |-
    MATCH (n {owned: true})-[r:AddKeyCredentialLink]->(m)
    RETURN n.name AS n_name, m.name AS m_name, labels(m) AS labels_m, labels(n) AS labels_n
    ORDER BY n.name
  msg_template: |-
    {{ n_name }} ({{ labels_n[0] }}/{{ labels_n[1] }}) has AddKeyCredentialLink over {{ m_name }} ({{
    labels_m[0] }}/{{ labels_m[1] }})

键/值对说明见下表:

键描述
group该查询所属的分组,分组由用户自定义,例如"general"
desc

Cypher中的动态参数(Jinja2 params.*)

程序使用Jinja2来渲染Cypher。使用set命令定义运行时参数,并在YAML中以{{ params.<键> }}引用它们。

CLI

root@kitploit:~
set <键> <值...> # 例如:set user [email protected]
unset <键> # 可选
show # 可选

YAML示例

root@kitploit:~
- group: user
  desc: List all privileges for this user
  cypher: |-
    MATCH (n:User)-[r]->(m)
    WHERE n.name =~ '((?i){{ params.user }})'
    RETURN n.name AS n_name, TYPE(r) AS rel_type, labels(m) AS labels_m, m.name AS m_name
    ORDER BY TYPE(r)
  msg_template: |-
    User {{ n_name }} has {{ rel_type }} over {{ m_name }} ({{ labels_m[0] }}/{{ labels_m[1] }})

常用参数模式

JSON格式

本仓库提供了一个query-importer.py脚本,用于从JSON文件自动将查询导入BloodHound CE UI。同时还提供了bh_query_converter.py,用于将面向终端应用程序的YAML文件转换为query-importer.py和BloodHound CE所期望的JSON格式。所需的JSON格式示例如下:

root@kitploit:~
{
  "queries": [
    {
      "name": "List all AddKeyCredentialLink privileges for owned principals",
      "description": "List all AddKeyCredentialLink privileges for owned principals - General",
      "query": "MATCH p=(n {owned: true})-[r:AddKeyCredentialLink]->(m)\nRETURN p\nORDER BY n.name"
    },
    {
      "name": "List all AddKeyCredentialLink privileges for Users, Domain Users, Authenticated Users, and Everyone groups",
      "description": "List all AddKeyCredentialLink privileges for Users, Domain Users, Authenticated Users, and Everyone groups - General",
      "query": "MATCH p=(n:Group)-[r:AddKeyCredentialLink]->(m)\nWHERE (n.objectid =~ \"(?i)S-1-5-21-.*-513\" OR n.objectid =~ \"(?i).*-S-1-5-11\" OR n.objectid =~ \"(?i).*-S-1-1-0\" OR n.objectid =~ \"(?i).*-S-1-5-32-545\")\nRETURN p\nORDER BY n.name"
    }
  ]
}

命令

完整命令菜单如下:

root@kitploit:~
Documented commands (use 'help -v' for verbose/'help <topic>' for details):
======================================================================================================
alias                 Manage aliases
clear                 Clear the terminal.
cls                   Clear the terminal.
edit                  Run a text editor and optionally open a file with it
export                Run a query and save its results
help                  List available commands or provide detailed help for a specific command
history               View, run, edit, save, or clear previously entered commands
list                  List queries by group.
macro                 Manage macros
report                Run multiple queries and generate a HTML report
run                   Execute a query
run_pyscript          Run a Python script file inside the console
run_script            Run commands in script file that is encoded as either ASCII or UTF-8 text
search                Full-text search through stored queries.
set                   Set a dynamic search parameter (set <TARGET> <VALUE...>)
shell                 Execute a command as if at the OS prompt
shortcuts             List available shortcuts
show                  Show dynamic search parameters
unset                 Unset a dynamic search parameter (unset <TARGET>)

Undocumented commands:
======================
exit  q  quit  stop

BloodHound CE 集成

custom searches

scripts/bloodhound-ce/query-importer.py

query-importer.py脚本将自动从JSON文件将查询导入BloodHound CE UI。同时还提供了bh_query_converter.py,用于将面向终端应用程序的YAML文件转换为query-importer.py和BloodHound CE所期望的JSON格式。

scripts/bloodhound-ce/bh_query_converter.py

此脚本将面向终端应用程序的YAML文件转换为JSON文件,以便通过query-importer.py脚本轻松导入BloodHound CE。ad-queries.json已作为输出文件的示例提供,可直接用于query-importer.py并将查询导入BloodHound CE。

scripts/bloodhound-ce/legacy-query-importer.py

此脚本将读取BloodHound Legacy的customqueries.json文件,并通过API凭据将所有查询导入新版本的BloodHound Community Edition。提供该脚本是为了确保你为BloodHound Legacy创建的查询仍能与Community Edition一起使用。

scripts/bloodhound-ce/purge-queries.py

此脚本将删除BloodHound中所有已保存的查询,以便重置以便将来导入。适用于BloodHound CE。

scripts/bloodhound-ce/add-owned.py

此脚本将从.txt文件中读取节点名称列表,并在数据库中将它们标记为owned或high-value。

用法

使用该脚本前,需准备两个文件:

  • 包含节点名称的逐行.txt文件,格式为BloodHound格式
    • 对用户:[email protected]
    • 对组:[email protected]
    • 对计算机:COMPUTER.DOMAIN.LOCAL
  • 包含Neo4j用户名、密码和数据库的json格式配置文件(示例如上)

脚本的选项如下:

root@kitploit:~
  -h, --help            显示此帮助信息并退出
  -c CONFIG, --config CONFIG
                        配置文件
  -l LIST, --list LIST  节点名称列表
  -o, --owned           将目标节点标记为owned
  -v, --high-value      将目标节点标记为high-value

至少需要指定-o或-v

BloodHound查询库集成

scripts/bhql/query-importer.py (BloodHound查询库导入器)

此脚本使用BloodHound CE API将SpecterOps BloodHoundQueryLibrary的已保存查询导入BloodHound Community Edition。

  • 支持从以下来源加载查询:
    • 本地的Queries.json / Queries.zip
    • 指向Queries.json / Queries.zip的URL
    • SpecterOps发布的官方最新版本工件
  • 可选地按platforms(不区分大小写)过滤查询
  • 将每个查询作为已保存查询提交给BloodHound CE(/api/v2/saved-queries)
  • 包含API速率限制的重试逻辑(HTTP 429),当存在Retry-After时使用

SpecterOps将Queries.json和Queries.zip作为发布工件发布(不存储在仓库中)。最新版本的下载URL为:

  • https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.json
  • https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.zip

用法(本地文件)

root@kitploit:~
python3 scripts/bhql/query-importer.py \
  --token-id "<TOKEN_ID>" \
  --token-key "<TOKEN_KEY>" \
  --queries-file "/path/to/Queries.json" \
  --base-url "http://127.0.0.1:8080"

用法(直接URL)

root@kitploit:~
python3 scripts/bhql/query-importer.py \
  --token-id "<TOKEN_ID>" \
  --token-key "<TOKEN_KEY>" \
  --queries-url "https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.json" \
  --base-url "http://127.0.0.1:8080"

用法(自动:最新版本)

root@kitploit:~
python3 scripts/bhql/query-importer.py \
  --token-id "<TOKEN_ID>" \
  --token-key "<TOKEN_KEY>" \
  --bhql-latest \
  --base-url "http://127.0.0.1:8080"

按平台过滤导入(示例)

root@kitploit:~
# 仅导入支持Active Directory的查询
python3 scripts/bhql/query-importer.py \
  --token-id "<TOKEN_ID>" \
  --token-key "<TOKEN_KEY>" \
  --bhql-latest \
  --platforms "Active Directory" \
  --base-url "http://127.0.0.1:8080"

# 导入多个平台的查询(任意匹配)
python3 scripts/bhql/query-importer.py \
  --token-id "<TOKEN_ID>" \
  --token-key "<TOKEN_KEY>" \
  --bhql-latest \
  --platforms "Active Directory" "Azure" \
  --base-url "http://127.0.0.1:8080"

提示:你可以在BloodHound CE中创建一个令牌,并在此处使用其Token ID/Key。如果希望在导入前“重新开始”,可以使用附带的清理脚本(参见scripts/bloodhound-ce/purge-queries.py)。

辅助脚本

scripts/helpers/format_yaml_queries.py

重新格式化现有的BloodHound查询YAML,以便:

  • 带点的RETURN列被别名化(foo.bar → foo_bar,labels(x) → labels_x[0])
  • 消息模板被重写以使用别名
  • Cypher被美化打印(每个主要子句一行)
  • 长字符串成为文字块标量(|)并绕排至100个字符

DPAT 集成

如果在原始的DPAT仓库中看不到cypherhound功能已被合并,请访问我的DPAT分支,其中包含该功能。

scripts/DPAT/parse-memberships.py

此脚本将解析终端应用程序的原始导出结果,具体是列出所有用户组成员关系的Cypher查询,以此作为该工具输出解析的示例。你需要将此导出结果作为参数传递给脚本,同时传递一个NTDS.dit文件和一个输出目录。然后,脚本将在输出目录中为每个组名生成.txt文件,条目格式为DOMAIN\USER,与DPAT兼容。接着,你将该目录通过-g命令行参数传递给DPAT,从而使操作者能够为域中每个组生成组统计信息。

使用该脚本前,需准备两个文件:

  1. 终端应用程序的原始导出结果,其中包含所有用户组成员关系
  2. 一个NTDS.dit文件,行格式如下:domain\user:RID:LMhash:NTLMhash:::

用法

root@kitploit:~
usage: parse-memberships.py [-m MEMBERSHIPS_FILE] [-d DOMAIN] [-n NTDS_FILE] [-o OUTPUT_DIR] [--netbios NETBIOS] [--encoding ENCODING]
                            [--debug] [--no-index] [-h]

从成员关系文件映射用户到组,并与NTDS转储匹配。

options:
  -m, --memberships-file MEMBERSHIPS_FILE
                        成员关系文件路径(BloodHound风格行)(默认:None)
  -d, --domain DOMAIN   FQDN域名(例如EXAMPLE.COM),用于成员关系正则匹配(默认:None)
  -n, --ntds-file NTDS_FILE
                        NTDS转储文件路径(DOMAIN\user:hash 或 pwdump风格)(默认:None)
  -o, --output-dir OUTPUT_DIR
                        写入每组输出文件的目录(默认:None)
  --netbios NETBIOS     NETBIOS/短域名,当NTDS行缺少域名(pwdump)时使用(默认:None)
  --encoding ENCODING   输入文件的编码(默认:cp1252)
  --debug               启用详细调试输出(默认:False)
  --no-index            按组名命名组文件,而不是编号文件(不安全字符将被替换)(默认:False)
  -h, --help            显示此帮助信息并退出

scripts/DPAT/parse-kerberoastable.py

此脚本将解析列出所有可Kerberoast用户的原始导出结果,将用户与NTDS.dit中的条目匹配,并输出一个包含来自转储的所有可Kerberoast用户哈希条目的文件。然后,你可以将该输出文件通过-kz标志传递给DPAT,以提供破解后的可Kerberoast账户统计信息。

用法

root@kitploit:~
usage: parse-kerberoastable.py [-k KERB_FILE] [-n NTDS_FILE] [-d DOMAIN] [-o OUTPUT] [--encoding ENCODING] [--debug] [-h]

将可Kerberoast用户名与NTDS.dit转储文件匹配

options:
  -k, --kerb-file KERB_FILE
                        Kerberoast输出文件路径(默认:None)
  -n, --ntds-file NTDS_FILE
                        NTDS转储文件路径(默认:None)
  -d, --domain DOMAIN   域名(例如EXAMPLE.COM),用于正则匹配(默认:None)
  -o, --output OUTPUT   写入匹配结果的路径(默认:None)
  --encoding ENCODING   读取输入文件时使用的文件编码(默认:cp1252)
  --debug               启用详细调试输出(默认:False)
  -h, --help            显示此帮助信息并退出

重要说明

  • 程序配置为使用默认的Neo4j数据库和URI
  • 构建于BloodHound 4.3.1及以上版本,某些边不适用于之前版本

关于赞助的说明

在2023年7月15日,我决定对项目做一些更改。在此日期之后,该项目将始终比赞助者使用的私有版本落后一个版本。请务必赞助我以获取最新查询、功能和错误修复。通过赞助这个层级,你还将获得我尚未公开的其他私有仓库的访问权限!

未来目标

  • 添加Azure边的查询
  • 在BloodHound发布更新时继续添加查询
  • 继续增加更多查询

问题与支持

如果你提交问题,请详细描述,并在可能的情况下提供输出结果(如果适用)。

下载工具
查询的描述
cypher查询本身,采用Neo4j格式
msg_template基于Cypher变量的终端输出Jinja2模板,请使用Neo4j变量的别名,避免Jinja尝试将其渲染为嵌套变量
参数键示例值在Cypher中的使用
params.user[email protected]= {{ params.user }}
params.user_regex(?i)john\.doe(@example\.com)?=~ '{{ params.user_regex }}'
params.groupDomain [email protected]= {{ params.group }}
params.prefixACME-STARTS WITH {{ params.prefix }}