Threat hunting (IV): cazando sin salir de casa. Grafiki

Ver primera, segunda parte y tercera parte.


Teoría de Grafos: Análisis relacional de las Redes Sociales

Hoy traigo un artículo sobre algo muy especial para mí.

En la entrada anterior hablamos sobre la explotación de la información con Kibana y su utilidad en ver de un vistazo posible anomalías. Después de mucho trabajar con Kibana, dedicándole muchas horas a crear visualizaciones y dashboards, había una visualización que echaba de menos: ¡los grafos!

En ese sentido, hace tiempo que leí la frase “Los defensores piensan en listas. Los atacantes en grafos“.

Aunque puede levantar mucha controversia, de ser eso cierto nos dejaría a los defensores en una clara desventaja. En un mundo en el que cada vez las amenazas son más complejas, ser capaces de “unir los puntos” marca la diferencia entre encontrar nuestra amenaza o no.

De esta idea y de un aumento de mi tiempo libre por el confinamiento, surgió Grafiki. Vamos a verlo.

Grafiki

Este proyecto pretende crear una nueva manera de trabajar con los eventos de Sysmon. Debido a que los eventos son de por sí independientes, como desarrollador necesitaba almacenar toda esa información en un formato de base de datos relacional y sobre el cual fuera más intuitivo realizar consultas.

Así, de cada evento se extraen las entidades que participan en él, procesos, claves de registro, ficheros… y se relaciona todos ellos de manera independiente, creando una o varias relaciones por cada evento.

Una vez organizada la información, la evolución lógica es pintar todos esos datos como lo que son: entidades relacionándose entre ellas. Como se puede ver, el resultado es asombroso.

Grafo obtenido con Grafiki

Instalación

Lo primero que haremos será instalarlo en nuestra máquina de laboratorio, como ya hicimos con los otros proyectos. La instalación es muy sencilla; abrimos una terminal e introducimos los comandos siguientes:

git clone https://github.com/lucky-luk3/Grafiki.git
cd Grafiki/
chmod +x setup.sh
sudo ./setup.sh
cd grafiki
python3 manage.py runserver

Si todo ha salido bien, la aplicación indicará que accedamos a la URL http://127.0.0.1:8000/ en el navegador para comenzar a usar la herramienta. Una vez allí, en la parte superior vemos los diferentes apartados de la aplicación. En primer lugar, accedemos a “Examples”.

¿Recordáis los repositorios de Mordor y EVTX-ATTACK-SAMPLES? Pues aquí están almacenados todos los enlaces a los ficheros de eventos de ambos repositorios, organizados por las tácticas de Mitre ATT&CK, de modo que será más fácil investigarlos sin tener que introducirlos en ElasticSearch.

De cada ejemplo, disponemos de un enlace para descargar el fichero y un enlace al repositorio del autor, además de dos tipos diferentes de procesado: el procesado normal y el procesado simple.

En el procesado simple se realiza una simplificación del grafo, agrupando los procesos con el mismo nombre, y eliminando algunos elementos del grafo como los hilos. Esta funcionalidad puede ser muy útil en algunos casos para simplificar el grafo, pero en otros puede llevarnos a engaño, por lo que deben valorarse las dos opciones.

Para mostrar las capacidades de este apartado, utilizaremos el mismo fichero cargado en anteriores post. Introduciremos en la barra de búsqueda “empire_wmic_add_user”, pulsaremos en el icono de “Process”, y la aplicación descargará el fichero de eventos del repositorio, transformará los eventos y creará el grafo, cuya pantalla veremos tras unos segundos.

Grafo obtenido con Grafiki

¡He aquí nuestro primer grafo!

Aunque este fichero no es de los más grandes, quizá contiene demasiada información para trabajar con ella de una manera cómoda. Si pulsamos sobre “Graph Filters”, se desplegarán todas las opciones del grafo. Vamos a verlas, ya que en este apartado reside gran parte del encanto del proyecto.

Grafiki

A. Área de procesos

Como se puede apreciar en la imagen, en este apartado existen tres filtros diferentes: por integridad, por sesión y por usuario de los procesos. Al pulsar sobre cualquiera de los filtros, se desplegará un listado con las opciones disponibles, teniendo en cuenta los datos del grafo.

