Mimikatz en Metasploit

Durante un Test de intrusión o PenTest, el principal objetivo del PenTester en el momento en que logra comprometer una máquina Windows, son los Hashes de autenticación para tratar de utilizarlos mediante un ataque “Pass The Hash” por toda la red.

En este post, voy a hablar sobre como poder además de obtener dichos hashes, obtener las contraseñas de los usuarios en claro, lo cual también es muy jugoso para un PenTester sobre todo en el caso de organizaciones que publican servicios como Terminal Server hacia internet.

Para obtener dichas contraseñas, utilizaremos la herramienta Mimikatz, y más concretamente su extensión para Meterpreter.

Mimikatz es una herramienta desarrollada por Benjamin Delpy (aka gentilkiwi) la cual permite extraer de la memoria de un sistema windows las credenciales de usuario en texto plano, exportar los certificados marcados como no exportables, la obtención de hashes de la SAM y algunas cosas más.

La herramienta implementa una serie de librerías con unos métodos definidos los cuales nos permiten realizar las diversas funciones soportadas.

Para poder realizar las distintas tareas que “Mimikatz” soporta es necesario tener el privilegio “SeDebugPrivilege”, para lo que necesitamos ser administradores o “System” en la maquina en cuestión.

Mimikatz funciona en todas las versiones de Windows, en 32 y 64 bits.

Puede descargarse aquí.

Aquí os dejo un enlace a un buen post sobre como utilizar «Mimikatz» de Alejandro Ramos en Security By Default.

Al igual que ocurre con “WCE”, Mimikatz es detectado por algunos fabricantes de antivirus como Software Malicioso, con lo que tener que subir el binario a la máquina víctima puede representar un problema.

Una primera solución al problema utilizando Metasploit era ejecutar el binario directamente en Memoria con el modificador “-m” del comando “execute” de Meterpreter.

Ahora, esta potente herramienta ha sido incluida en Metasploit como una extensión de Meterpreter. La extensión añade ciertos comandos a meterpreter que permiten obtener las credenciales de usuario en texto plano, y ofrece la ventaja de que el binario nunca toca el disco, simplemente se inyecta directamente en memoria. Las credenciales pueden sacarse de diversos proveedores, tales como “kerberos”, Web Auth Digest (wdigest), cuentas de Windows live (livessp) en Windows 8, etc.

Además de los comandos que permiten sacar las contraseñas, se añade un comando “mimikatz_command” que permite pasar comandos avanzados a mimikatz para realizar otras tareas como la exportación de certificados digitales.

Para empezar, voy a mostrar paso a paso como obtener las contraseñas en claro de un Windows 8 utilizando esta extensión de Meterpreter (funciona igual en otras versiones de Windows).

Obtener las contraseñas en claro de un Windows 8.

Como de costumbre comenzamos desde una sesión de Meterpreter como muestra la siguiente imagen.

mimikatz1

Desde Meterpreter intentamos escalar privilegios pero no podemos. Ahora utilizaremos el “bypassuac” para intentar escalar.

mimikatz2

Ahora ya tenemos una sesión como System en la maquina víctima, así que nos disponemos a cargar la extensión “mimikatz”.

He mostrado la salida de “sysinfo” en la imagen anterior para que se pueda apreciar el siguiente detalle. En arquitectura podemos ver que es x64, pero como se ve en la imagen, en el apartado “Meterpreter” dice “x86/Win32”. Esto es porque meterpreter está corriendo en un proceso de 32bits. Si intentamos cargar la extensión Mimikatz en estas circunstancias, se cargara la versión de 32bits y no funcionara bien. Para solucionar esto migraremos el proceso de meterpreter a otro proceso en la maquina que corra en 64bits.

(Nota: La migración del proceso hay que hacerla antes de elevar privilegios, o migrar a un proceso del usuario SYSTEM, si no el UID vuelve a ser el del usuario propietario del proceso y al intentar hacer “getsystem” da un error por que el entorno no está correcto).

mimikatz3

Hemos sacado los procesos con el comando “ps” y después mediante “migrate” hemos cambiado al PID 3544 correspondiente a “TabTip.exe” que como se ve en la imagen es “x86_64”. Después “sysinfo” nos muestra que Meterpreter corre en “x64/win64”. Ahora ya podemos cargar Mimikatz.

mimikatz4

