
Dati da un esercizio di emulazione avversaria automatizzata BRAWL
Uno dei problemi impegnativi per i ricercatori di cybersecurity che sviluppano capacità di rilevamento e risposta è trovare un ambiente realistico in cui testare le loro ipotesi e capacità.
Il metodo più economico è testare le capacità su una piccola rete di laboratorio. Ma questo ambiente manca della scala di una rete aziendale reale e del rumore degli ambienti reali che rendono il rilevamento molto più difficile. In molti modi, l'ambiente migliore sarebbe testare su più reti aziendali con un attaccante controllato ma realistico e rumore reale da utenti, amministratori di sistema e software/dispositivi di terze parti. La sfida del test in questo ambiente è che è costoso e in alcuni scenari ad alto rischio.
BRAWL cerca di creare un compromesso creando un sistema per generare automaticamente una rete aziendale all'interno di un ambiente cloud. OpenStack è l'unico ambiente attualmente supportato, ma è progettato in modo da supportare facilmente altri ambienti cloud in futuro. BRAWL costruisce anche una rete di analisi contenente una pipeline di acquisizione ed elaborazione dei dati utilizzando LogStash e Kafka. Come parte della rete di analisi, crea un sistema di archiviazione e ricerca degli eventi utilizzando Elasticsearch e Kibana. BRAWL avvia una "Game Board" di rete aziendale con immagini Windows. Queste immagini hanno Microsoft Sysmon e altri sensori già installati e configurati per inoltrare i log nel framework di acquisizione dati.
BRAWL ha anche il concetto di bot, che possono essere Red, Blue o Gray. I bot Red sono offensivi, i bot Blue sono difensivi e i bot Gray emulano il comportamento legittimo degli utenti per fornire rumore che renda il rilevamento più difficile. Quando un utente vuole testare ipotesi di ricerca, implementa un bot BRAWL. Il bot BRAWL si registra con il Controller BRAWL, che orchestra poi le partite tra i bot BRAWL sulla Game Board.
Nota: A causa di problemi con le dimensioni dei file e le quote di GitHub, stiamo inserendo tutti i file in un file zip invece di lasciarli come testo normale nel repository git. Tutti i dati sono nel file
Questo rilascio consiste in alcuni dati di un prototipo BRAWL. Abbiamo creato una piccola rete aziendale, descritta di seguito. Abbiamo quindi eseguito una singola partita utilizzando il progetto di ricerca MITRE CALDERA come bot rosso.
CALDERA è un progetto di ricerca correlato di MITRE che automatizza l'attività di emulazione degli avversari basandosi sulle informazioni nel modello Adversarial Tactics, Techniques, and Common Knowledge (ATT&CK). Implementa una serie di tattiche e tecniche ATT&CK e utilizza un sistema di pianificazione (https://dl.acm.org/citation.cfm?id=2991111) per automatizzare l'attuazione di tali tecniche e generare un comportamento avversario post-compromissione all'interno di una rete aziendale.
Questi dati sono rilasciati sotto la Creative Commons BY License
La nostra piccola rete aziendale è una rete piatta composta da un Domain Controller (dc.brawlco.com) e 16 workstation. Ogni PC ha il nome dell'utente principale nel nome del PC (ad es. l'utente beane accede tipicamente a beane-pc). Tale utente dispone di privilegi di amministratore locale sul computer.
Tutti i PC eseguono Windows 8.1. Il Domain Controller esegue Windows Server 2012 R2.
Sui PC Windows 8, abbiamo apportato modifiche per abilitare WDigest per mantenere le password in chiaro nella memoria di LSASS utilizzando il seguente comando del registro: reg ADD HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\ /v UseLogonCredential /t REG_DWORD /d 1 /F
Per questo esercizio, CALDERA è stato l'unico bot BRAWL partecipante. Sebbene concettualmente BRAWL possa essere utilizzato per testare una varietà di comportamenti degli aggressori e rilevamenti, molti degli sforzi di ricerca di MITRE seguono una filosofia di "assunzione di violazione". Pertanto, diamo a CALDERA un punto di partenza come amministratore locale su un computer della rete all'inizio dell'esercizio.
Inoltre, senza un bot grigio che esegua accessi su host diversi, la Game Board BRAWL è sterile dal punto di vista delle credenziali che possono essere rubate e utilizzate dai bot rossi. Per consentire il movimento laterale, il Controller BRAWL utilizza psexec per creare eventi di accesso su host con le credenziali di altri utenti della rete.
CALDERA ha eseguito le seguenti tecniche ATT&CK durante l'esercizio:
Ci sono cinque tipi di dati in questo repository. Ciascuno è contenuto nel proprio file nella cartella data/.
I bot rossi e i bot blu sono incoraggiati a registrare informazioni sulle loro attività o rilevamenti nel BRAWL Shared Format (BSF). L'obiettivo è rendere più facile confrontare le azioni/detezioni del bot blu con le azioni del bot rosso.
Il formato è attualmente in fase di sviluppo e potrebbe cambiare nei futuri set di dati.
I campi per BSF sono descritti di seguito nella sezione Dettaglio delle fonti dati.
Diverse fonti di eventi in BRAWL gestiscono il tempo in modo diverso. Il tempo è o il momento in cui un evento ha raggiunto il nostro framework di acquisizione dei log, il momento in cui l'evento è stato generato sull'host/endpoint, o il tempo registrato da un bot sulla rete. In generale, questi tempi dovrebbero essere entro pochi millisecondi l'uno dall'altro. Quando possibile, il framework di acquisizione dei log utilizza il tempo dell'evento memorizzato nell'evento invece del tempo in cui l'evento raggiunge i nodi di acquisizione. La tabella seguente dettaglia il metodo utilizzato per ogni tipo di dato.
Stiamo usando Sysmon v3.11. sysmon_config.txt contiene l'output del comando sysmon -c che dettaglia la nostra configurazione.
Sysmon genera molti tipi diversi di eventi, che mappano a diverse coppie CAR oggetto/azione. I campi per ogni tipo sono spiegati in maggior dettaglio sul sito CAR: https://car.mitre.org/wiki/Data_Model
Le coppie oggetto/azione generate da Sysmon nella nostra configurazione sono:
driver/loadfile/attr_modifyflow/startmodule/loadprocess/createprocess/terminatethread/createthreat/remote_createUtilizzare il modello dati CAR per determinare i nomi dei campi e la semantica per i campi contenuti in data_model.fields.* per ogni coppia oggetto/azione sopra.
Questi dati sono stati raccolti periodicamente utilizzando il modulo unified_json.ps1 di MITRE da PowerShell Utilities for Security Situational Awareness. Il campo userinfo può essere utile per determinare quali credenziali potrebbero essere state compromesse se un dump di credenziali come Mimikatz è stato eseguito sul sistema.
Gli oggetti all'interno del campo array bsf sono di tipo operation, step o event. Tutti gli oggetti hanno un campo nodetype che può essere utilizzato per determinare il tipo di oggetto.
eventPuoi leggere ulteriori informazioni sulla semantica dei Campi Obbligatori e Opzionali trovando l'oggetto associato nel Modello Dati CAR
stepGli oggetti step collegano uno o più eventi in un raggruppamento di attività di livello superiore. Gli oggetti step offrono anche un posto per gli emettitori BSF per etichettare l'attività con etichette ATT&CK.
operationGli oggetti operation collegano più oggetti step tra loro. Tuttavia non sono presenti oggetti Operation in questo set di dati.
Descrizioni e note per i campi degli eventi (in particolare gli "Almeno uno tra"):1. Campi temporali.
time. Tuttavia, è possibile che né il team red né il team blue conoscano questo timestamp esatto. Ad esempio, i bot red possono generare un processo per compiere un'azione in una finestra temporale, ma il momento esatto in cui l'azione avviene è sconosciuto. I bot blue possono utilizzare sensori che comportano ritardi di rilevamento. Pertanto, BSF fornisce anche due campi temporali happened_after e happened_before come parentesi sinistra e destra rispettivamente, che definiscono i limiti di un intervallo di incertezza per l'evento reale. Almeno uno di questi tre campi (cioè time, happened_after, happened_before) deve essere riportato con ogni oggetto event. Gli altri campi sono opzionali, ma dovrebbero essere riportati se noti. In particolare, i bot sono incoraggiati a riportare un valore per "time" che sia la loro miglior stima, anche se non hanno un orario esatto.time, happened_after, happened_before}, così come l'evento di fine flusso. Tuttavia, alcuni sensori blue possono rilevare un'attività durativa a metà del suo corso (ad esempio, uno scanner che analizza periodicamente lo stato di tutti i processi e determina che uno è diventato malevolo). Per i flussi, le rilevazioni a metà corso possono essere segnalate come "flow, message, time, ... (altri campi)". Per i processi, le rilevazioni a metà corso possono essere segnalate come "process, scanned, time, ... (altri campi)".Host sulla nostra rete BRAWL per questa partita:
| Tipo di dato | Descrizione |
|---|
| game_metadata | Dati che descrivono lo scenario BRAWL |
| sysmon | Dati raccolti da Sysmon in esecuzione su ciascuna delle workstation |
| win_event | Registri eventi di Windows |
| computer_properties | Dati raccolti da script personalizzati che forniscono alcune informazioni sui computer della rete |
| bsf | Azioni dei bot rossi nel BRAWL Shared Format (BSF) |
| Fonte dati | Note sul tempo |
|---|
| computer_properties | dal campo time |
| game_metadata | tempo in cui raggiunge il framework di acquisizione |
| sysmon | dal campo utc_time |
| win_event | estratto dal tempo dell'evento di Windows |
| bsf | Il campo @timestamp è il tempo in cui raggiunge il framework di acquisizione. Tuttavia, i campi BSF relativi al tempo (ad es. happened_after,happened_before, ecc.) sono i tempi in cui gli eventi sono iniziati o terminati in base al tempo sul server di comando e controllo di CALDERA. |
| Nome campo | Descrizione |
|---|
| @timestamp | Tempo relativo all'evento. Vedere nota sul tempo sopra. |
| @uuid | ID evento univoco |
| game_id | L'ID univoco della partita per questo esercizio. |
| type | Tipo di evento. Sempre game_metadata per questi record |
| hosts | Un elenco di host che facevano parte dell'esercizio e "in bounds" per il bot rosso |
| randomization_seed | Un seme che può essere utilizzato dai partecipanti bot BRAWL per implementare un comportamento "casuale" che sia lo stesso tra le esecuzioni di BRAWL |
| starting_host | Host su cui il bot rosso inizia. |
| Nome campo | Descrizione |
|---|
| @timestamp | Tempo relativo all'evento. Vedere nota sul tempo sopra. |
| @uuid | ID evento univoco |
| type | Tipo di evento. Sempre sysmon per questi record |
| game_id | L'ID univoco della partita per questo esercizio. |
| data_model.object | L'oggetto del CAR su cui si agisce. |
| data_model.action | L'azione del CAR eseguita sull'oggetto. Questo campo è un array perché alcuni eventi possono corrispondere a più di un'azione nel modello dati CAR. Un esempio di ciò sono gli eventi di creazione di thread remoti. |
| data_model.fields.* | I campi rilevanti per la coppia oggetto/azione data. |
| game_id | L'ID univoco della partita per questo esercizio. |
| host | Nome host da cui è stato registrato l'evento. |
| Nome campo | Descrizione |
|---|
| @timestamp | Tempo relativo all'evento. Vedere ogni evento qui sotto per i dettagli su come viene calcolato |
| @uuid | ID evento univoco |
| type | Tipo di evento. Sempre win_event per questi record |
| game_id | L'ID univoco della partita per questo esercizio. |
| host | Host che ha registrato l'evento |
| raw | La voce del registro eventi di Windows nel suo formato XML grezzo |
| data_model.fields.log_name | Nome del log di Windows (Application, System o Security) |
| data_model.fields.log_type | Il tipo di log per un dato log_name |
| Nome campo | Descrizione |
|---|
| @timestamp | Tempo relativo all'evento. Vedere nota sul tempo sopra. |
| @uuid | ID evento univoco |
| type | Tipo di evento. Sempre computer_properties per questi record |
| game_id | L'ID univoco della partita per questo esercizio. |
| host | Nome del computer su cui lo script è stato eseguito |
| netinfo | Raccolta di oggetti netinfo |
| netinfo.DNSServers | Raccolta di resolver DNS configurati per questo host |
| netinfo.Gateway | Gateway per questa interfaccia |
| netinfo.IPAddress | Indirizzi IP per questa interfaccia |
| netinfo.IsDHCPEnabled | DHCP abilitato? |
| netinfo.MACAddress | Indirizzo MAC per questa interfaccia |
| netinfo.SubnetMask | Maschera di sottorete per i rispettivi indirizzi IP |
| pcinfo | Oggetto che descrive le informazioni sul PC |
| pcinfo.AssetTag | AssetTag se accessibile |
| pcinfo.CPU | Informazioni sulla CPU |
| pcinfo.ChassisType | Non utilizzato in BRAWL. "Unknown" |
| pcinfo.Disks | Informazioni sul disco/dischi collegati |
| pcinfo.DomainName | Dominio di cui il sistema fa parte |
| pcinfo.LastBootUpTime | Ora in cui il sistema è stato avviato |
| pcinfo.Memory | Informazioni sulla memoria del sistema |
| pcinfo.OS | Informazioni sul sistema operativo in esecuzione |
| pcinfo.SerialNumber | Numero di serie HW |
| time | Ora in cui lo script è stato eseguito |
| userinfo | Array contenente oggetti userinfo che descrivono gli utenti che hanno effettuato l'accesso al sistema dall'ultimo avvio |
| userinfo.AuthenticationPackage | Pacchetto di autenticazione utilizzato per l'autenticazione |
| userinfo.Domain | Dominio (o PC locale) a cui appartiene l'account |
| userinfo.LogonId | LogonId |
| userinfo.LogonTime | Ora dell'accesso |
| userinfo.LogonType | Costanti di tipo di accesso di Windows |
| userinfo.LogonTypeName | Descrizione del LogonType |
| userinfo.UserName | Nome utente del principal che accede |
| Nome campo | Descrizione |
|---|
| @timestamp | Tempo relativo all'evento. Vedere nota sul tempo sopra. |
| @uuid | ID evento univoco |
| type | Tipo di evento. Sempre bsf_events per questi record |
| game_id | L'ID univoco della partita per questo esercizio. |
| bsf | Array di eventi BSF che descrivono l'attività del bot. I campi per questo array sono descritti in maggior dettaglio di seguito. |
| bsf_version | Versione dello schema BSF utilizzato per l'array di eventi bsf |
| producer_id | Bot che ha prodotto questi dati BSF. |
| Campo | Descrizione |
|---|
| id | Un identificatore univoco per ogni evento. |
| nodetype | Il tipo di questo nodo. Uno tra: {"operation", "step", "event"}. |
| host | Nome host o IP in cui questo evento è stato attuato / rilevato. |
| time | Nota: Almeno uno dei seguenti tre campi temporali (cioè "time", "happened_after" o "happened_before") deve essere riportato. "time" è particolarmente desiderato; tutti e tre sono incoraggiati. Si prega di vedere la nota 1 nelle Note generali di seguito. Nota sul formato del tempo: Tutte le informazioni temporali devono essere in formato ISO 8601. Più specificamente come: 'yyyy-mm-ddThh:nn:ss.llll00'. Dove y è anno, m è mese, d è giorno, h è ora, n è minuto, s è secondo, l è millisecondo (e ci sono due zeri finali). Ad esempio: 2017-02-22T18:38:14.060000 Opzionale: Stima del momento in cui questo evento è avvenuto. |
| happened_after | Opzionale: Un limite inferiore ("parentesi temporale sinistra") sull'incertezza nel tempo. |
| happened_before | Opzionale: Un limite superiore ("parentesi temporale destra") sull'incertezza nel tempo. |
| confidence | Opzionale: Consente ai bot blu di comunicare la confidenza (un numero reale tra 0.0 e 1.0) nell'associazione di questo evento con un attacco. |
| object | Oggetto su cui si agisce; vedere la tabella qui sotto per i valori consentiti. Liberamente basato sul Modello Dati CAR |
| action | Azioni per un dato oggetto. Liberamente basato sul Modello Dati CAR |
| specific_field_1 .. N | Da 1 a N attributi descrittivi (vedere sotto). Liberamente basato sul Modello Dati CAR |
| Oggetto | Azione | Campi obbligatori | Campi opzionali |
|---|
| process | create terminate scanned | Almeno uno tra: {pid, command_line, exe, image_path} | fqdn hostname md5_hash parent_exe parent_image_path ppid sha1_hash sha256_hash sid signer user |
| flow | start end message | Almeno uno tra: {src_hostname,src_ip} Almeno uno tra: {dest_hostname, dest_ip} Almeno uno tra: {src_port, dest_port, protocol} | content dest_fqdn exe flags fqdn hostname image_path packet_count pid ppid proto_info src_fqdn user |
| file | create delete modify read timestomp write | file_path | company file_name fqdn hostname image_path md5_hash pid ppid sha1_hash sha256_hash signer user |
| Nome campo | Descrizione |
|---|
| id | Un identificatore univoco per i passaggi dell'operazione. |
| nodetype | Il tipo di questo nodo. Uno tra: {"operation", "step", "event"}. |
| attack_info | Un array di oggetti tecnica (definiti nella tabella direttamente sotto), che descrivono come questo passaggio si relaziona alla tassonomia ATT&CK. Perché un array? Sebbene una singola tecnica spesso descriva un passaggio e tutti i suoi eventi, in alcuni casi possono essere implementate più tecniche. |
| attack_info.technique_id | Un ID tecnica ATT&CK (ad es., "T1059") che descrive il meccanismo di attacco che il rosso ha impiegato in questo passaggio e nei suoi eventi referenziati. |
| attack_info.technique_name | Una stringa leggibile che descrive questa tecnica (ad es., "Command-Line Interface"). |
| attack_info.tactic | Un array di una o più etichette di tattica ATT&CK che descrivono l'intento/strategia di questa tecnica. (Si noti che una singola tecnica può esercitare più tattiche.) Ad esempio: ["Lateral Movement", "Execution"] |
| description | Opzionale: Note o annotazioni per questo passaggio vanno qui. |
| events | Un array di ID degli oggetti event che compongono questo passaggio. |
command_line che ha generato il processo, o l'exe / image_path che è stato eseguito.