
Post-Exploitation EVTX-Analyzer für BloodHound-Mapping
Post-Exploitation EVTX-Analyzer für BloodHound-Mapping
LogHound sammelt und analysiert Windows-Sicherheitsereignisprotokolle (.evtx), um Authentifizierungsereignisse, Sitzungsdaten und Anmeldemetadaten zu extrahieren – für die Aufnahme in BloodHound und für tiefere gegnerische Telemetrie.
LogHound wurde entwickelt, um ein spezifisches Problem für Red Teams und Netzwerk-Penetrationstester zu lösen: wie man effizient Ziele lateraler Bewegung verfolgt, aktive Benutzersitzungen entschlüsselt und eindeutigen Maschinenbesitz feststellt, ohne die operative Sicherheit (OpSec) zu gefährden.
Ereignisprotokolldateien (Security.evtx) auf Active Directory-Domänencontrollern können mehrere Gigabyte groß sein. Herkömmliche Lademethoden verbrauchen oft den gesamten Systemspeicher oder stürzen ab und hinterlassen laute Artefakte. LogHound begegnet diesem Problem durch ein chunkbasiertes Streaming-Paradigma auf Basis des robusten Impacket-Frameworks.
Es kartiert Netzwerkstrukturen, ermittelt, wer eine Maschine tatsächlich „besitzt" (basierend auf der Anmeldehäufigkeit), berechnet präzise Arbeitszeiten, um außerdienstliche Aktivitäten (Night Owl) zu identifizieren, und speist diese Informationen nahtlos in BloodHound CE (v5+) ein.
LogHound benötigt Python 3 und Impacket. Es wird dringend empfohlen, eine virtuelle Umgebung zu verwenden.
# 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
Die CLI von LogHound interagiert identisch zu den standardmäßigen Impacket-Modulen (wie secretsdump.py) und erfordert, dass Sie einen expliziten Betriebsmodus angeben (--local oder --remote).
python loghound.py [[domain/]username[:password]@]<targetName or address> [options]
--local EVTX_FILE: Analysiert eine .evtx-Datei, die sich bereits auf Ihrem lokalen Rechner befindet.--remote: Lädt Security.evtx vom entfernten Zielsystem herunter, wobei die angegebenen Anmeldeinformationen verwendet werden.-hashes LMHASH:NTHASH: NTLM-Hashes für Pass-The-Hash-Authentifizierung verwenden.-k: Kerberos-Authentifizierung verwenden. Bezieht Anmeldeinformationen aus einer .ccache-Datei, die durch die Umgebungsvariable KRB5CCNAME angegeben wird.-aesKey hex_key: Einen bestimmten AES-Schlüssel (128 oder 256 Bit) für Kerberos verwenden.-no-pass: Nicht interaktiv nach einem Passwort fragen.-keytab KEYTAB_FILE: Eine Kerberos-Keytab-Datei zur Authentifizierung verwenden.-dc-ip IP: Explizite IP-Adresse des Domänencontrollers.-target-ip IP: Explizite IP-Adresse des Zielsystems (umgeht Fehler bei der NetBIOS-Namensauflösung).-format {json,csv,md,all}: Bestimmt das textbasierte Ausgabeformat. Hinweis: Ein interaktiver HTML-Bericht und die BloodHound-JSON-Dateien werden immer generiert. Standard ist json.-outputfile BASENAME: Namenspräfix für die generierten Ausgabeberichte in den Unterverzeichnissen.-threads N: Anzahl der parallelen Parser-Threads (Standard: 4).-chunk-size N: Anzahl der Protokolleinträge pro Parsing-Chunk. Niedrigere Werte reduzieren den RAM-Overhead; höhere Werte analysieren etwas schneller (Standard: 1000).
LogHound verwendet eine stark entkoppelte, speichereffiziente Analyse-Pipeline:
core/collector.py): Stellt eine SMB-Verbindung zum Ziel her und exportiert dann das Sicherheitsereignisprotokoll über WMI mittels wevtutil epl Security in eine temporäre Datei auf dem Ziel. Die exportierte Datei wird dann über SMB in loot/YYYY-MM-DD_<target>_Security.evtx heruntergeladen, um Überschreibungen zu vermeiden.core/parser.py): Ein threadbasierter Chunk-Parser streamt über das rohe .evtx-Binärformat und gibt kontinuierlich geparste Ereignisse in einen temporären JSON-Line-Puffer (jsonl/loghound_dump.jsonl) aus. Bei Unterbrechung kann er an genauen Prüfpunkten fortgesetzt werden.core/analyzer.py): Iteriert zeilenweise über den .jsonl-Stream, um einen niedrigen RAM-Fußabdruck zu erhalten. Es berechnet Zwischenzustands-Wörterbücher (Sitzungsverfolgung, Besitzbewertung, Logikverfolgung).core/exporter.py & core/exporter_bloodhound.py): Schreibt den Analyse-RAM-Zustand dynamisch in die endgültigen Ausgabeformate und .Für tiefgehende Architekturlogiken und zuvor behandelte Aufnahmefehler lesen Sie bitte die interne Dokumentation unter ARCHITECTURE.md.
LogHound filtert nativ nach sechs expliziten Windows-Sicherheitsereignis-IDs: 4624, 4634, 4648, 4768, 4769, 4776.
Mit diesen Ereignissen erweitert LogHound BloodHound CE, indem die folgenden benutzerdefinierten Attribute direkt an generierte Benutzer-Knoten über den Properties-Block gebunden werden:
ObjectIdentifier-Zuordnungen perfekt mit vorhandenen SharpHound-Imports übereinstimmen. AD-Domänenbenutzer erhalten ihre native Windows-SID (S-1-5-21-...). Um ein Zerstören von BloodHound-Knoten zu verhindern, behalten lokale Maschinenkonten genau den Fallback-Standard USER@HOSTNAME bei.computers.json verwendet die exakte native SessionAPIResult-Datenstruktur, um echte „HasSession"-Kanten zwischen Maschinen und Benutzern zu zeichnen.Die Analyse-Engine berechnet die betrieblichen Arbeitszeiten auf der Grundlage verfolgter Anmelde-/Abmeldeereignisse und lässt Anomalien (wie Sitzungen, die sich über mehrere Tage erstrecken) außer Acht.
Die Analyse bestimmt den expliziten Besitzer einer Workstation oder IP-Adresse, indem sie die häufigsten interaktiven Anmeldungen zählt. Dies bindet einen primären Owner an den Ursprungsknoten sowie ein Array sekundärer Other Users.
Diese Software wird ausschließlich zu Bildungszwecken, für autorisierte Penetrationstests und forensische Untersuchungen bereitgestellt. Verwenden Sie sie nicht gegen Netzwerke, für die Sie keine ausdrückliche Betriebserlaubnis haben.
Dieses Projekt ist unter der Apache License 2.0 lizenziert – siehe LICENSE-Datei.
html/json/| Eigenschaftsname | Typ | Metrikbeschreibung |
|---|
loghound_avg_start_time | String | Berechnet die durchschnittliche erste Anmeldung (00:00 HH:MM) über alle beobachteten gültigen Tage des Benutzers. |
loghound_avg_end_time | String | Berechnet die durchschnittliche letzte Aktivität (Abmeldung oder letzter Zugriff) pro Tag. |
loghound_active_days | Integer | Gesamtzahl der validierten Tage (mit mindestens einer ordnungsgemäßen Sitzung), die zur Berechnung der Durchschnittszeit-Arrays verwendet wurden. |
loghound_outside_hours | Boolean | Wahr/Falsch. Identifiziert spezifisch einen Night Owl. Wertet als True aus, wenn das berechnete aktive Start-Ende-Fenster des Benutzers den Nachtbereich von 22:00 bis 06:00 überschneidet. |
Avg Hours per Day | Float | Wird intern als exakte Zeitdifferenz zwischen der average start time und der average end time des Benutzers berechnet. (Wird in Text-/HTML-Berichten angezeigt). |