Como al realizar los pasos anteriores habíamos migrado a un proceso del usuario “Ignacio Sorribas” después de elevar privilegios, nuestro usuario efectivo había vuelto a ser “Ignacio Sorribas” y por lo tanto Mimikatz no funcionaba correctamente.

Hemos repetido el proceso, pero esta vez migrando al proceso “spoolsv.exe        x86_64           NT AUTHORITY\SYSTEM”.

Después de la migración como puede apreciarse en la imagen seguimos siendo el usuario “SYSTEM”.

Simplemente llamando al comando “wdigest” nos aparecerán las credenciales de este proveedor que se encuentren en memoria en texto claro.

mimikatz5

Como se aprecia marcado en rojo en la imagen anterior están las contraseñas en texto del usuario “Administrador” y del usuario “Ignacio Sorribas”.

Exportar certificados no exportables.

Mimikatz también permite exportar los certificados de usuario instalados en la máquina, e incluso exportar su clave privada aunque esta se marcara como no exportable durante la instalación del certificado.

La extensión de Mimikatz en Meterpreter, no nos proporciona los comandos para la exportación de los certificados, pero nos ofrece el comando “mimikatz_command” que no es más que un “wraper” al propio mimikatz, lo que nos permitirá utilizar todas las opciones disponibles en la herramienta.

Para ello, primero llamaremos al comando “mimikatz_command –f crypto::listCertificates”.

mimikatz6

En la imagen vemos que se busca en el Store “CERT_SYSTEM_STORE_CURRENT_USER\My”, pero no aparece ningún certificado. La razón de esto es porque somos el usuario SYSTEM, y este no tiene ningún certificado en su alamacen “Personal”.

Podemos listar los certificados de Raiz del usuario actual por ejemplo.

mimikatz7

Como se ve en la imagen anterior primero mostramos los “Stores” y después listamos los certificados del “Store Root” en concreto.

El certificado que queremos exportar se encuentra en el almacén “Personal” (My para mimikatz) del usuario Ignacio Sorribas.

La primera aproximación que se me ocurrió para ver el certificado, fue llamar a “listStores” pasando como parámetro la clave “CERT_SYSTEM_STORE_USERS”.

meterpreter > mimikatz_command -f crypto::listStores -a «CERT_SYSTEM_STORE_USERS»Emplacement : ‘CERT_SYSTEM_STORE_USERS’.DEFAULT\My.DEFAULT\Root.DEFAULT\Trust.DEFAULT\CA

.DEFAULT\TrustedPublisher

.DEFAULT\Disallowed

.DEFAULT\AuthRoot

.DEFAULT\TrustedPeople

.DEFAULT\ClientAuthIssuer

.DEFAULT\SmartCardRoot

S-1-5-19\My

S-1-5-19\Root

S-1-5-19\Trust

S-1-5-19\CA

S-1-5-19\TrustedPublisher

S-1-5-19\Disallowed

S-1-5-19\AuthRoot

S-1-5-19\TrustedPeople

S-1-5-19\ClientAuthIssuer

S-1-5-19\SmartCardRoot

S-1-5-20\My

S-1-5-20\Root

S-1-5-20\Trust

S-1-5-20\CA

S-1-5-20\TrustedPublisher

S-1-5-20\Disallowed

S-1-5-20\AuthRoot

S-1-5-20\TrustedPeople

S-1-5-20\ClientAuthIssuer

S-1-5-20\SmartCardRoot

S-1-5-21-2410177577-3384890958-3281790908-1001\My

S-1-5-21-2410177577-3384890958-3281790908-1001\Root

S-1-5-21-2410177577-3384890958-3281790908-1001\Trust

S-1-5-21-2410177577-3384890958-3281790908-1001\CA

S-1-5-21-2410177577-3384890958-3281790908-1001\TrustedPublisher

S-1-5-21-2410177577-3384890958-3281790908-1001\Disallowed

S-1-5-21-2410177577-3384890958-3281790908-1001\AuthRoot

S-1-5-21-2410177577-3384890958-3281790908-1001\TrustedPeople

S-1-5-21-2410177577-3384890958-3281790908-1001\ClientAuthIssuer

S-1-5-21-2410177577-3384890958-3281790908-1001\addressbook

S-1-5-21-2410177577-3384890958-3281790908-1001\REQUEST

S-1-5-21-2410177577-3384890958-3281790908-1001\SmartCardRoot

S-1-5-21-2410177577-3384890958-3281790908-1001\UserDS

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\My

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\Root

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\Trust

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\CA

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\TrustedPublisher

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\Disallowed

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\AuthRoot

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\TrustedPeople

S-1-5-21-2410177577-3384890958-3281790908-1001_Classes\ClientAuthIssuer

S-1-5-21-2410177577-3384890958-3281790908-500\My

S-1-5-21-2410177577-3384890958-3281790908-500\Root

S-1-5-21-2410177577-3384890958-3281790908-500\Trust

S-1-5-21-2410177577-3384890958-3281790908-500\CA

S-1-5-21-2410177577-3384890958-3281790908-500\TrustedPublisher

S-1-5-21-2410177577-3384890958-3281790908-500\Disallowed

S-1-5-21-2410177577-3384890958-3281790908-500\AuthRoot

S-1-5-21-2410177577-3384890958-3281790908-500\TrustedPeople

S-1-5-21-2410177577-3384890958-3281790908-500\ClientAuthIssuer

S-1-5-21-2410177577-3384890958-3281790908-500\SmartCardRoot

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\My

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\Root

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\Trust

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\CA

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\TrustedPublisher

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\Disallowed

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\AuthRoot

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\TrustedPeople

S-1-5-21-2410177577-3384890958-3281790908-500_Classes\ClientAuthIssuer

S-1-5-18\My

S-1-5-18\Root

S-1-5-18\Trust

S-1-5-18\CA

S-1-5-18\TrustedPublisher

S-1-5-18\Disallowed

S-1-5-18\AuthRoot

S-1-5-18\TrustedPeople

S-1-5-18\ClientAuthIssuer

S-1-5-18\SmartCardRoot

meterpreter >

En la tabla podemos ver todos los “Stores” de Usuarios que hay en la maquina. Teoricamente, en el “Store My” perteneciente al usuario “Ignacio Sorribas” debería de estar el certificado (el SID S-1-5-21-2410177577-3384890958-3281790908-1001 pertenece al usuario Ignacio Sorribas).

Así pues, vamos a ver el certificado del usuario.

mimikatz8

Como se muestra en la imagen, no aparece ningún certificado personal, pero si podemos acceder a los certificados Raíz.

Arrancando la herramienta Mimikatz en local en el propio Windows 8 con el usuario “Ignacio Sorribas”, obtenemos esto.

mimikatz9

En este caso, el certificado aparece sin problemas, y si intentamos exportarlo podemos ver que solo se exporta la parte pública, no la privada ya que está marcada como no exportable. Esto se soluciona parcheando la API mediante el comando “crypto::patchcapi” si se tiene el privilegio “SeDebugPrivilege”.

Pero por alguna razón, tanto desde la extensión de Meterpreter como con la propia herramienta en local ejecutada como administrador, no podemos obtener el certificado desde “CERT_SYSTEM_STORE_USERS”.

Pero seguro que se puede conseguir de algún modo…

Recapitulando, sabemos que si ejecutamos la herramienta con el usuario en cuestión, si podemos acceder al certificado vía “CERT_SYSTEM_STORE_CURRENT_USER”, pero si no ejecutamos la herramienta como SYSTEM o Administrador, no podemos tener el privilegio necesario “SeDebugPrivilege” para parchear la API y poder exportar la clave marcada como no exportable.

Bueno, y ¿que ocurre si ejecutamos la extensión como SYSTEM, parcheamos la API, utilizamos incognito para impersonalizar al usuario víctima e intentamos sacar los certificados?

A continuación vemos en la imagen la respuesta a la pregunta anterior.

mimikatz10

Ahora si que nos muestra el certificado del usuario. Vamos a intentar exportarlo.

mimikatz11

Bingo!!!, hemos podido exportar el certificado

Nota: El certificado se exporta al directorio actual en el que se encuentra meterpreter, por lo que hay que asegurarse de que el usuario impersonalizado tiene permiso de escritura en dicho directorio o el proceso fallará. Yo simplemente antes he hecho:

Meterpreter> cd “c:\\users\\Ignacio Sorribas”Meterpreter> mkdir demoMeterpreter> cd demo

Una vez hecho esto, simplemente podemos descargar los certificados a nuestra máquina local y borrar las pruebas de la máquina víctima.

mimikatz12

Nota: A la hora de descargar, si el fichero contiene espacios en blanco hay que usar comillas dobles.

Bueno, esto es todo. Un saludo y Feliz Navidad!!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*