
Collettore di dati di Active Directory basato su TUI che acquisisce oggetti LDAP, esegue la raccolta remota RPC/SMB/HTTP e genera dump compatibili con BloodHound CE per l'analisi dei percorsi di attacco.
Una TUI per la raccolta di Active Directory.
Gli obiettivi principali di questo progetto sono:
Flashingestor implementa 3 passaggi di base separati: LDAP Ingestion, Remote Collection e Conversion, contrariamente ad altri collector che eseguono i metodi specificati in un unico passo:
Ingest (Ctrl+l) - Raccoglie dati grezzi degli attributi degli oggetti da LDAP e li memorizza in output/ldap in file msgpack intermedi. Le query possono essere personalizzate in config.yaml.
Remote (Ctrl+r) - Legge questi file intermedi in memoria, calcola l'elenco dei computer da raccogliere ed esegue una serie di richieste RPC/SMB/HTTP per ottenere informazioni remote rilevanti per gli oggetti Computer ed EnterpriseCA, che vengono memorizzate in output/remote.
Convert (Ctrl+s) - Legge i file intermedi in memoria, unisce le informazioni delle fasi di ingestion e raccolta remota e genera un dump compatibile con Bloodhound in output/bloodhound – questo passaggio è completamente offline.
Per ulteriori dettagli tecnici e approfondimenti, consulta la nostra 📖 Wiki.
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# To build only:
$ go build ./cmd/flashingestor
# To install the executable to $GOBIN or $GOPATH/bin:
$ go install ./cmd/flashingestor
[!NOTE] Puoi anche utilizzare i binari precompilati dai Releases forniti.
Prima autenticati con uno dei seguenti:
# Anonymous
# [Requires dSHeuristics of 0000002 in the DirectoryServices object
# and can have limited visibility due to lack of Read ACEs]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# User + Password
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# User + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# User + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# User + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# User + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# User + Ticket
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
or
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
Quindi esegui i passaggi come desiderato. Per una raccolta solo LDAP (DCOnly con eccezione di GPOLocalGroup e CertServices), basta premere Ctrl+l, verificare che l'ingestion sia riuscita e poi premere Ctrl+s per generare il dump finale.
Si consiglia di specificare --dc e --dns per eseguire flashingestor. Se non specifichi --dc, flashingestor cercherà di trovarlo con ricerche SRV / A, che potrebbero ritardare il passo iniziale di Ingest.
Devi quindi specificare --dns se il tuo server DNS standard non è a conoscenza del dominio - quando è in uso DNS integrato AD, punta semplicemente --dns al DC che lo ospita. Inoltre, indipendentemente da --dc, se vuoi eseguire il passo Remote Collection e il tuo server DNS non è a conoscenza dei computer nel dominio, allora devi specificare --dns per le ricerche.
[!TIP] In ambienti con più DC, puoi anche utilizzare l'utility
dcprobeper misurare la latenza verso tutti i DC e trovare un buon candidato per l'ingestion:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
Se il file di configurazione non è presente nella directory corrente come config.yaml o nel percorso fornito tramite --config, verranno assunte le opzioni predefinite (le stesse del config.yaml fornito) – sono hardcoded in config/fallback.go. Per maggiori informazioni, leggi File di Configurazione.
Considera di utilizzare --log per specificare un file di output per i log (nel caso dovessi rivederli dopo aver chiuso la TUI) e -vv per vedere i messaggi di log di debug, poiché possono aiutare a risolvere possibili problemi. Per un riferimento completo degli argomenti da riga di comando, leggi Argomenti da Riga di Comando.
[!NOTE] Le query predefinite nel
config.yamlfornito sono progettate tenendo conto delle informazioni necessarie per la conversione in Bloodhound. Puoi scegliere di personalizzare query o attributi inconfig.yaml, ma è meglio cercare di non rimuovere attributi necessari e di non modificare il significato dei filtri di ricerca.
Se recurse_trusts è impostato su true, verranno ingeriti ricorsivamente tutti i domini attendibili trovati con le credenziali iniziali fornite per l'ingestion.
Se search_forest è impostato su true, verranno ingeriti i domini che fanno parte della stessa foresta del dominio iniziale dalla partizione Configuration – non verranno emesse ulteriori query, poiché questo è già parte del piano di ingestion predefinito. Entrambe le opzioni possono essere impostate contemporaneamente e flashingestor ingerirà ogni dominio trovato una sola volta (tramite un trust o tramite la foresta corrente).
Se recurse_trusts è abilitato e recurse_feasible_only è anch'esso impostato su true, proverà ad ingerire un dominio attendibile solo se il trust è:
Ciò significa che i trust solo outbound non verranno attraversati e, a parte il primo livello di trust, i percorsi di ingestion si fermano ai trust non transitivi – se B si fida di A non transitivamente, allora A può ancora autenticarsi in B; ma se anche C si fida di B non transitivamente, A non può autenticarsi in C.
[!IMPORTANT]
recurse_trusts/search_forestsi autenticheranno a LDAP nei domini scoperti con le credenziali specificate dal dominio sorgente solo quando le credenziali fornite sono unapassword in chiaroo unNT hash; l'uso di un TGT per emettere un ticket di referral per questo scopo è teoricamente possibile ma non ancora implementato nella libreriaadauth.
Le catene di middleware da Macmod/ldapx possono anche essere utilizzate direttamente con flashingestor per offuscare le query LDAP nel passo di ingestion utilizzando le opzioni -f (--ldapx-filter), -a (--ldapx-attrs) e -b (--ldapx-basedn). Con -vv, le query grezze prima e dopo l'offuscamento verranno mostrate anche nei log.
Se intendi eseguire il passo di raccolta remota, controlla i methods abilitati – questi corrispondono approssimativamente ai metodi offerti da SharpHound e possono essere utilizzati per attivare raccolte specifiche tramite RPC o HTTP.
Gli argomenti --remote-* possono essere utilizzati per specificare un insieme separato di credenziali per la raccolta remota. Se non specificati, flashingestor proverà a utilizzare le stesse credenziali per l'utente fornito negli argomenti standard di ingestion (--user, --password, ecc.).
Un amministratore locale può anche essere utilizzato per la raccolta remota specificando ad esempio --remote-user Administrator@., ma l'efficacia di questo approccio dipenderà dal fatto che l'account sia l'amministratore integrato o meno e dai valori delle chiavi di registro FilterAdministratorToken / LocalAccountTokenFilterPolicy. Per maggiori dettagli su questo comportamento, consulta Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy
Le opzioni compress_output e cleanup_after_compression possono aiutare a mantenere basso l'uso del disco. Dopo aver caricato il dump finale in Bloodhound, puoi eliminare in sicurezza i file in output/ldap e output/remote manualmente se non ti servono, ma questi file possono essere conservati per consultare informazioni importanti senza dover rieseguire la raccolta completa.
[!TIP] Lo scopo principale dei file
msgpacknelle cartelleoutput/ldapeoutput/remoteè quello di fungere da formato intermedio per separare le responsabilità dell'intero processo, ma questi file possono anche essere utilizzati come fonte di informazioni convertendoli in JSON – in questo modo non devi cercare attributi grezzi degli oggetti o risultati di raccolta remota:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.jsonUn ottimo modo per ispezionare questi file è utilizzare JQ/FX o il tuo linguaggio di programmazione preferito 🙂
I contributi sono benvenuti aprendo una segnalazione o inviando una pull request.
Un grande ringraziamento a SpecterOps per BloodHound, SharpHound / SharpHoundCommon e a dirkjanm per BloodHound.py, che sono stati i principali riferimenti per questo strumento.
Grazie a rtpt-erikgeiser & RedTeamPentesting per adauth e a p0dalirius per winacl, entrambe librerie molto utili.
Grazie a oiweiwei per go-msrpc, poiché la sua libreria ha reso possibile l'implementazione di metodi di raccolta remota basati su RPC.
Protected Users o quando l'autenticazione NTLM è bloccata tramite impostazioni di sicurezza) o con certificati (che usa PKINIT sotto il cofano), la raccolta remota non proverà ad autenticarsi ai computer di domini diversi da quello a cui appartiene l'utente. Questo vale anche per il metodo GPOLocalGroup, che in quei casi non proverà a leggere file GPO da DC di altri domini, anche se nei dati ingeriti sono presenti più domini.SmbInfo per il tipo Computer è ancora un'implementazione di base (solo controlli del registro).HttpEnrollmentEndpoints funziona solo con un nome utente/password forniti.AllowedToDelegateTo / ServicePrincipalNames è ancora un'implementazione di base.Quasi tutte le proprietà implementate in SharpHound sono supportate, ma ci sono molte differenze architetturali tra questo strumento e SharpHound, quindi non aspettarti che l'output corrisponda esattamente all'implementazione ufficiale (ad eccezione di eventuali bug). Differenze chiave possono emergere specialmente per le implementazioni più complesse, come le raccolte remote tramite RPC e le raccolte relative all'abuso di CA/certificati.
I timeout sono ancora per lo più statici – l'implementazione di SharpHound utilizza un timeout adattivo (piuttosto intelligente!), ma non ho ancora avuto tempo di studiarlo. Se necessario, personalizza i timeout con le opzioni --timeout, --computer-timeout e --method-timeout (config/config.go specifica altri timeout specifici per operazione).
I test attualmente non sono implementati e ho testato manualmente solo un piccolo sottoinsieme di funzionalità.
The MIT License (MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.