Threat hunting (V): cazando sin salir de casa. Jupyter Notebooks

Ver entradas anteriores: I: intro 1, II: intro 2, III: Kibana, IV: Grafiki.

¿Os acordáis cuando en la primera entrega hablábamos sobre lo que es y lo que no es el Threat Hunting? Pues una parte esencial de él es la generación de inteligencia.

De nada sirve que seamos los mejores detectando comportamientos anómalos. Si toda esa inteligencia adquirida no se transforma en información estructurada y repetible habremos perdido una de las partes más valiosas del proceso.

Estructurada, para que cualquiera que no sea el autor pueda utilizarla y entenderla. Repetible de la manera más cómoda posible, para que los equipos de detección puedan generar alertas con ello o para que cualquier otro analista pueda realizar las consultas de la manera más cómoda posible.

En nuestro laboratorio vamos a utilizar otra de las partes de HELK, los todo poderosos Jupyter Notebook.

¿Qué es Jupyter Notebooks?

Para comenzar, imaginémonos un block de notas, en el que podemos escribir nuestros avances, nuestros argumentos y conclusiones.

Por otro lado, imaginemos un programa, un script, algo funcional que es capaz de procesar datos, de conectarse a nuestro laboratorio… toda la maravillosa potencia de la programación.

 Todo eso junto es un Jupyter Notebook.

El que conozca y trabaje con el proyecto se estará tirando de los pelos por esa descripción, pero estaréis de acuerdo en que la idea simplificada es esa ;-)

Una explicación más realista sería que Jupyter Notebooks es la evolución del proyecto IPyhton Notebooks, proyecto que se creó con la finalidad de crear documentos capaces de procesar datos y mostrar una estética similar a un documento de texto habitual.

Jupyter funciona como un servicio web, que procesará nuestros ficheros con extensión “.ipynb” y nos permitirá crear, modelar, procesar y compartir nuestra inteligencia. Esta tecnología es aplicable a cualquier campo imaginable, siendo muy famosa en el procesado de datos.

Nos vamos a olvidar de toda la tecnología por detrás, ya que HELK facilita enormemente el trabajo.

Nuestro primer notebook

Veamos cómo acceder a la consola. Cuando instalamos HELK, al final de la instalación se mostraron las direcciones de todos los servicios, entre las que estaba la consola web de Jupyter.

Entre otras cosas, nos indicó:

HELK JUPYTER SERVER URL: https://192.168.129.137/jupyter/ HELK JUPYTER
CURRENT TOKEN: 8dd6ade6964ca5600b9250d7d92726d36e769192fca793b5

Cada instalación tendrá una IP diferentes y un token.

La IP es la misma que para el resto del laboratorio. Si no se tiene el token, no pasa nada, hay que ejecutar este comando en la máquina virtual para recuperarlo.

sudo docker exec -ti helk-jupyter jupyter notebook list | grep "token" | sed 's/.*token=\([^ ]*\).*/\1/'

Accediendo a la URL de Jupyter e introduciendo el token entramos a la carpeta inicial de Jupyter.

Como se puede ver, tenemos 4 carpetas.

  • En la carpeta “datasets” se guardan los eventos con los que trabajamos.
  • En la carpeta “demos” hay ejemplos precargados del proyecto HELK.
  • En la carpeta “sigma”, el creador de HELK ha realizado un trabajo titánico para transformar un total de 378 reglas sigma en consultas que es posible realizar desde estos notebooks.
  • En la carpeta “tutorials” hay tutoriales que, además de enseñarnos cómo funcionan los Jupyter Notebooks, permite aprender sobre Python, Numpy, Pandas…

Es muy recomendable dedicar algo de tiempo a los tutoriales. Hay uno para aprender Python muy introductorio, y además de aprender Python muestra el increíble potencial de los Jupyter Notebooks.

Aunque no es mi intención hacer un artículo detallando el uso de los notebooks, haremos uno de prueba y si hay interés (decidlo en los comentarios) escribiré una entrada entrando más en detalle.

Creación de Jupyter Notebooks

Ubicados en la carpeta “demos”, en la parte derecha vemos el botón “New”, que da la opción de seleccionar el Kernel que interpretará nuestro notebook. En este caso seleccionamos “Python 3”.

¡Ya tenemos nuestro primer notebook! Ahora solo tiene que hacer lo que queremos.

En el segundo artículo utilizamos uno de los datasets de Mordor para introducir en nuestro laboratorio, “empire_wmic_add_user”. Ahora vamos a automatizar la búsqueda de esta técnica.

En el primer recuadro añadimos un título y una descripción detalladas, para que cualquiera pueda entender nuestras notas. Importante añadir la táctica de ATT&CK en el título.

Jupyter interpreta Markdown, así que los notebooks se pueden decorar todo lo que se quiera. Hay que acordarse de marcar la selección de “Markdown” en la barra de herramientas.

En la siguiente celda hay que hacer las importaciones que vamos a necesitar.

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
import pandas as pd
from IPython.display import display, HTML

En otra celda creamos un cliente de Elastic Python.

es = Elasticsearch(['http://helk-elasticsearch:9200'])
searchContext = Search(using=es, index='logs-*', doc_type='doc')

Y con nuestro cliente se realiza la consulta a Elastic.

s = searchContext.query('query_string', query='(event_id:"1" AND process_command_line:*wmic.exe* AND process_command_line:"process call create *net user *add")')
response = s.execute()
if response.success():
df = pd.DataFrame((d.to_dict() for d in s.scan()))

Nótese que en la consulta he introducido el patrón del comando utilizado por Empire. Aunque esta técnica pudiera ser utilizada por otro software o malware, siempre supondrá un intento de persistencia para crear un usuario.

Ahora ya tenemos nuestros datos almacenados en un DataFrame de Panda, y solo falta mostrarlos.

display(HTML(df[['host','process_name','process_parent_name','process_command_line']].to_html()))

Una vez creado el notebook, lo guardamos con un nombre. En mi caso “[[T1136] Empire WMIC create user”.

Cuando salgamos y volvamos a entrar, veremos nuestro texto formateado. Muestro el mío:

Ahora, si nos posicionamos en la primera celda y pulsamos “Run” se ejecutarán los comandos. No pasa nada por ejecutar los que tienen texto.

A medida que avancemos, se ejecutará cada trozo de código. Al llegar al final, veremos algo así:

¡Bingo! Hemos cazado el evento que ejecutó la persistencia. Ahora, cada vez que queramos realizar esa consulta sobre nuestro laboratorio, únicamente necesitamos entrar y ejecutar nuestro notebook: hemos transformado conocimiento en inteligencia.

Aquí dejo una serie de artículos sobre el creador de HELK hablando en detalle sobre los Jupyter Notebooks, imprescindible para explotar al máximo esta increíble herramienta.

¡Nos vemos en la siguiente cacería!

Ver también en: