
BloodHound 매핑을 위한 사후 침투 EVTX 분석기
BloodHound 매핑을 위한 포스트 익스플로잇 EVTX 분석기
LogHound는 Windows 보안 이벤트 로그(.evtx)를 수집하고 파싱하여 인증 이벤트, 세션 데이터 및 로그온 메타데이터를 추출하고, 이를 BloodHound에 주입하며 더 깊은 공격자 원격 측정(adversarial telemetry)을 제공합니다.
LogHound는 레드 팀과 네트워크 침투 테스터를 위한 특정 문제를 해결하기 위해 제작되었습니다: 운영 보안(OpSec)을 손상시키지 않으면서 측면 이동(lateral movement) 대상을 효율적으로 추적하고, 활성 사용자 세션을 해독하며, 확정적인 머신 소유권을 확립하는 방법입니다.
Active Directory 도메인 컨트롤러의 이벤트 로그 파일(Security.evtx)은 수 기가바이트에 달하는 거대한 파일입니다. 기존의 로딩 기법은 종종 시스템 메모리를 고갈시키거나 크래시를 일으켜 눈에 띄는 아티팩트를 남깁니다. LogHound는 강력한 Impacket 프레임워크 위에 청크 기반 스트리밍 패러다임을 활용하여 이 문제를 해결합니다.
네트워크 구조를 매핑하고, 로그인 빈도를 기반으로 실제로 머신을 "소유"한 사용자를 식별하며, 정확한 작업 시간을 계산하여 근무 외 시간(올빼미형·Night Owl) 운영을 식별하고, 이 정보를 BloodHound CE(v5+)에 원활하게 공급합니다.
LogHound는 Python 3과 Impacket에 의존합니다. 가상 환경을 사용하는 것이 좋습니다.
# 1. Clone the repository
git clone https://github.com/LogHound/LogHound.git
cd LogHound
# 2. (Optional but Recommended) Create a Python virtual environment
python3 -m venv venv
source venv/bin/activate
# 3. Install the required dependencies
pip install -r requirements.txt
LogHound의 CLI는 표준 Impacket 모듈(예: secretsdump.py)과 동일하게 동작하며, 명시적인 운영 모드(--local 또는 --remote)를 지정해야 합니다.
python loghound.py [[domain/]username[:password]@]<targetName or address> [options]
--local EVTX_FILE: 로컬 머신에 이미 존재하는 .evtx 파일을 파싱합니다.--remote: 제공된 자격 증명을 사용하여 원격 대상 시스템에서 Security.evtx를 가져옵니다.-hashes LMHASH:NTHASH: 패스더해시(Pass-The-Hash) 인증에 NTLM 해시를 사용합니다.-k: Kerberos 인증을 사용합니다. KRB5CCNAME 환경 변수로 지정된 .ccache 파일에서 자격 증명을 가져옵니다.-aesKey hex_key: Kerberos에 특정 AES 키(128 또는 256비트)를 사용합니다.-no-pass: 비밀번호를 대화형으로 묻지 않습니다.-keytab KEYTAB_FILE: 인증에 Kerberos keytab 파일을 사용합니다.-dc-ip IP: 도메인 컨트롤러의 명시적 IP 주소.-target-ip IP: 대상 머신의 명시적 IP 주소(NetBIOS 이름 확인 실패를 우회).-format {json,csv,md,all}: 텍스트 기반 출력 형식을 지정합니다. 참고: 대화형 HTML 리포트와 BloodHound JSON 파일은 항상 생성됩니다. 기본값은 json입니다.-outputfile BASENAME: 하위 디렉터리에 생성되는 출력 리포트의 이름 접두사.-threads N: 병렬로 실행할 파서 스레드 수(기본값: 4).-chunk-size N: 파싱 청크당 로그 레코드 수. 값이 낮을수록 RAM 오버헤드가 줄어들고, 높을수록 약간 더 빠르게 파싱됩니다(기본값: 1000).
LogHound는 고도로 분리된(decoupled) 메모리 효율적인 분석 파이프라인을 사용합니다:
core/collector.py): SMB를 통해 대상에 연결한 다음 WMI를 통해 wevtutil epl Security를 실행하여 보안 이벤트 로그를 대상의 임시 파일로 내보냅니다. 그런 다음 내보낸 파일을 SMB를 통해 loot/YYYY-MM-DD_<target>_Security.evtx로 다운로드하여 덮어쓰기를 방지합니다.core/parser.py): 스레드 기반 청크 파서가 원시 .evtx 바이너리를 스트리밍하며 파싱된 이벤트를 임시 JSON Line 버퍼(jsonl/loghound_dump.jsonl)로 지속적으로 출력합니다. 중단된 경우 정확한 체크포인트에서 재개할 수 있습니다.core/analyzer.py): 낮은 RAM 사용량을 유지하기 위해 .jsonl 스트림을 줄 단위로 반복 처리합니다. 중간 상태 사전(세션 추적, 소유권 점수, 로직 추적)을 계산합니다.core/exporter.py 및 core/exporter_bloodhound.py): 분석 RAM 상태를 최종 html/ 및 json/ 내보내기 형식으로 동적으로 플러시합니다.깊은 아키텍처 로직과 이전에 해결된 수집 오류에 대해서는 ARCHITECTURE.md의 내부 문서를 참조하십시오.
LogHound는 6개의 명시적 Windows 보안 이벤트 ID(4624, 4634, 4648, 4768, 4769, 4776)를 기본적으로 필터링합니다.
이러한 이벤트를 사용하여 LogHound는 다음 사용자 정의 속성을 Properties 블록을 통해 생성된 User 노드에 직접 연결하여 BloodHound CE를 확장합니다:
ObjectIdentifier 매핑이 기존 SharpHound 수집 데이터와 완벽하게 일치하도록 보장합니다. AD 도메인 사용자는 네이티브 Windows SID(S-1-5-21-...)를 받습니다. BloodHound 노드 분리를 방지하기 위해 로컬 머신 계정은 폴백 표준인 USER@HOSTNAME을 정확하게 유지합니다.computers.json은 정확한 네이티브 SessionAPIResult 데이터 구조를 사용하여 머신과 사용자 사이에 실제 "HasSession" 엣지를 그립니다.분석 엔진은 추적된 로그온/로그오프 이벤트를 기반으로 작업 운영 시간을 계산하며, 이상치(여러 날에 걸친 세션 등)는 제외합니다.
분석은 가장 빈번한 대화형 로그온을 계산하여 모든 워크스테이션 또는 IP 주소의 명시적 소유자를 결정합니다. 이는 보조 Other Users 배열과 함께 기본 Owner를 원본 노드에 바인딩합니다.
이 소프트웨어는 교육, 승인된 침투 테스트 및 포렌식 조사 목적으로만 제공됩니다. 명시적 운영 권한이 없는 네트워크에 대해 이 소프트웨어를 사용하지 마십시오.
이 프로젝트는 Apache License 2.0에 따라 라이선스가 부여됩니다 - LICENSE 파일을 참조하십시오.
| 속성 이름 | 유형 | 메트릭 설명 |
|---|
loghound_avg_start_time | String | 사용자에 대해 관찰된 모든 유효한 날짜에 기록된 평균 첫 로그온(00:00 HH:MM)을 계산합니다. |
loghound_avg_end_time | String | 매일 기록된 평균 마지막 활동(로그오프 또는 마지막 접촉)을 계산합니다. |
loghound_active_days | Integer | 평균 시간 배열을 계산하는 데 사용된 검증된 날짜(최소한 하나의 유효한 세션이 있는 날)의 총 개수. |
loghound_outside_hours | Boolean | True/False. 올빼미형(Night Owl) 사용자를 구체적으로 식별합니다. 사용자의 계산된 활동 시작-종료 창이 22:00~06:00 야간 범위와 겹치면 True로 평가됩니다. |
Avg Hours per Day | Float | 사용자의 평균 시작 시간과 평균 종료 시간 사이의 정확한 시간 차이로 내부 계산됩니다. (텍스트/HTML 리포트에 표시). |