
pyCobaltHound는 Cobalt Strike와 Bloodhound 간의 깊은 통합을 제공하는 것을 목표로 하는 Cobalt Strike용 Aggressor 스크립트 확장입니다.
pyCobaltHound는 Cobalt Strike와 Bloodhound 간의 깊은 통합을 목표로 하는 Cobalt Strike의 Aggressor 스크립트 확장입니다.
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는 Cobalt Strike 및 그 운영자와 인터페이스하기 위해 기본적인 Aggressor 함수만 사용하므로 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 클라이언트와 비동기적으로 이루어지므로 이 프로세스는 UI를 차단하지 않으므로 pyCobaltHound가 백그라운드에서 조사하는 동안 계속 작업할 수 있습니다.
pyCobaltHound는 여러 팀서버를 사용할 때 문제를 방지하기 위해 팀서버별로 별도의 캐시를 사용합니다.
때로는 특정 사용자(또는 전체 자격 증명 저장소)를 다시 조사하고 싶은 상황이 있습니다. 이는 BloodHound 데이터베이스에 새 데이터를 업로드한 경우일 수 있습니다.
pyCobaltHound는 이미 자격 증명 저장소의 모든 엔터티를 조사(따라서 캐시)했을 것이므로 운영자의 개입 없이는 이 새 데이터에 대해 평가하지 않습니다.
운영자가 캐시할 엔터티를 제어할 수 있는 두 가지 방법이 있습니다.
캐시에서 특정 엔터티(또는 여러 개)를 제거하려는 경우 자격 증명 뷰어(보기 > 자격 증명)에서 할 수 있습니다. 대상을 선택하고 pyCobaltHound 메뉴 항목 아래의 캐시에서 제거 옵션을 클릭하기만 하면 됩니다.

캐시에서 모든 엔터티를 제거하려는 경우 pyCobaltHound의 기본 메뉴(Cobalt Strike > pyCobaltHound > 캐시 지우기)에서 할 수 있습니다. 이는 전체 자격 증명 저장소를 재평가하려는 경우 가장 유용합니다.

캐시에서 대상을 제거한 후 수동으로 pyCobaltHound에 자격 증명 저장소의 내용을 다시 조사하도록 요청할 수 있습니다. 이는 위와 정확히 동일한 프로세스를 따릅니다.
pyCobaltHound에는 기존 비콘 세션과 상호 작용하는 기능이 포함되어 있습니다. 이 기능은 비콘 컨텍스트 메뉴에서 찾을 수 있습니다. 이러한 명령은 단일 비콘 또는 선택한 비콘에 대해 실행할 수 있습니다.

이 기능은 자격 증명이 아직 침해되지 않았지만 사실상 우리의 통제 하에 있는 사용자 및 컴퓨터(예: 세션 토큰 아래에서 실행되는 비콘이 있는 경우)를 다룰 때 특히 유용합니다.
소유됨으로 표시 기능(pyCobaltHound > 소유됨으로 표시)은 비콘(또는 비콘 모음)을 BloodHound 데이터베이스에서 소유됨으로 표시하는 데 사용할 수 있습니다.

이 대화상자는 운영자에게 다음 정보를 요청합니다:
pyCobaltHound는 비콘 세션이 로컬 관리자, SYSTEM 또는 다른 사용자의 높은 무결성 세션으로 실행 중인 경우에만 컴퓨터를 소유됨으로 표시합니다.조사 기능(pyCobaltHound > 소유됨으로 표시)은 비콘(또는 비콘 모음)과 관련된 사용자 및 호스트를 조사하는 데 사용할 수 있습니다.

이 대화상자는 운영자에게 다음 정보를 요청합니다:
pyCobaltHound는 비콘 세션이 로컬 관리자, SYSTEM 또는 다른 사용자의 높은 무결성 세션으로 실행 중인 경우에만 컴퓨터를 조사합니다.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 [account names here] 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는 다음의 리소스를 사용하거나 영감을 받았습니다: