Pentesting con PowerShell: Movimiento lateral con Invoke-WMIExec
En las últimas semanas y meses he ido hablando sobre diferentes técnicas de movimiento lateral como, por ejemplo, el uso de los objetos DCOM con la técnica ShellWindows - también con DCOM usando la MMC (Microsoft Management Console) - o con el uso del protocolo RDP con SharpRDP. Hoy quería mostrar otra forma de hacer un Lateral Movement (Movimiento Lateral) en un Ethical Hacking a través del uso de WMI y Powershell. Es decir, un poquito de Pentesting con PowerShell para hoy.
Ya sabemos que Powershell es muy utilizado hoy en día por cualquier Red Team y en cualquier proyecto de Ethical Hacking. La importancia que ha cobrado Powershell en la post-explotación es muy grande. Por esta razón han ido saliendo protecciones como el modo restringido del lenguaje o el propio AMSI. De estos también hemos hablado en el último año, y es que el bypass de AMSI está cotizado y es un proceso con el que cualquier pentester debe enfrentarse.
Lo dicho, hoy quería analizar el uso de WMI para hacer movimiento lateral, incluyendo una escalada de privilegios, en el caso de que se consiga el hash de un administrador local de una máquina del dominio o de la red en la que nos encontremos. La función Invoke-WMIExec puede descargarse desde el repositorio de Github de su creador Kevin Robertson.
Lo primero que nos puede llamar la atención al volcar la función en una Powershell en Windows 10 es que AMSI “no se queja”. Aunque en el artículo veremos cómo desde un Windows 7 llegamos a ejecutar código en Windows 10 gracias a este pass-the-hash, me ha resultado curioso ver que AMSI no diga nada sobre la función.
Eso sí, si tenéis activo el modo restringido del lenguaje en Powershell, éste sí que evitará la ejecución de la función. En la siguiente imagen se puede ver cómo se ha cargado la función en el proveedor de funciones de Powershell en Windows 10. Dicho esto, vamos a seguir viendo qué podemos hacer.
Ahora vamos a probar en Windows 7 con una Powershell 5.1 la función. Lo primero es descargarla a memoria y una vez cargada la vamos a ejecutar. La instrucción que vamos a lanzar es:
Tenemos que tener claro que para poder escribir en C:\ tenemos que tener privilegios en el sistema, pero estamos autenticando como Administrator, por lo que los tenemos. Aquí también hacemos escalada de privilegios en el sistema, gracias al hash.
Muchas veces nos preguntamos y podemos hacer lo mismo con un usuario que no sea RID = 500, es decir, que no sea administrador “real” de la máquina. Tal como está el sistema actualmente no, pero existe una clave en el sistema que si está activa habilita el uso del pass-the-hash a usuario no RID 500. En la siguiente imagen podemos ver cómo creamos la clave LocalAccountTokenFilterPolicy. Es una DWORD con valor 1.
Si esta clave existe, se podrá hacer un ataque de red tipo pth (pass-the-hash) con cualquier usuario. Vamos a comprobarlo. En el primer ejemplo de la imagen vemos que cambiamos el hash del usuario Administrator y la ejecución de Invoke-WMIExec falla. Acceso denegado. Después, probamos con el usuario IEUser y con su hash correcto, pero nos falla, ¿Por qué? Esa ejecución es de antes de habilitar la clave del registro anterior.
El tercer intento que ya es correcto, en lo que autenticación se refiere, funciona debido a que el hash es correcto con el usuario y la clave del registro está habilitada. El fichero boom.txt no se escribe en C:\ ya que el usuario IEUser no tiene privilegio. El último caso es el que funciona correctamente, tanto en autenticación como en la creación del fichero, ya que el usuario tiene permisos en su carpeta.
Ahora vamos a ver el resultado de la última ejecución. Se crea el fichero indicado en el parámetro Command. El escritorio del usuario IEUser recoge el archivo ridnot500.txt con el contenido “hola”, como se indicaba en la instrucción Invoke-WMIExec.
Como se puede ver esta técnica proporciona integración con Powershell, lo cual ayuda a ejecutarla en modo “fileless” y permite tener más vías para llevar a cabo este tipo de movimientos laterales en un pentest o un Ethical Hacking. Otra técnica para la mochila del pentester a tener muy en cuenta.
Como nota final, en esta campaña de encierro - donde también #YoMeQuedoEnCasa - sabéis que tenéis un descuento del 10% en todos los libros de hacking, pentesting y seguridad informática en 0xWord. Aprovechemos este tiempo para aprender muchas más cosas.Figura 1: Pentesting con PowerShell: Movimiento lateral con Invoke-WMIExec |
Ya sabemos que Powershell es muy utilizado hoy en día por cualquier Red Team y en cualquier proyecto de Ethical Hacking. La importancia que ha cobrado Powershell en la post-explotación es muy grande. Por esta razón han ido saliendo protecciones como el modo restringido del lenguaje o el propio AMSI. De estos también hemos hablado en el último año, y es que el bypass de AMSI está cotizado y es un proceso con el que cualquier pentester debe enfrentarse.
Figura 2: Libro de Pentesting con PowerShell 2ª Edición |
Lo dicho, hoy quería analizar el uso de WMI para hacer movimiento lateral, incluyendo una escalada de privilegios, en el caso de que se consiga el hash de un administrador local de una máquina del dominio o de la red en la que nos encontremos. La función Invoke-WMIExec puede descargarse desde el repositorio de Github de su creador Kevin Robertson.
Figura 3: GitHub de Kevin Robertson |
Lo primero que nos puede llamar la atención al volcar la función en una Powershell en Windows 10 es que AMSI “no se queja”. Aunque en el artículo veremos cómo desde un Windows 7 llegamos a ejecutar código en Windows 10 gracias a este pass-the-hash, me ha resultado curioso ver que AMSI no diga nada sobre la función.
Figura 4: Hacking Windows: Ataques a sistemas y redes Microsoft |
Eso sí, si tenéis activo el modo restringido del lenguaje en Powershell, éste sí que evitará la ejecución de la función. En la siguiente imagen se puede ver cómo se ha cargado la función en el proveedor de funciones de Powershell en Windows 10. Dicho esto, vamos a seguir viendo qué podemos hacer.
Figura 5: Función cargada en el proveedor de PowerShell |
Ahora vamos a probar en Windows 7 con una Powershell 5.1 la función. Lo primero es descargarla a memoria y una vez cargada la vamos a ejecutar. La instrucción que vamos a lanzar es:
Invoke-WMIExec –Hash [hash NTLM] –Target [Dirección IP]
–Username Administrator –Command [comando a ejecutar]Aquí nos damos cuenta que si ejecutamos el comando whoami no podremos ver la salida, por lo que optamos por el comando “cmd.exe /K echo hola > c:\boom.txt”. Este comando remoto levantará una CMD que pintará un “hola” y lo redirigirá a un archivo en C:\ llamado boom.txt.
Figura 6: Redirección a boom.txt |
Tenemos que tener claro que para poder escribir en C:\ tenemos que tener privilegios en el sistema, pero estamos autenticando como Administrator, por lo que los tenemos. Aquí también hacemos escalada de privilegios en el sistema, gracias al hash.
Muchas veces nos preguntamos y podemos hacer lo mismo con un usuario que no sea RID = 500, es decir, que no sea administrador “real” de la máquina. Tal como está el sistema actualmente no, pero existe una clave en el sistema que si está activa habilita el uso del pass-the-hash a usuario no RID 500. En la siguiente imagen podemos ver cómo creamos la clave LocalAccountTokenFilterPolicy. Es una DWORD con valor 1.
Figura 7: Clave que habilita que se haga el pth (pass-the-hash) |
Si esta clave existe, se podrá hacer un ataque de red tipo pth (pass-the-hash) con cualquier usuario. Vamos a comprobarlo. En el primer ejemplo de la imagen vemos que cambiamos el hash del usuario Administrator y la ejecución de Invoke-WMIExec falla. Acceso denegado. Después, probamos con el usuario IEUser y con su hash correcto, pero nos falla, ¿Por qué? Esa ejecución es de antes de habilitar la clave del registro anterior.
El tercer intento que ya es correcto, en lo que autenticación se refiere, funciona debido a que el hash es correcto con el usuario y la clave del registro está habilitada. El fichero boom.txt no se escribe en C:\ ya que el usuario IEUser no tiene privilegio. El último caso es el que funciona correctamente, tanto en autenticación como en la creación del fichero, ya que el usuario tiene permisos en su carpeta.
Figura 8: Ejecución correcta |
Ahora vamos a ver el resultado de la última ejecución. Se crea el fichero indicado en el parámetro Command. El escritorio del usuario IEUser recoge el archivo ridnot500.txt con el contenido “hola”, como se indicaba en la instrucción Invoke-WMIExec.
Figura 9: Fichero creado en C:/ |
Como se puede ver esta técnica proporciona integración con Powershell, lo cual ayuda a ejecutarla en modo “fileless” y permite tener más vías para llevar a cabo este tipo de movimientos laterales en un pentest o un Ethical Hacking. Otra técnica para la mochila del pentester a tener muy en cuenta.
Desde hoy, y durante las próximas dos semanas en @0xWord hemos puesto un descuento de un 10% de descuento con el código YOMEQUEDOENCASA en todos los productos, y hemos rebajado un 5% los VBOOKS (Cursos Virtuales). Por favor, colaboremos con quedarnos todos en casa.— 0xWORD (@0xWORD) March 16, 2020
Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González
Figura 11: Contactar con Pablo González |
No hay comentarios:
Publicar un comentario