
Datos de un ejercicio de emulación automatizada de adversarios BRAWL
Uno de los problemas desafiantes para los investigadores de ciberseguridad que desarrollan capacidades de detección y respuesta es encontrar un entorno realista para probar sus hipótesis y capacidades.
El método más económico es probar capacidades en una pequeña red de laboratorio. Pero este entorno carece de la escala de una red empresarial real y del ruido de los entornos reales que dificulta mucho la detección. En muchos sentidos, el mejor entorno sería probar en múltiples redes de escala empresarial con un atacante controlado pero realista y ruido real de usuarios, administradores de sistemas y software/dispositivos de terceros. El desafío de probar en este entorno es que es costoso y, en algunos escenarios, de alto riesgo.
BRAWL busca crear un compromiso mediante un sistema que crea automáticamente una red empresarial dentro de un entorno en la nube. OpenStack es el único entorno compatible actualmente, pero se está diseñando de manera que pueda admitir fácilmente otros entornos en la nube en el futuro. BRAWL también construye una red de análisis que contiene un pipeline de ingesta y procesamiento de datos utilizando LogStash y Kafka. Como parte de la red de análisis, crea un sistema de almacenamiento y búsqueda de eventos utilizando Elasticsearch y Kibana. BRAWL pone en marcha una "Red de juego" empresarial con imágenes de Windows. Estas imágenes tienen Microsoft Sysmon y otros sensores ya instalados y configurados para reenviar registros al framework de ingesta de datos.
BRAWL también tiene un concepto de bots, que pueden ser Rojos, Azules o Grises. Los bots Rojos son ofensivos, los Azules son defensivos y los Grises emulan el comportamiento legítimo de los usuarios para proporcionar ruido que dificulte la detección. Cuando un usuario quiere probar hipótesis de investigación, implementa un bot de BRAWL. El bot de BRAWL se registra con el Controlador de BRAWL, que luego orquesta juegos entre los bots de BRAWL en la Red de juego.
Nota: Debido a problemas con los tamaños de archivo y las cuotas de GitHub, estamos colocando todos los archivos en un archivo zip en lugar de dejarlos como texto plano en el repositorio de git. Todos los datos están en el archivo
Esta publicación consiste en algunos datos de un prototipo de BRAWL. Creamos una pequeña red empresarial, descrita a continuación. Luego ejecutamos un solo juego usando el proyecto de investigación MITRE CALDERA como un bot rojo.
CALDERA es un proyecto de investigación relacionado de MITRE que automatiza la actividad de emulación de adversarios basándose en la información del modelo Tácticas, Técnicas y Conocimiento Común del Adversario (ATT&CK). Implementa un conjunto de tácticas y técnicas de ATT&CK y utiliza un sistema de planificación (https://dl.acm.org/citation.cfm?id=2991111) para automatizar la activación de esas técnicas y generar comportamiento adversario posterior a la compromiso dentro de una red empresarial.
Estos datos se publican bajo la Licencia Creative Commons BY
Nuestra pequeña red empresarial es una red plana que consta de un Controlador de Dominio (dc.brawlco.com) y 16 estaciones de trabajo. Cada PC tiene el nombre del usuario principal en el nombre del PC (por ejemplo, el usuario beane normalmente inicia sesión en beane-pc). Ese usuario tiene privilegios de Administrador Local en el equipo.
Todos los PCs ejecutan Windows 8.1. El Controlador de Dominio ejecuta Windows Server 2012 R2.
En los PCs con Windows 8, realizamos cambios para habilitar WDigest para mantener contraseñas en texto plano en la memoria de LSASS usando el siguiente comando de registro: reg ADD HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\ /v UseLogonCredential /t REG_DWORD /d 1 /F
Para este ejercicio, CALDERA fue el único bot de BRAWL participante. Aunque conceptualmente BRAWL puede usarse para probar una variedad de comportamientos y detecciones de atacantes, muchos de los esfuerzos de investigación de MITRE siguen una filosofía de "asumir la brecha". Por lo tanto, le damos a CALDERA un punto de partida como Administrador Local en un equipo de la red al comienzo del ejercicio.
Además, sin un bot Gris que realice inicios de sesión en diferentes hosts, la Red de juego de BRAWL es estéril desde la perspectiva de credenciales que puedan ser robadas y utilizadas por bots Rojos. Para permitir el movimiento lateral, el Controlador de BRAWL utiliza psexec para crear eventos de inicio de sesión en hosts con las credenciales de otros usuarios de la red.
CALDERA realizó las siguientes técnicas de ATT&CK durante el ejercicio:
Hay cinco tipos de datos en este repositorio. Cada uno está contenido en su propio archivo en la carpeta data/.
Se anima a los bots Rojos y Azules a registrar información sobre sus actividades o detecciones en el Formato Compartido BRAWL (BSF). El objetivo de esto es facilitar la comparación de las detecciones/acciones del bot Azul con las acciones del bot Rojo.
El formato está actualmente en desarrollo y podría cambiar en futuros conjuntos de datos.
Los campos para BSF se describen a continuación en la sección Detalle de Fuentes de Datos.
Diferentes fuentes de eventos en BRAWL manejan el tiempo de manera diferente. El tiempo es ya sea el momento en que un evento llegó a nuestro framework de ingesta de registros, el momento en que se generó el evento en el host/punto final, o el momento registrado por un bot en la red. En general, esos tiempos deberían estar dentro de unos pocos milisegundos entre sí. Cuando es posible, el framework de ingesta de registros utiliza la hora del evento almacenada en el evento en lugar de la hora en que el evento llega a los nodos de ingesta. La tabla a continuación detalla el método utilizado para cada tipo de dato.
Estamos usando Sysmon v3.11. sysmon_config.txt contiene la salida del comando sysmon -c detallando nuestra configuración.
Sysmon genera muchos tipos diferentes de eventos, que se asignan a diferentes pares objeto/acción de CAR. Los campos para cada tipo se explican con más detalle en el sitio web de CAR: https://car.mitre.org/wiki/Data_Model
Los pares objeto/acción que genera Sysmon en nuestra configuración son:
driver/loadfile/attr_modifyflow/startmodule/loadprocess/createprocess/terminatethread/createthreat/remote_createUtilice el modelo de datos CAR para determinar los nombres y la semántica de los campos contenidos en data_model.fields.* para cada par objeto/acción anterior.
Estos datos se recopilaron periódicamente utilizando el módulo unified_json.ps1 de las Utilidades de PowerShell para Conciencia Situacional de Seguridad de MITRE. El campo userinfo puede ser útil para determinar qué credenciales pueden haber sido comprometidas si se ejecutó un volcador de credenciales como Mimikatz en el sistema.
Los objetos dentro del campo array bsf son de tipo operation, step o event. Todos los objetos tienen un campo nodetype que se puede usar para determinar el tipo de objeto.
eventPuede leer más sobre la semántica de los Campos Requeridos y Opcionales buscando el objeto asociado en el Modelo de Datos CAR.
stepLos objetos paso conectan uno o más eventos en una agrupación de actividad de nivel superior. Los objetos paso también presentan un lugar para que los emisores de BSF etiqueten la actividad con etiquetas ATT&CK.
operationLos objetos de operación conectan múltiples objetos paso. Sin embargo, no hay objetos Operation presentes en este conjunto de datos.
Descripciones y Notas para los Campos de Evento (especialmente "Al menos uno de"):1. Campos de tiempo.
time. Sin embargo, es posible que ni el equipo rojo ni el azul conozcan esta marca de tiempo exacta. Por ejemplo, los bots rojos pueden iniciar un proceso para realizar alguna acción dentro de una ventana de tiempo, pero se desconoce el momento exacto en que ocurre la acción. Los bots azules pueden usar sensores que implican retrasos en la detección. Por lo tanto, BSF también proporciona dos campos de tiempo: happened_after y happened_before como corchetes temporales izquierdo y derecho respectivamente, definiendo límites en un intervalo de incertidumbre para el evento real. Debe informarse al menos uno de estos tres campos (es decir, time, happened_after, happened_before) con cada objeto event. Los otros campos son opcionales, pero deben informarse si se conocen. En particular, se alienta a los bots a reportar un valor para time que sea su mejor estimación, incluso si no tienen una hora exacta.time, , }, al igual que el evento de fin de flujo. Sin embargo, algunos sensores azules pueden detectar una actividad durativa a mitad de su curso (por ejemplo, un escáner que explora periódicamente el estado de todos los procesos y determina que uno se ha vuelto malicioso). Para flujos, las detecciones a mitad de curso pueden informarse como "flow, message, time, ... (otros campos)". Para procesos, las detecciones a mitad de curso pueden informarse como "process, scanned, time, ... (otros campos)".Hosts en nuestra red BRAWL para este juego:
| Tipo de dato | Descripción |
|---|
| game_metadata | Datos que describen el escenario de BRAWL |
| sysmon | Datos recopilados de Sysmon ejecutándose en cada una de las estaciones de trabajo |
| win_event | Registros de eventos de Windows |
| computer_properties | Datos recopilados de scripts personalizados que proporcionan información sobre los equipos de la red |
| bsf | Acciones del bot Rojo en Formato Compartido BRAWL (BSF) |
| Fuente de datos | Notas sobre el tiempo |
|---|
| computer_properties | del campo time |
| game_metadata | hora en que llega al framework de ingesta |
| sysmon | del campo utc_time |
| win_event | extraído de la hora del evento de Windows |
| bsf | El campo @timestamp es la hora en que llega al framework de ingesta. Sin embargo, los campos de tiempo relacionados con BSF (por ejemplo, happened_after, happened_before, etc.) son las horas en que los eventos comenzaron o finalizaron según la hora del servidor de comando y control de CALDERA. |
| Nombre del campo | Descripción |
|---|
| @timestamp | Hora relacionada con el evento. Ver nota sobre tiempo arriba. |
| @uuid | ID de evento único |
| game_id | El game_id único para este ejercicio. |
| type | Tipo de evento. Siempre game_metadata para estos registros |
| hosts | Una lista de hosts que formaron parte del ejercicio y "dentro de los límites" para el bot Rojo |
| randomization_seed | Una semilla que los participantes del bot BRAWL pueden usar para implementar un comportamiento "aleatorio" que sea el mismo en todas las ejecuciones de BRAWL |
| starting_host | host en el que comienza el bot Rojo. |
| Nombre del campo | Descripción |
|---|
| @timestamp | Hora relacionada con el evento. Ver nota sobre tiempo arriba. |
| @uuid | ID de evento único |
| type | Tipo de evento. Siempre sysmon para estos registros |
| game_id | El game_id único para este ejercicio. |
| data_model.object | El CAR objeto sobre el que se actúa. |
| data_model.action | La CAR acción que se realiza sobre el objeto. Este campo es un array porque algunos eventos pueden corresponder a más de una acción en el modelo de datos CAR. Un ejemplo de esto son los eventos de creación de hilos remotos. |
| data_model.fields.* | Los campos relevantes para el par objeto/acción dado. |
| game_id | El game_id único para este ejercicio. |
| host | Nombre del host desde el que se registró el evento. |
| Nombre del campo | Descripción |
|---|
| @timestamp | Hora relacionada con el evento. Ver cada evento a continuación para más detalles sobre cómo se calcula |
| @uuid | ID de evento único |
| type | Tipo de evento. Siempre win_event para estos registros |
| game_id | El game_id único para este ejercicio. |
| host | Host que registró el evento |
| raw | La entrada del registro de eventos de Windows en su formato XML sin procesar |
| data_model.fields.log_name | Nombre del registro de Windows (Application, System o Security) |
| data_model.fields.log_type | El tipo de registro para un log_name dado |
| Nombre del campo | Descripción |
|---|
| @timestamp | Hora relacionada con el evento. Ver nota sobre tiempo arriba. |
| @uuid | ID de evento único |
| type | Tipo de evento. Siempre computer_properties para estos registros |
| game_id | El game_id único para este ejercicio. |
| host | Nombre del equipo en el que se ejecutó el script |
| netinfo | Colección de objetos netinfo |
| netinfo.DNSServers | colección de resolvedores DNS configurados para este host |
| netinfo.Gateway | Puerta de enlace para esta interfaz |
| netinfo.IPAddress | Direcciones IP para esta interfaz |
| netinfo.IsDHCPEnabled | ¿Está habilitado DHCP? |
| netinfo.MACAddress | Dirección MAC para esta interfaz |
| netinfo.SubnetMask | Máscara de subred para las respectivas direcciones IP |
| pcinfo | Objeto que describe información sobre el PC |
| pcinfo.AssetTag | Etiqueta de activo si es accesible |
| pcinfo.CPU | Información sobre la(s) CPU(s) |
| pcinfo.ChassisType | No utilizado en BRAWL. "Unknown" |
| pcinfo.Disks | Información sobre el(los) disco(s) conectado(s) |
| pcinfo.DomainName | dominio del que forma parte el sistema |
| pcinfo.LastBootUpTime | Hora en que se inició el sistema |
| pcinfo.Memory | Información sobre la memoria de los sistemas |
| pcinfo.OS | Información sobre el SO en ejecución |
| pcinfo.SerialNumber | Número de serie del hardware |
| time | Hora en que se ejecutó el script |
| userinfo | Array que contiene objetos userinfo describiendo usuarios que han iniciado sesión en el sistema desde el último reinicio |
| userinfo.AuthenticationPackage | Paquete de autenticación utilizado para la autenticación |
| userinfo.Domain | Dominio (o PC local) al que pertenece la cuenta |
| userinfo.LogonId | LogonId |
| userinfo.LogonTime | Hora de inicio de sesión |
| userinfo.LogonType | Constantes de tipo de inicio de sesión de Windows (Type Constants) |
| userinfo.LogonTypeName | Descripción de LogonType |
| userinfo.UserName | Nombre de usuario de la entidad que inicia sesión |
| Nombre del campo | Descripción |
|---|
| @timestamp | Hora relacionada con el evento. Ver nota sobre tiempo arriba. |
| @uuid | ID de evento único |
| type | Tipo de evento. Siempre bsf_events para estos registros |
| game_id | El game_id único para este ejercicio. |
| bsf | Array de eventos BSF que describen la actividad del bot. Los campos para este array se describen con más detalle a continuación. |
| bsf_version | Versión del esquema BSF utilizado para el array de eventos bsf |
| producer_id | Bot que produjo estos datos BSF. |
| Campo | Descripción |
|---|
| id | Un identificador único para cada evento. |
| nodetype | El tipo de este nodo. Uno de: {"operation", "step", "event"}. |
| host | Nombre del host o IP en el que se realizó/detectó este evento. |
| time | Nota: Se debe informar al menos uno de los siguientes tres campos de tiempo (es decir, "time", "happened_after" o "happened_before"). "time" es especialmente deseado; se recomiendan los tres. Consulte la nota 1 en Notas Generales a continuación. Nota sobre el formato de la hora: Toda la información de tiempo debe estar en formato ISO 8601. Más específicamente como: 'yyyy-mm-ddThh:nn:ss.llll00'. Donde y es año, m es mes, d es día, h es hora, n es minuto, s es segundo, l es milisegundo (y hay dos ceros finales). Por ejemplo: 2017-02-22T18:38:14.060000 Opcional: Estimación de la hora en que ocurrió este evento. |
| happened_after | Opcional: Un límite temprano ("corchete temporal izquierdo") sobre la incertidumbre en "time". |
| happened_before | Opcional: Un límite tardío ("corchete temporal derecho") sobre la incertidumbre en "time". |
| confidence | Opcional: Permite que los bots azules comuniquen la confianza (un número real entre 0.0 y 1.0) en la asociación de este evento con un ataque. |
| object | Objeto sobre el que se actúa; consulte la tabla a continuación para ver los valores permitidos. Basado libremente en el Modelo de Datos CAR |
| action | Acciones para un objeto dado. Basado libremente en el Modelo de Datos CAR |
| specific_field_1 .. N | 1-N atributos descriptivos (ver a continuación). Basado libremente en el Modelo de Datos CAR |
| Objeto | Acción | Campo(s) requerido(s) | Campo(s) opcional(es) |
|---|
| process | create terminate scanned | Al menos uno de: {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 | Al menos uno de: {src_hostname,src_ip} Al menos uno de: {dest_hostname, dest_ip} Al menos uno de: {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 |
| Nombre del campo | Descripción |
|---|
| id | Un identificador único para los pasos de la operación. |
| nodetype | El tipo de este nodo. Uno de: {"operation", "step", "event"}. |
| attack_info | Un array de objetos de técnica (definidos en la tabla directamente a continuación), que describe cómo este paso se relaciona con la taxonomía ATT&CK. ¿Por qué un array? Aunque una sola técnica a menudo describe un paso y todos sus eventos, en algunos casos, se pueden implementar múltiples técnicas. |
| attack_info.technique_id | Un ID de técnica ATT&CK (por ejemplo, "T1059") que describe el mecanismo de ataque que el rojo empleó en este paso y sus eventos referenciados. |
| attack_info.technique_name | Una cadena legible por humanos que describe esta técnica (por ejemplo, "Command-Line Interface"). |
| attack_info.tactic | Un array de una o más etiquetas de táctica ATT&CK que describen la intención/estrategia de esta técnica. (Tenga en cuenta que una sola técnica puede ejercer múltiples tácticas). Por ejemplo: ["Lateral Movement", "Execution"] |
| description | Opcional: Las notas o anotaciones para este paso van aquí. |
| events | Un array de ids de los objetos event que componen este paso. |
happened_afterhappened_beforepid para identificar un proceso, sin embargo, el pid no siempre se conoce, especialmente por el bot rojo. Alternativamente, se puede proporcionar el command_line que inició el proceso, o el exe / image_path que se ejecutó.