martes, febrero 27, 2018

Powershell Empire: Trabajando el PtH (Pass the Hash) con Mimikatz

Hace ya un tiempo, más de un año para ser exacto, trabajé bastante el tema del Pentesting con Powershell. En su día hablé de qué era Powershell Empire con su potencia en la post-explotación y algunas de las cosas que se podían hacer con él. El proyecto ha seguido avanzando y tiene cosas muy interesantes de cara a su uso en un Ehtical Hacking.

Figura 1: Powershell Empire: Trabajando el PtH (Pass the Hash) con Mimikatz

Hoy quería hablar de cómo se puede utilizar Powershell Empire, como gran herramienta de post-explotación, con el objetivo de hacer un PtH o Pass the Hash, aprovechándonos de que tenemos el hash NTLM del usuario administrador. La integración entre Metasploit y Powershell Empire es, hoy en día, sencilla gracias a la posibilidad de crear un stager de Empire en formato DLL. Metasploit dispone de payloads que permiten inyectar una DLL en el proceso de explotación de una vulnerabilidad, por lo que conseguiríamos ejecutar el agente de Powershell Empire en ese instante.

Comenzando

Vamos a empezar especificando un posible escenario. Como se puede ver en la imagen, partimos de dos agentes de Empire ejecutándose en una máquina Windows. El primer agente lo hemos llamado NoPriv, mientras que el segundo agente se ha llamado Privilege. El primero de ellos, podemos suponer, fue creado en el proceso de explotación y ejecución de código de una vulnerabilidad, siendo el código ejecutado el agente. Por otro lado, el agente llamado Privilege, puede ser consecuencia de una escalada de privilegios o, por ejemplo, un bypass de UAC, llevado a cabo desde el primer agente.

Si ejecutamos el comando agents en la consola de Powershell Empire se pueden ver los diferentes agentes de los que disponemos. Además, en el username tenemos un '*', el cual nos indica que el agente se está ejecutando en un nivel de integridad alto. El nivel de integridad también se puede consultar ejecutando sysinfo dentro de la sesión de cada agente.

Figura 2: Agentes activos y niveles de privilegio

La interacción con los agentes se realiza a través del comando 'interact'. Como podemos ver en la Figura 3, si intentamos acceder a un recurso administrativo, como es C$, ni en la sesión del agente sin privilegio, ni en la sesión del agente con privilegio se puede acceder.

Figura 3: Comando interact

Este hecho podría darse por diferentes razones como, por ejemplo:
  • La máquina 10.0.0.2, la cual es un Windows 10, no tiene un usuario con la misma contraseña que el usuario con el que se ejecuta el proceso del agente.
  • Realmente el agente no está elevado. En el caso de 'NoPriv' es obvio, pero en el otro caso sí que lo está.
  • El agente 'Privilege' no está utilizando el Access token adecuado.
En este caso, la tercera opción comentada anteriormente es la correcta. El proceso del agente está elevado, pero no está utilizando el Access token del usuario Administrator. Por esta razón, vamos a utilizar el agente elevado para acceder a la SAM del sistema y poder sacar el hash NTLM del usuario Administrator.

Utilizamos el comando usemodule para acceder al módulo credentials/powerdump. Prácticamente, el módulo no necesita configuración, por lo que lo ejecutamos y obtenemos el contenido de la SAM.

Figura 4:  Ejecución del comando usemodule

Una vez se tiene la información de la SAM, y basándonos en el principio de localidad de que, si el Administrator de una máquina tiene como clave 'xxxxxx', el mismo usuario en la máquina de al lado, en ese departamento, tendrá la misma clave. Esto sigue ocurriendo en muchos lugares.

Mimikatz y el PtH

La integración de Mimikatz en Metasploit y en Powershell ayuda y mucho a simplificar el proceso e, incluso, a evitar la detección por parte de los antivirus. Para acceder al módulo utilizamos el comando usemodule y accedemos al módulo credentials/mimikatz/pth.

En este módulo hay que configurar algunos parámetros, aunque es realmente sencillo:

  • El parámetro domain puede ser configurado como WORKGROUP, si el usuario no es de dominio.
  • El parámetro ntlm debe ser configurado con el hash obtenido anteriormente del volcado de la SAM.
  • El parámetro user debe ser configurado con el usuario Administrator. El nombre del usuario dependerá del idioma de la máquina.

Una vez configurado, se ejecuta el módulo y esto genera un job para que el agente lo ejecute en la máquina Windows. El resultado es algo similar a lo que se puede ver en la parte inferior, es decir, Mimikatz crea un nuevo proceso, llamado cmd.exe, con credenciales aleatorias.

Figura 5: sustitución del Access Token

Posteriormente, Mimikatz sustituye el hash en memoria por el verdadero. Al final, Mimikatz lanza el proceso cmd.exe con las nuevas credenciales asignadas, es decir, con el Access token que nos interesa. El resultado es que obtenemos un proceso, del cual tenemos el PID, y se está ejecutando como Administrator.

Figura 6: Ejecución de mimikatz y sustitución del Access Token desde Kali Linux

Ahora, necesitamos robar el token del proceso para que el agente lo pueda usar. Desde el agente 'Privilege' ejecutamos la instrucción steal_token [PID], dónde el PID será el del proceso que Mimikatz nos ha creado.

En este instante, tenemos el Access token del usuario Administrator funcional para nosotros, por lo que si ejecutamos la instrucción 'dir \\10.0.0.2\c$' que antes nos daba problemas, ahora, no los dará.

Figura 7: Acceso a recurso privilegiado

Por último, os dejamos un video para que podáis echar un ojo al proceso y veáis el potencial que tiene Powershell Empire y herramientas como Mimikatz en un entorno preparado para el Pentesting con Powershell.


Figura 8: PoC en Vídeo

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking Windows", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

No hay comentarios:

Publicar un comentario