Powershell Empire: El imperio contraataca
La semana pasada publiqué un artículo en el que explicaba qué es Powershell Empire y las múltiples cosas que podemos realizar con los listeners, stagers y agents que ofrece la herramienta. Si jugamos un poco más podemos llegar a hacer cosas realmente útiles en una auditoria de re con sistemas Microsoft Windows, sobre todo si están como la red de equipos del Department of Homeland Security que tiene muchos con vulnerabilidades conocidas sin parchear.
El disponer de agents desplegados en una o varias máquinas puede proporcionarnos el escenario perfecto para intentar obtener privilegios, pivotar, recopilar información sensible de las máquinas, ejecutar código que ofrezca nuevas posibilidades y vías, en otras palabras, explorar múltiples vías. En el caso práctico de hoy veremos funcionalidades de Powershell Empire que permiten realizar las siguientes acciones:
Cuando tenemos el control de un agent en remoto disponemos de una gran variedad de opciones y módulos ejecutables. Uno de los módulos potentes es privsec/bypassuac_wscript, el cual permite elevar privilegios en la máquina remota. Es cierto que para que el comando bypassuac tenga éxito el contexto en el que se ejecuta el agent debe tener:
En Listener hay que configurar la dirección dónde estaremos a la escucha, como se mencionaba anteriormente. Si nos fijamos en la siguiente imagen se puede ver como el nuevo agente obtenido tiene un * dónde la columna Username. Esto quiere decir que se está ejecutando con privilegio elevado, es decir, nuestro bypass funcionó. El nombre del agent que obtenemos es aleatorio, y es recomendado renombrar para poder interactuar de manera más sencilla. Para ello se puede ejecutar el siguiente conjunto de instrucciones:
Inyectándonos en otros ambientes
Una de las cosas más interesantes para mí es la posibilidad de inyectarse en casi cualquier proceso, siempre que se tenga privilegio para ello. Por ejemplo, poder inyectar un agent en un proceso como lsass.exe. Esto haría que pasáramos muy desapercibidos.
Lo primero que se podría hacer con el agent anterior sería lanzar un tasklist que nos permita, a través de Powershell, obtener un listado de procesos que se ejecutan en la máquina y con qué privilegio. En este instante ya sabemos el PID de los procesos, lo cual lo necesitaremos para el módulo PSInject.
Para cargar el módulo de PSInject se puede utilizar dos vías: usemodule management/psinject o el comando psinject [nombre listener]. Una vez cargado el módulo disponemos de una serie de opciones que nos permiten configurar el proceso dónde nos queremos inyectar, a través del PID de éste. Si todo va bien obtendremos un nuevo agent ejecutándose en la máquina remota, pero en este caso no será lanzado por un proceso powershell.exe, por lo que pasamos un poco más inadvertidos.
Cómo se puede ver en la imagen anterior obtenemos un nuevo agent, con privilegio de SYSTEM e inyectado en el proceso lsass. A partir de aquí uno puede jugar de forma más relajada, ya que el usuario no cerrará dicho proceso.
Ejecución de código: shellcode
El último paso es la ejecución de código, cómo por ejemplo una Meterpreter desde un agent de Powershell. Para ello se utiliza el módulo code_execution/invoke_shellcode. Este módulo permite seleccionar la dirección IP o el puerto a la que se conectará la sesión de Meterpreter.
Por otro lado habrá que configurar en Metasploit el módulo exploit/multi/handler para recibir la conexión de la shellcode que lanzará el agent. La configuración debe coincidir, tanto en LHOST como en LPORT. Como peculiaridad diremos que al ser ejecutado en un proceso que ha obtenido privilegio previo, podrá ser SYSTEM desde Metasploit, tal y como se puede ver en la siguiente imagen.
En conclusión, tenemos varias fórmulas para potenciar nuestra acción en la auditoria o en un pentest y Powershell nos ofrece gran potencia y versatilidad. Cuando hice PSbot para hacer auditorias de seguridad usando Powershell, más simple que Powershell Empire, ya se podía ver la fuerza y potencia que proporciona esta herramienta que viene con Windows desde Vista.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking" y “Pentesting con Powershell”
Figura 1: Powershell Empire - El imperio contraataca |
El disponer de agents desplegados en una o varias máquinas puede proporcionarnos el escenario perfecto para intentar obtener privilegios, pivotar, recopilar información sensible de las máquinas, ejecutar código que ofrezca nuevas posibilidades y vías, en otras palabras, explorar múltiples vías. En el caso práctico de hoy veremos funcionalidades de Powershell Empire que permiten realizar las siguientes acciones:
• UAC bypass: Si las condiciones del usuario lo permiten se puede realizar una elevación de privilegios evitando UAC (User Account Control).
• Inyectar agentes: Powershell Empire permite inyectar un agent en un proceso cualquiera, sin necesidad de ejecutar powershell.exe. Esto es bastante potente e interesante para pasar desapercibido.
• Ejecución de código: Podremos ejecutar, por ejemplo, una Meterpreter y tomar el control de dicha máquina con Metasploit en un momento dado.Bypasseando UAC remotamente
Cuando tenemos el control de un agent en remoto disponemos de una gran variedad de opciones y módulos ejecutables. Uno de los módulos potentes es privsec/bypassuac_wscript, el cual permite elevar privilegios en la máquina remota. Es cierto que para que el comando bypassuac tenga éxito el contexto en el que se ejecuta el agent debe tener:
• UAC debe estar configurado por defecto en modo Windows 7: Recordad que utiliza los trucos conocidos de saltar UAC con la configuración en modo Windows 7 y que la configuración más segura es en modo Windows Vista, tal y como se explica en el libro de fortificación de Windows.
• Ser administrador: La identidad del usuario con el que se ejecutó el agent debe formar parte del grupo administradores.En el módulo se tendrá que configurar el listener al que el agent devolverá la salida del job ejecutado. Si la acción tiene éxito obtendremos la ejecución de un nuevo agente que se ejecutará como SYSTEM, por lo que dispondremos de la posibilidad de ejecutar cualquier acción en el sistema, por ejemplo, realizar un volcado de hashes con el módulo powerdump.
Figura 2: Ejecución de UAC Bypass |
En Listener hay que configurar la dirección dónde estaremos a la escucha, como se mencionaba anteriormente. Si nos fijamos en la siguiente imagen se puede ver como el nuevo agente obtenido tiene un * dónde la columna Username. Esto quiere decir que se está ejecutando con privilegio elevado, es decir, nuestro bypass funcionó. El nombre del agent que obtenemos es aleatorio, y es recomendado renombrar para poder interactuar de manera más sencilla. Para ello se puede ejecutar el siguiente conjunto de instrucciones:
1. agents
2. interact [nombre agent]
3. rename [nombre nuevo]
Figura 3: Configuración de los listeners |
Inyectándonos en otros ambientes
Una de las cosas más interesantes para mí es la posibilidad de inyectarse en casi cualquier proceso, siempre que se tenga privilegio para ello. Por ejemplo, poder inyectar un agent en un proceso como lsass.exe. Esto haría que pasáramos muy desapercibidos.
Lo primero que se podría hacer con el agent anterior sería lanzar un tasklist que nos permita, a través de Powershell, obtener un listado de procesos que se ejecutan en la máquina y con qué privilegio. En este instante ya sabemos el PID de los procesos, lo cual lo necesitaremos para el módulo PSInject.
Figura 4: Ejecución de un tasklist a través del agente |
Para cargar el módulo de PSInject se puede utilizar dos vías: usemodule management/psinject o el comando psinject [nombre listener]. Una vez cargado el módulo disponemos de una serie de opciones que nos permiten configurar el proceso dónde nos queremos inyectar, a través del PID de éste. Si todo va bien obtendremos un nuevo agent ejecutándose en la máquina remota, pero en este caso no será lanzado por un proceso powershell.exe, por lo que pasamos un poco más inadvertidos.
Figura 5: Obtención de agent con privilegio SYSTEM inyectado en lsass |
Cómo se puede ver en la imagen anterior obtenemos un nuevo agent, con privilegio de SYSTEM e inyectado en el proceso lsass. A partir de aquí uno puede jugar de forma más relajada, ya que el usuario no cerrará dicho proceso.
Ejecución de código: shellcode
El último paso es la ejecución de código, cómo por ejemplo una Meterpreter desde un agent de Powershell. Para ello se utiliza el módulo code_execution/invoke_shellcode. Este módulo permite seleccionar la dirección IP o el puerto a la que se conectará la sesión de Meterpreter.
Figura 6: Configuración y ejecución de Meterpreter |
Por otro lado habrá que configurar en Metasploit el módulo exploit/multi/handler para recibir la conexión de la shellcode que lanzará el agent. La configuración debe coincidir, tanto en LHOST como en LPORT. Como peculiaridad diremos que al ser ejecutado en un proceso que ha obtenido privilegio previo, podrá ser SYSTEM desde Metasploit, tal y como se puede ver en la siguiente imagen.
Figura 7: Sesión de Meterpreter como SYSTEM |
En conclusión, tenemos varias fórmulas para potenciar nuestra acción en la auditoria o en un pentest y Powershell nos ofrece gran potencia y versatilidad. Cuando hice PSbot para hacer auditorias de seguridad usando Powershell, más simple que Powershell Empire, ya se podía ver la fuerza y potencia que proporciona esta herramienta que viene con Windows desde Vista.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking" y “Pentesting con Powershell”
2 comentarios:
amazing article .i will definately subscribe to your feed my blog http://www.apkhill.com/
Hola, necesito comunicarme con tigo, es urgente
Publicar un comentario