
Aggiornatore automatico del grafico BloodHound per i blue team. Arricchisce i percorsi di attacco AD con dati in tempo reale su sessioni, gruppi e CVE provenienti da SIEM, consentendo monitoraggio e avvisi continui.

A partire dalla versione 7.0 di BloodHound CE, il database predefinito è stato cambiato in Postgres. Questa versione di FalconHound si basa ancora su Neo4j come database predefinito. Se desideri continuare a utilizzare FalconHound mentre esegui l'ultima versione di BloodHound, aggiungi la seguente riga al tuo file bloodhound.config.json.```json "graph_driver": "neo4j",
Il team di BloodHound continuerà a supportare Neo4j per almeno un anno. In questo lasso di tempo, si spera che ci sia un grande miglioramento dell'API o che abbiamo implementato il supporto PGSQL per FalconHound.
---
FalconHound è un multi-strumento per blue team. Ti consente di utilizzare e potenziare le capacità di BloodHound in modo più automatizzato. È progettato per essere utilizzato insieme a un SIEM o ad altri strumenti di aggregazione dei log.
Uno degli aspetti impegnativi di BloodHound è che rappresenta un'istantanea nel tempo. FalconHound include funzionalità che possono essere utilizzate per mantenere aggiornato un grafico del tuo ambiente. Questo ti permette di vedere il tuo ambiente COME È ORA. È particolarmente utile per ambienti in continua evoluzione.
Una delle relazioni più difficili da raccogliere per BloodHound sono le appartenenze ai gruppi locali e le informazioni sulle sessioni. Come blue teamer, abbiamo queste informazioni prontamente disponibili nei nostri log. FalconHound può essere utilizzato per raccogliere queste informazioni e aggiungerle al grafico, consentendo a BloodHound di usarle.
Questo è solo un esempio di come può essere utilizzato FalconHound. Può essere impiegato per raccogliere qualsiasi informazione presente nei tuoi log o strumenti di sicurezza e aggiungerla al grafico di BloodHound.
Inoltre, il grafico può essere utilizzato per attivare avvisi o generare liste di arricchimento.
Ad esempio, se un utente viene aggiunto a un determinato gruppo, FalconHound può essere utilizzato per interrogare il database del grafico alla ricerca del percorso più breve verso un gruppo sensibile o ad alta privilegi. Se esiste un percorso, questo può essere registrato nel SIEM o utilizzato per attivare un avviso.
Altri esempi in cui FalconHound può essere utilizzato:
- Aggiungere, rimuovere o impostare il timeout delle sessioni nel grafico, basandosi sugli eventi di accesso e disconnessione.
- Contrassegnare utenti e computer come compromessi nel grafico quando hanno un incidente in Sentinel o MDE.
- Aggiungere informazioni sulle CVE e sulla disponibilità di exploit pubblici nel grafico.
- Tutti i tipi di attività su Azure.
- Ricalcolare il percorso più breve verso gruppi sensibili quando un utente viene aggiunto a un gruppo o ha un nuovo ruolo.
- Aggiungere nuovi utenti, gruppi e computer al grafico.
- Generare liste di arricchimento per Sentinel e Splunk, ad esempio di utenti Kerberoastable o utenti con proprietà di determinate entità.
Le possibilità sono infinite. Aggiungi altre idee al tracker dei problemi o invia una PR.
Un blog che spiega perché lo abbiamo sviluppato e alcuni esempi di casi d'uso si trova [qui](https://medium.com/falconforce/falconhound-attack-path-management-for-blue-teams-42adedc9cae5?source=friends_link&sk=9f64b6b3028c5a2a6087d63b4fd2c82f)
Indice:
- [Origini e destinazioni dati supportate](#supported-data-sources-and-targets)
- [Installazione](#installation)
- [Utilizzo](#usage)
- [Azioni](#actions)
- [Estensioni al grafico](#extensions-to-the-graph)
- [Gestione delle credenziali](#credential-management)
- [Distribuzione](#deployment)
- [Licenza](#license)
## Origini e destinazioni dati supportate
FalconHound è progettato per essere utilizzato con BloodHound. Non sostituisce BloodHound. È progettato per sfruttare la potenza di BloodHound e di tutte le altre piattaforme dati che supporta in modo automatizzato.
Attualmente, FalconHound supporta le seguenti origini dati e/o destinazioni:
- Azure Sentinel
- Azure Sentinel Watchlists
- Splunk
- Microsoft Defender for Endpoint
- Neo4j
- MS Graph API (fase iniziale)
- File CSV
- Azure Data Explorer (ADX) - beta
- LogScale
- BloodHound CE e BHE (fase iniziale)
- File MarkDown
- Elastic (fase iniziale)
Ulteriori origini dati e destinazioni sono previste per il futuro.
Al momento, FalconHound supporta solo il database Neo4j per BloodHound. Il supporto per l'API di BH CE e BHE è in fase di sviluppo attivo.
---
## Installazione
Poiché FalconHound è scritto in Go, non è richiesta installazione. Basta scaricare il binario dalla sezione delle release ed eseguirlo.
Sono disponibili binari compilati per Windows, Linux e MacOS. Puoi trovarli nella sezione [release](https://github.com/FalconForceTeam/FalconHound/releases).
Prima di poterlo eseguire, è necessario creare un file di configurazione. Puoi trovare un file di configurazione di esempio nella cartella principale. Le istruzioni su come creare tutte le credenziali si trovano [qui](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
Il modo consigliato per eseguire FalconHound è come attività pianificata o cron job. Questo ti permetterà di eseguirlo regolarmente e mantenere aggiornati grafico, avvisi e arricchimenti.
### Requisiti
- BloodHound, o almeno il database Neo4j per ora.
- Un SIEM o altro strumento di aggregazione dei log. Attualmente sono supportati Azure Sentinel e Splunk.
- Credenziali per ogni endpoint con cui vuoi comunicare, con le [autorizzazioni richieste](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
### Configurazione
FalconHound è configurato tramite un file YAML. Puoi trovare un file di configurazione di esempio nella cartella principale.
Ogni sezione del file di configurazione è spiegata di seguito.
---
## Utilizzo
#### Esecuzione predefinita
Per eseguire FalconHound, esegui il binario e aggiungi il parametro `-go` per fargli eseguire tutte le query nella cartella delle azioni.```bash
./falconhound -go
Per elencare tutte le azioni abilitate, utilizza il parametro -actionlist. Questo elencherà tutte le azioni abilitate nei file di configurazione nella cartella delle azioni. Dovrebbe essere usato in combinazione con il parametro -go.```bash
./falconhound -actionlist -go
### Esecuzione con un insieme selezionato di azioni
Per eseguire un insieme selezionato di azioni, utilizza il parametro `-ids`, seguito da uno o un elenco di ID di azione separati da virgola. Questo eseguirà le azioni specificate nel parametro, che può essere molto utile durante i test, la risoluzione dei problemi o quando si necessitano aggiornamenti specifici e più frequenti. Dovrebbe essere usato in combinazione con il parametro `-go`.```bash
./falconhound -ids action1,action2,action3 -go
Per impostazione predefinita, FalconHound cercherà un file di configurazione nella directory corrente. Puoi anche specificare un file di configurazione usando il flag -config. Questo ti permette di eseguire più istanze di FalconHound con configurazioni diverse, su ambienti diversi.```bash
./falconhound -go -config /path/to/config.yml
#### Esecuzione con una cartella actions diversa
Per impostazione predefinita, FalconHound cercherà la cartella actions nella directory corrente. È anche possibile specificare una cartella diversa utilizzando il flag `-actions-dir`. Questo semplifica i test e la risoluzione dei problemi, ma permette anche di eseguire più istanze di FalconHound con diverse configurazioni, su ambienti diversi o a intervalli di tempo differenti.```bash
./falconhound -go -actions-dir /path/to/actions
Per impostazione predefinita, FalconHound utilizzerà le credenziali presenti nel file config.yml (o in uno personalizzato caricato). Impostando il flag -keyvault, FalconHound otterrà il keyvault dalla configurazione e recupererà tutti i segreti da lì. Se nel keyvault mancano elementi, si ripiegherà sul file di configurazione. Se si desidera recuperare i segreti da un Azure Keyvault utilizzando un'identità gestita, definire la variabile authtype come "msi".```bash
./falconhound -go -keyvault
## Azioni
Le azioni sono il cuore di FalconHound. Sono le query che FalconHound eseguirà. Sono scritte nel linguaggio nativo della sorgente e del target e sono memorizzate nella cartella delle azioni. Ogni azione è un file separato ed è memorizzata nella directory della sorgente dell'informazione, il target della query. Il nome del file viene utilizzato come nome dell'azione.
### Struttura della cartella delle azioni
La cartella delle azioni è suddivisa in sottodirectory per sorgente di query. Tutte le cartelle saranno processate ricorsivamente e tutti i file YAML saranno eseguiti in ordine alfabetico.
Le azioni Neo4j **dovrebbero** essere processate per ultime, poiché il loro output dipende da altre sorgenti di dati che devono prima aggiornare il database a grafo, per ottenere i risultati più aggiornati.
### File delle azioni
Tutti i file sono file YAML. Il file YAML contiene la query, alcuni metadati e i target dell'informazione interrogata.
C'è un file template disponibile nella cartella radice. Puoi usarlo per creare le tue azioni. Dai un'occhiata alle azioni nella cartella delle azioni per ulteriori esempi.
Sebbene la maggior parte degli elementi siano abbastanza autoesplicativi,ci sono alcune cose importanti da notare riguardo alle azioni:
#### Abilitato
Come suggerisce il nome, questo viene utilizzato per abilitare o disabilitare un'azione. Se impostato su false, l'azione non verrà eseguita.```yaml
Enabled: true
Questo parametro consente di abilitare o disabilitare la modalità di debug per un'azione. Se impostato su true, l'azione verrà eseguita in modalità debug, visualizzando i risultati della query nella console. È utile per test e risoluzione dei problemi, ma non è consigliato per l'uso in produzione. Rallenterà l'elaborazione dell'azione in base al numero di risultati.```yaml Debug: false
#### Query
Il campo `Query` è la query che verrà eseguita contro la sorgente. Può essere una query KQL, una query SPL o una query Cypher a seconda del tuo `SourcePlatform`.
IMPORTANTE: Cerca di mantenere la query il più precisa possibile e di restituire solo i campi necessari. Ciò renderà l'elaborazione dei risultati più rapida ed efficiente.
Inoltre, quando esegui query Cypher, assicurati di RESTITUIRE un oggetto JSON come risultato, altrimenti l'elaborazione fallirà.
Ad esempio, questo restituirà Nome, Conteggio, Ruolo e Proprietari delle Sottoscrizioni Azure:```cypher
MATCH p = (n)-[r:AZOwns|AZUserAccessAdministrator]->(g:AZSubscription)
RETURN {Name:g.name , Count:COUNT(g.name), Role:type(r), Owners:COLLECT(n.name)}
Ogni target ha diverse opzioni che possono essere configurate. A seconda del target, alcuni potrebbero richiedere più configurazione di altri.
Tutti i target hanno i campi Name e Enabled. Il campo Name viene utilizzato per identificare il target. Il campo Enabled viene utilizzato per abilitare o disabilitare il target. Se impostato su false, il target verrà ignorato.
CSV supporta la variabile {{date}}, che verrà sostituita con la data corrente nel formato YYYY-MM-DD. Questo può essere utilizzato per creare report giornalieri.
Può essere utilizzato in un nome di cartella o file (ad es. path/to/filename-{{date}}.csv) o nel nome della cartella stessa.```yaml
#### Markdown
Markdown supporta la variabile {{date}}, che verrà sostituita con la data corrente nel formato `YYYY-MM-DD`. Può essere utilizzata per creare report giornalieri.
Può essere usata in un nome di cartella o file (ad es. `path/to/filename-{{date}}.md`) o nel nome della cartella stessa.```yaml
- Name: Markdown
Enabled: true
Path: path/to/filename.md
Output di esempio:```markdown
Description: Get a list of Domain Admins. Date: 2024-02-19
| Name | ObjectID |
|---|---|
| [email protected] | S-1-5-21-1122334455-112233445-1112223334-11223344 |
#### Neo4j
Il target Neo4j scrive i risultati della query in un database Neo4j. Questo output è per riga e quindi richiede una configurazione aggiuntiva.
Poiché possiamo trasferire tutti i tipi di dati in tutte le direzioni, FalconHound deve capire cosa fare con i dati. Ciò viene fatto utilizzando variabili di sostituzione nella prima riga delle tue query Cypher. Queste vengono passate a Neo4j come parametri e possono essere utilizzate nella query.
I campi `ReplacementFields` sono configurati di seguito.```yaml
- Name: Neo4j
Enabled: true
Query: |
MATCH (x:Computer {name:$Computer}) MATCH (y:User {objectid:$TargetUserSid}) MERGE (x)-[r:HasSession]->(y) SET r.since=$Timestamp SET r.source='falconhound'
Parameters:
Computer: Computer
TargetUserSid: TargetUserSid
Timestamp: Timestamp
La sezione Parameters definisce un insieme di parametri che verranno sostituiti con i valori dei risultati della query. Questi possono essere referenziati come parametri Neo4j utilizzando la sintassi $parameter_name.
Il target Sentinel scriverà i risultati della query in una tabella Sentinel. La tabella verrà creata se non esiste. La tabella verrà creata nel workspace specificato nel file di configurazione. I dati della query verranno aggiunti al campo EventData. L'EventID sarà l'ID dell'azione e la Description sarà il nome dell'azione.
Ecco perché anche l'output della query deve essere controllato, altrimenti si potrebbe inondare il target.```yaml
#### Sentinel Watchlists
Il target Sentinel Watchlists scriverà i risultati della query in una watchlist di Sentinel. La watchlist verrà creata se non esiste. La watchlist verrà creata nel workspace specificato nel file di configurazione. Tutte le colonne restituite dalla query verranno aggiunte alla watchlist.```yaml
- Name: Watchlist
Enabled: true
WatchlistName: FH_MDE_Exploitable_Machines
DisplayName: MDE Exploitable Machines
SearchKey: DeviceName
Overwrite: true
Il campo WatchlistName è il nome della watchlist. Il campo DisplayName è il nome visualizzato della watchlist.
Il campo SearchKey è la colonna che verrà utilizzata come chiave di ricerca.
Il campo Overwrite viene utilizzato per determinare se la watchlist deve essere sovrascritta o accodata. Se impostato su false, i risultati della query verranno aggiunti alla watchlist. Se impostato su true, la watchlist verrà eliminata e ricreata con i risultati della query.
Come Sentinel, Splunk scriverà i risultati della query in un indice Splunk. L'indice dovrà essere creato e collegato a un endpoint HEC. I dati della query verranno aggiunti al campo EventData. L'EventID sarà l'ID dell'azione e la Description sarà il nome dell'azione.```yaml
#### Azure Data Explorer
Come Sentinel, Splunk scriverà i risultati della query in una tabella ADX. I dati della query verranno aggiunti al campo EventData. L'EventID sarà l'ID dell'azione e la Description sarà il nome dell'azione.```yaml
- Name: ADX
Enabled: true
Table: "name"
Per creare una tabella in ADX puoi usare il seguente comando:```kql .create table FalconHound (Name: string, Description: string, EventID: string, BHQuery: string, EventData: dynamic, Timestamp: datetime)
### Estensioni al grafo
#### Relazione: HadSession
Una volta terminata una sessione, doveva essere rimossa dal grafo, ma sembrava uno spreco di informazioni. Quindi invece di rimuovere la sessione, verrà aggiunta come relazione tra il computer e l'utente. La relazione si chiamerà `HadSession`. La relazione avrà le seguenti proprietà:```json
{
"till": "2021-08-31T14:00:00Z",
"source": "falconhound",
"reason": "logoff",
}
Ciò consente ulteriori scoperte di percorsi in cui possiamo indagare se l'utente ha mai effettuato l'accesso a un determinato sistema, anche se la sessione è terminata.
FalconHound aggiungerà le seguenti proprietà ai nodi del grafo:
Computer: - 'exploitable': true/false - 'exploits': elenco di CVE - 'exposed': true/false - 'ports': elenco di porte accessibili da Internet - 'alertids': elenco di ID allerta
I modi attualmente supportati per fornire credenziali a FalconHound sono:
Il file di configurazione contiene tutti i dettagli richiesti da ciascuna piattaforma. Tutti gli elementi nel file di configurazione sono sensibili alle maiuscole/minuscole. La buona pratica è separare le app a livello di servizio, ma puoi utilizzare un unico AppID/AppSecret per tutte le azioni basate su Azure.
Le autorizzazioni richieste per il tuo AppID/AppSecret sono elencate qui.
Un modo più sicuro per memorizzare le credenziali sarebbe utilizzare un Azure KeyVault. Tieni presente che esiste un piccolo aspetto di costo nell'uso dei Keyvault. L'accesso ai KeyVault attualmente supporta l'autenticazione basata su Identità di Sistema Gestita o AppID/AppSecret che deve essere configurato nel file config.yml.
Il metodo consigliato per configurare questo è assegnare un'Identità di Sistema Gestita alla VM su cui è in esecuzione FalconHound e assegnarle il ruolo Key Vault Secrets User a questo Keyvault. Ciò consentirà a FalconHound di autenticarsi al Keyvault senza necessità di ulteriore configurazione.
In alternativa è possibile utilizzare un ServicePrincipal che abbia solo il ruolo Key Vault Secrets User su questo Keyvault. Questo ruolo consente solo l'accesso ai segreti, non nemmeno la loro elencazione. Non RIUTILIZZARE il ServicePrincipal che ha accesso a Sentinel e/o MDE, poiché ciò annulla quasi completamente l'uso di un Keyvault.
Gli elementi da configurare nel Keyvault sono elencati di seguito. Nota che i segreti di Keyvault non sono sensibili alle maiuscole/minuscole.``` SentinelAppSecret SentinelAppID SentinelTenantID SentinelTargetTable SentinelResourceGroup SentinelSharedKey SentinelSubscriptionID SentinelWorkspaceID SentinelWorkspaceName MDETenantID MDEAppID MDEAppSecret Neo4jUri Neo4jUsername Neo4jPassword GraphTenantID GraphAppID GraphAppSecret AdxTenantID AdxAppID AdxAppSecret AdxClusterURL AdxDatabase SplunkUrl SplunkApiToken SplunkIndex SplunkApiPort SplunkHecToken SplunkHecPort BHUrl BHTokenID BHTokenKey LogScaleUrl LogScaleToken LogScaleRepository LimaCharlieAPIUrl LimaCharlieOrgId LimaCharlieIngestKey ElasticCloudID ElasticApiKey
Once configured you can add the `-keyvault` parameter while starting FalconHound.
#### Modalità mista / fallback
When the `-keyvault` parameter is set on the command-line, this will be the primary source for all required secrets. Should FalconHound fail to retrieve items, it will fall back to the equivalent item in the `config.yml`.
If both fail and there are actions enabled for that source or target, it will throw a warning and skip the action(s).
## Distribuzione
FalconHound is designed to be run as a scheduled task or cron job. This will allow you to run it on a regular basis and keep your graph, alerts and enrichments up-to-date.
Depending on the amount of actions you have enabled, the amount of data you are processing and the amount of data you are writing to the graph, this can take a while.
All log based queries are built to run every 15 minutes. Should processing take too long you might need to tweak this a little.
If this is the case it might be recommended to disable certain actions.
Also there might be some overlap with for instance the session actions. If you have a lot of sessions you might want to disable the session actions for Sentinel and rely on the one from MDE. This is assuming you have MDE and Sentinel connected and most machines are onboarded into MDE.
### Sharphound / Azurehound
While FalconHound is designed to be used with BloodHound, it is not a replacement for Sharphound and Azurehound. It is designed to compliment the collection and remove the moment-in-time problem of the peroiodic collection. Both Sharphound and Azurehound are still required to collect the data, since not all similar data is available in logs.
It is recommended to run Sharphound and Azurehound on a regular basis, for example once a day/week or month, and FalconHound every 15 minutes.
## Licenza
This project is licensed under the BSD3 License - see the [LICENSE](https://github.com/falconforceteam/falconhound/blob/HEAD/LICENSE) file for details.
This means you can use this software for free, even in commercial products, as long as you credit us for it.
You cannot hold us liable for any damages caused by this software.