B. Borrado de grupos

Esta opción permite eliminar del grafo grupos completos de procesos. Para ello, se selecciona el nodo central del grupo, es decir el proceso que ha generado los demás, y a continuación “Delete Group”. La opción de borrado recursivo borra de manera recursiva todos los procesos creados por el proceso seleccionado. Esta opción es muy útil para borrar ramas del grafo que no nos sean de interés.

Es necesario tener en cuenta que la acción de borrado no se puede deshacer, por lo que para volver a mostrar un nodo borrado será necesario generar de nuevo el grafo.

C. Animación

Desde este apartado es posible crear una animación con los eventos del grafo. Al pulsar en el botón de reproducir, todos los elementos del grafo desaparecerán, e irán apareciendo en orden de creación, tanto los nodos como las flechas que representan las acciones. Este apartado es muy útil cuando el orden de las acciones es muy relevante para el análisis, como en el caso del “Parent PID Spoofing”.

D. Filtrado de flechas y nodos

Desde este apartado es posible ocultar los nodos o acciones que nos interese. Está opción es reversible así que no hay que tener miedo en aplicarla a los nodos necesarios para ver más claramente los eventos.

Tras borrar los nodos que no interesan y hacer algunos filtrados será más sencillo ver únicamente lo que nos interesa.

En la imagen de arriba vemos como el equipo “HR001” ejecuta un proceso Powershell ejecutando un comando WMI sobre el equipo “IT001”, para añadir el usuario “backdoor”. Aunque en la imagen no se puede apreciar, la información que aparece debajo como “Action Info” aparece al pulsar sobre una flecha, ofreciendo información sobre el evento que representa.

En el video a continuación se muestra la función de animación sobre este pequeño grafo, de tal manera que se aprecia mejor el orden de los eventos.

En el apartado de “File List” y “File Upload” es posible subir nuestros ficheros, en formato EVTX, en formato JSON de eventos de Elastic, y en formato CSV. Tanto el formato JSON y CSV son muy flexibles así que es posible que dé errores y sea necesario modificar el código según nuestras necesidades.

Apartado Elastic

La última parte que quiero mostrar de Grafiki es el apartado “Elastic”. Este apartado permite hacer grafos de los eventos que almacenados en nuestro laboratorio. Para ello, será necesario:

  • Modificar el fichero “elastic.py” en la ruta “Grafiki/grafiki/app/static/Python/src/
  • En la línea 53 y en la línea 58 introducir la IP de HELK.

Veamos las opciones de esta sección:

Como se puede ver en la imagen, lo primero que se debe seleccionar es una franja temporal, lo que dependiendo de la cantidad de datos que tengamos en nuestro laboratorio deberá ser más o menos precisa.

La segunda parte son los filtros, que permiten limitar inicialmente los datos que llevamos al grafo, pudiendo elegir el operador igual o diferente, dependiendo de nuestras necesidades.

Los filtros implementados actualmente son:

  • El nombre del equipo, muy útil cuando se ha identificado el equipo a investigar.
  • El identificador de evento de Sysmon. Por ejemplo, en muchas ocasiones mirando los eventos de tipo 1 ya podemos hacernos una idea de lo que está pasando.
  • IP de origen, IP de destino y tipo de la IP de destino (privada o pública), eventos relacionados con los eventos de conexiones de red.
  • Usuario relacionado con los procesos.
  • Nombre del proceso, opción muy útil para excluir procesos muy ruidosos.

Una característica importante que también se puede apreciar en la imagen es que es posible incluir varios posibles valores a nuestro filtro, separando los elementos con comas. La consulta se construirá usando el operador lógico “OR” entre esos elementos, mientras que entre cada uno de los filtros se utilizará el operador “AND”.

Y ya por último, en la parte inferior es posible seleccionar si queremos un procesado siempre, y si queremos que se procesen los eventos relacionados con Powershell (funcionalidad en pruebas).

En el siguiente artículo pasaremos a la acción con la creación de alertas y creación de playbooks. Mientras tanto, disfrutad del laboratorio y ¡feliz caza!

Ver también en: