Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
cypherhound — 템플릿 기반 BloodHound 터미널 동반 도구 | Kitploit
도구/GitHubGitHub/fin3ss3g0d/cypherhound
ReconnaissanceInformation GatheringPenetration TestingUtilities & Frameworks
GitHubfin3ss3g0d/cypherhound

cypherhound

템플릿 기반 BloodHound 터미널 동반 도구

저장소 보기
4543617개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CypherHound

logo

BloodHound 데이터 세트를 위한 Neo4j Cypher 쿼리와 이를 BloodHound CE로 자동 가져오기 위한 스크립트를 포함하는 Python3 터미널 애플리케이션입니다.

출력 샘플

터미널

demo

HTML 보고서

report summary

HTML 보고서 (계속)

details sample

왜?

BloodHound는 모든 침투 테스터에게 필수적인 도구입니다. 하지만 설계상 몇 가지 부정적인 부작용이 있습니다. 제가 경험한 가장 큰 문제점과 이 도구가 해결하려는 부분을 설명하겠습니다:

  1. 내 도구는 목록으로 생각한다 - 내 도구가 내보낸 JSON 그래프를 파싱할 때까지, 다른 도구로 실제 공격을 수행하기 위해 그래프 결과를 줄 단위 .txt 파일로 얻어야 한다.
  2. 그래프 결과 복사/붙여넣기 - 첫 번째 문제와 연결되지만, 이걸 굳이 설명해야 할까?
  3. 그래프가 너무 커서 그릴 수 없는 경우 - 대규모 AD 환경, 동일한 그래프에 여러 최단 경로가 그려지는 경우 등. 어떤 그래프에 포함된 정보는 공격자로서의 목표를 달성하는 데 도움이 되며, 모든 데이터를 효율적으로 볼 수 있어야 한다.
  4. 사용자 지정 Cypher를 수동으로 실행하는 것은 시간이 많이 걸린다 - 자동화하자 :)

이 도구는 레드 팀과 블루 팀 모두에게 상당한 가치를 제공할 수 있습니다.

기능

CypherHound로 BloodHound 데이터를 다시 제어하세요!

  • YAML 파일에서 Cypher 템플릿 읽기
    • 사용자 입력(사용자, 그룹, 컴퓨터별)에 기반한 검색을 위한 Cypher 설정
    • 사용자 정의 정규식 Cypher
  • 모든 결과의 사용자 정의 내보내기
    • grep/cut/awk 친화적인 형식의 예제 제공
    • 모든 Cypher 조합을 현대적이고 세련된 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: 소유한 주체에 대한 모든 AddKeyCredentialLink 권한 나열
  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] }})이(가) {{ m_name }} ({{ labels_m[0] }}/{{ labels_m[1] }})에 대해 AddKeyCredentialLink 권한을 가짐

키/값 쌍에 대한 표 설명은 아래와 같습니다:

키설명
group이 쿼리가 속한 그룹, 그룹은 사용자 정의입니다 (예: "general")

Cypher의 동적 매개변수 (Jinja2 params.*)

프로그램은 Jinja2를 사용하여 Cypher를 렌더링합니다. set 명령으로 런타임 매개변수를 정의하고 YAML에서 {{ params.<key> }}로 참조하세요.

CLI

root@kitploit:~
set <key> <value...> # 예: set user [email protected]
unset <key> # 선택 사항
show # 선택 사항

YAML 예제

root@kitploit:~
- group: user
  desc: 이 사용자에 대한 모든 권한 나열
  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: |-
    사용자 {{ n_name }}이(가) {{ m_name }} ({{ labels_m[0] }}/{{ labels_m[1] }})에 대해 {{ rel_type }} 권한을 가짐

일반적인 매개변수 패턴

JSON 형식

이 리포지토리는 JSON 파일에서 BloodHound CE UI로 쿼리를 자동 가져오는 query-importer.py 스크립트를 제공합니다. 또한 터미널 애플리케이션용 YAML 파일을 query-importer.py 및 BloodHound CE가 예상하는 JSON 형식으로 변환하는 bh_query_converter.py도 제공됩니다. 필요한 JSON 형식의 예시는 아래와 같습니다:

root@kitploit:~
{
  "queries": [
    {
      "name": "소유한 주체에 대한 모든 AddKeyCredentialLink 권한 나열",
      "description": "소유한 주체에 대한 모든 AddKeyCredentialLink 권한 나열 - 일반",
      "query": "MATCH p=(n {owned: true})-[r:AddKeyCredentialLink]->(m)\nRETURN p\nORDER BY n.name"
    },
    {
      "name": "Users, Domain Users, Authenticated Users, Everyone 그룹에 대한 모든 AddKeyCredentialLink 권한 나열",
      "description": "Users, Domain Users, Authenticated Users, Everyone 그룹에 대한 모든 AddKeyCredentialLink 권한 나열 - 일반",
      "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:~
문서화된 명령어 (자세한 내용은 'help -v', 특정 주제는 'help <topic>' 사용):
======================================================================================================
alias                 별칭 관리
clear                 터미널 지우기
cls                   터미널 지우기
edit                  텍스트 편집기를 실행하고 선택적으로 파일 열기
export                쿼리를 실행하고 결과 저장
help                  사용 가능한 명령어 목록 표시 또는 특정 명령어에 대한 자세한 도움말 제공
history               이전에 입력한 명령어 보기, 실행, 편집, 저장 또는 지우기
list                  그룹별로 쿼리 나열
macro                 매크로 관리
report                여러 쿼리를 실행하고 HTML 보고서 생성
run                   쿼리 실행
run_pyscript          콘솔 내에서 Python 스크립트 파일 실행
run_script            ASCII 또는 UTF-8 텍스트로 인코딩된 스크립트 파일의 명령어 실행
search                저장된 쿼리 전체 텍스트 검색
set                   동적 검색 매개변수 설정 (set <TARGET> <VALUE...>)
shell                 OS 프롬프트에서 명령어 실행
shortcuts             사용 가능한 바로가기 목록 표시
show                  동적 검색 매개변수 표시
unset                 동적 검색 매개변수 해제 (unset <TARGET>)

문서화되지 않은 명령어:
======================
exit  q  quit  stop

BloodHound CE 통합

custom searches

scripts/bloodhound-ce/query-importer.py

query-importer.py 스크립트는 JSON 파일에서 BloodHound CE UI로 쿼리를 자동 가져옵니다. 또한 터미널 애플리케이션용 YAML 파일을 query-importer.py 및 BloodHound CE가 예상하는 JSON 형식으로 변환하는 bh_query_converter.py도 제공됩니다.

scripts/bloodhound-ce/bh_query_converter.py

이 스크립트는 터미널 애플리케이션용 YAML을 query-importer.py 스크립트를 통해 BloodHound CE로 쉽게 가져올 수 있는 JSON 파일로 변환합니다. 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)로 표시합니다.

사용법

스크립트를 사용하려면 두 개의 파일을 준비해야 합니다:

  • BloodHound 형식의 노드 이름을 줄 단위로 포함하는 .txt 파일
    • 사용자: [email protected]
    • 그룹: [email protected]
    • 컴퓨터: COMPUTER.DOMAIN.LOCAL
  • Neo4j 사용자 이름, 비밀번호 및 데이터베이스를 포함하는 json 형식의 구성 파일 (위 예시 참조)

스크립트에는 다음 옵션이 있습니다:

root@kitploit:~
  -h, --help            이 도움말 메시지를 표시하고 종료
  -c CONFIG, --config CONFIG
                        구성 파일
  -l LIST, --list LIST  노드 이름 목록
  -o, --owned           대상 노드를 소유됨으로 설정
  -v, --high-value      대상 노드를 고가치로 설정

-o 또는 -v 중 하나 이상을 지정해야 합니다.

BloodHound Query Library 통합

scripts/bhql/query-importer.py (BloodHound Query Library 임포터)

이 스크립트는 SpecterOps BloodHoundQueryLibrary 저장된 쿼리를 BloodHound CE API를 사용하여 BloodHound Community Edition으로 가져옵니다.

  • 다음에서 쿼리 로드 지원:
    • 로컬 Queries.json / Queries.zip 파일
    • Queries.json / Queries.zip URL
    • SpecterOps에서 게시한 공식 최신 릴리스 아티팩트
  • 선택적으로 platforms로 쿼리 필터링 (대소문자 구분 안 함)
  • 각 쿼리를 저장된 쿼리(/api/v2/saved-queries)로 BloodHound CE에 제출
  • Retry-After가 있는 경우 HTTP 429 속도 제한에 대한 재시도 로직 포함

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 통합

cypherhound 기능이 원본 DPAT 리포지토리에 병합되지 않은 경우, 해당 기능이 있는 제 DPAT 포크에 접근하세요.

scripts/DPAT/parse-memberships.py

이 스크립트는 터미널 애플리케이션의 원시 내보내기(특히 모든 사용자 그룹 멤버십을 나열하는 Cypher)를 파싱하여 이 도구의 출력을 파싱하는 방법의 예를 보여줍니다. 이 내보내기를 스크립트에 매개변수로 전달하고, NTDS.dit 파일 및 출력 디렉토리를 함께 전달합니다. 그러면 각 그룹 이름에 대해 DOMAIN\USER 형식의 항목이 포함된 .txt 파일을 출력 디렉토리에 생성하며, 이는 DPAT와 호환됩니다. 그런 다음 이 디렉토리를 DPAT에 -g 명령줄 인수로 전달하여 운영자가 도메인의 모든 그룹에 대한 그룹별 통계를 생성할 수 있습니다.

스크립트를 사용하려면 두 개의 파일을 준비해야 합니다:

  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     NTDS 줄에 도메인이 없을 때(pwdump) 접두사로 사용할 NETBIOS/짧은 도메인 (기본값: None)
  --encoding ENCODING   입력 파일 인코딩 (기본값: cp1252)
  --debug               자세한 디버그 출력 활성화 (기본값: False)
  --no-index            번호가 매겨진 파일 대신 그룹 이름으로 그룹 파일 이름 지정 (안전하지 않은 문자 대체) (기본값: False)
  -h, --help            이 도움말 메시지를 표시하고 종료

scripts/DPAT/parse-kerberoastable.py

이 스크립트는 모든 Kerberoastable 사용자를 나열하는 원시 내보내기를 파싱하고, 사용자를 NTDS.dit의 항목과 일치시킨 후, 덤프에서 Kerberoastable 사용자 해시 항목을 모두 포함하는 출력 파일을 생성합니다. 그런 다음 이 출력 파일을 DPAT에 -kz 플래그와 함께 전달하여 크랙된 Kerberoastable 계정 통계를 제공합니다.

사용법

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

Kerberoastable 사용자 이름을 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일부로 프로젝트에 몇 가지 변경 사항을 적용하기로 결정했습니다. 이 날짜 이후 이 프로젝트는 항상 후원자용 비공개 버전보다 한 버전 뒤에 있게 됩니다. 최신 Cypher, 기능 및 버그 수정에 접근하려면 저를 후원해 주세요. 이 등급으로 후원하시면 아직 공개하지 않은 추가 비공개 리포지토리에도 접근할 수 있습니다!

향후 목표

  • Azure 엣지에 대한 Cypher 추가
  • BloodHound가 업데이트를 릴리스할 때 Cypher 계속 추가
  • Cypher 계속 추가

이슈 및 지원

이슈를 열 때는 자세히 설명해 주시고 가능하다면 출력을 제공해 주세요.

도구 다운로드
desc쿼리에 대한 설명
cypherNeo4j 형식의 쿼리 자체
msg_templateCypher 변수 기반 터미널 출력을 위한 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 }}