El lado mimi (mimikatz) de #NotPetya

Uno de los aspectos que más nos ha llamado la atención desde el laboratorio de malware de #NotPetya es el módulo que según parece contempla código de la herramienta mimikatz. Es una automatización del proceso de cualquier test de intrusión que creemos que merece la pena estudiar y tratarla con cariño, para aprender. Para el análisis nos centramos en la versión de 32 bits del binario:

Visto que como manifestó en twitter, incluso el desarrollador de mimikatz encuentra similitudes entre el malware y mimikatz, nos fijamos como primera tarea identificar las funciones que están en el github de mimikatz y en el malware:
Por ejemplo, vemos la función kuhl_m_sekurlsa_enum:
En el github de mimikatz vemos:
Otro aspecto que se observa simplemente viendo las strings del módulo es el siguiente:
Estas cadenas nos dan una idea de que el módulo sekurlsa de mimikatz podría trabajar con los “packages” msv (credential hashes) y wdigest (clear credentials). Por otro lado las cadenas Primary y CredentialKeys son típicas en cualquier salida de mimikatz.
Una vez “mapeado” el código con funciones de mimikatz, vamos a repasar la estructura lógica del malware. Para ello no hay nada como coger el main, donde podemos ver:
Lo primero que vemos es que llama a una función que hemos bautizado como readPipe. En esta función recibe como argumento la pipe que tiene que instanciar y donde después escribirá las credenciales. Esta pipe si recordáis será la que le proporcionará la dll de NotPetya. En esta función intenta tres veces acceder a ella y si no está se sale.
Después, como veis en la imagen recupera la versión del sistema con el API RtlGetNtVersionNumbers, dado que dependiendo del sistema operativo todo el proceso que realiza mimikatz para obtener las credenciales varía en memoria.
El siguiente paso es obtener los privilegios adecuados para poder acceder a lsass.exe. Para ello desde la interfaz de mimikatz haríamos, privilege::debug. El módulo del malware lo hará mediante la API RtlAdjustPrivilege. Si lo hemos lanzado con los suficiente privilegios continuará.
El siguiente paso importante es la ejecución de la función kuhl_m_sekurlsa_getLogonData(), donde inicia la lógica de mimikatz. Durante la ejecución vemos cómo la función de callback kuhl_m_sekurlsa_enum(), como era de esperar es la que está modificada, ya que es el punto donde normalmente mimikatz imprime las credenciales por pantalla. En este caso observamos lo siguiente:
Lo primero que nos encontramos es una función que realiza una serie de verificaciones para ver si las credenciales le sirven. Según hemos podido comprobar en nuestro entorno las credenciales locales de la máquina no las volcaba al pipe (si alguien nos puede dar feedback sobre este asunto se lo agradeceremos ya que no hemos profundizado en el código de esta función; sub_13E31AB). Por otro lado vemos como tiene un if donde comprueba si el paquete se corresponde con wdigest (credenciales en texto claro). Solo en ese caso llama a a1, que se corresponde con la función que hemos bautizado como dump2pipe:
Como veis hay una función dentro de este dump2pipe, que es dump_credentials, que es donde escribe al pipe:
Podemos ver incluso el formato en el que escribirá al pipe. Una vez estudiado el módulo para hacer una pequeña prueba de concepto, nos hemos creado un ejemplo muy sencillo de un programa que cree un pipe y escriba por pantalla lo que se escriba en ese pipe, con el objetivo de ver las credenciales de la máquina.
En las siguientes imágenes tenéis primero la ventana del mimikatz original mostrando las credenciales del Administrador del dominio LAB (que se había autenticado en la máquina en el pasado). En la segunda (derecha) hemos ejecutado el módulo del malware encargado de recopilar las credenciales. Y debajo tenemos nuestro programa, que lee del pipe y lo vuelca en la consola (en este caso veremos las credenciales recopiladas, esto es lo que pasará al psexec el malware).
Os pongo el ejemplo que hemos usado por si os es de utilidad para jugar con el módulo:
Como siempre, esperamos que os ayude esta entrada.

Ver también en: