24 feb 2016

Powershell Empire: Bypasses, inyecciones y code execution

La semana pasada tratamos un tema interesante como 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 sistemas Microsoft. 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:
  • Si las condiciones del usuario lo permiten se puede realizar un bypass del UAC.
  • 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 bypassuac tenga éxito el contexto en el que se ejecuta el agent debe tener:
  • UAC debe estar configurado por defecto.
  • 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.


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>


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 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 el bot de auditoria, más simple que el Empire, ya se podía ver la fuerza y potencia que proporciona esta herramienta que viene con Windows desde Vista. 

No hay comentarios:

Publicar un comentario