17 feb 2016

Powershell Empire: La post-explotación llevada al máximo nivel

Desde hace unos meses estoy jugando con Powershell Empire. Empire es un framework de post-explotación basado en el despliegue de agentes. Los agentes se ejecutan en las máquinas comprometidas y son gestionados desde una consola bajo el control del pentester. Según se puede leer en el propio sitio web de Powershell Empire, las comunicaciones están cifradas. Jugando con el framework uno se da cuenta que la fuerza del Empire radica en la integración de todos los frameworks conocidos de Pentesting con Powershell. Frameworks como Powersploit, Nishang, Posh-SecMod o PowerUp, entre otros, se integran y están disponibles para ser utilizados a través de la arquitectura que proporciona el Empire.

Una de las cosas más potentes que ofrece Powershell Empire es la posibilidad de ejecutar agentes de Powershell sin necesidad del binario powershell.exe. Esto hace que los agentes puedan ser inyectados en diferentes procesos, y pasar más desapercibido. 

¿Qué partes tiene Powershell Empire? Fundamentalmente 3: listeners, agents y stagers. A continuación se enumeran las distintas funciones y de qué se encargan dentro del juego propuesto por el Empire:
  • Listeners. Se encargan de esperar las conexiones de los agentes desplegados en las máquinas comprometidas. Podemos decir que el listener será el punto final, dónde el pentester colocará sus órdenes a ejecutar.
  • Agents. Los agentes es el código ejecutado en las máquinas comprometidas. El Empire ofrece una gran cantidad de agents, como por ejemplo uno en formato bat, vbs, dll, o incluso, un código preparado para el rubber ducky. 
  • Stagers. Los stagers son precisamente el código a generar, que una vez ejecutado se convierte en agent.
El flujo de uso es sencillo, el pentester conseguirá acceso a través de la explotación de una vulnerabilidad y podrá utilizar un stager de tipo DLL, por ejemplo, para conseguir ejecutar un agent en la máquina remota. Otro caso de uso sencillo sería aprovechar la potencia de Rubber Ducky en un ataque físico, o la ingeniería social para que el usuario ejecute un archivo. La fase de ejecución de los agentes queda en mano de los lectores. 


PoC: Conexión entre el agente y el listener

Para la prueba de concepto se va a utilizar un stager de tipo bat. En primer lugar hay que instanciar un listener sobre la máquina para recibir las conexiones de los agentes. La instrucción a ejecutar en este caso es listeners. Una vez el prompt cambia se puede consultar las opciones que existen. Para este caso, nos vale con ejecutar la instrucción execute.


La generación del fichero bat es sencilla, simplemente hay que ejecutar la instrucción usestager. Con el comando options se puede verificar que podemos cambiar y personalizar. Como se puede visualizar el entorno es muy similar al de la consola de Metasploit, está claro que @harmjoy y cia han querido darle ese toque parecido.


Si analizamos el fichero que acabamos de crear podemos encontrar que el stager se reduce a un código encodeado en base64 y que es invocado a través de una powershell.exe. Powershell ofrece la posibilidad de ejecutar código a través de base64 (-Enc), en un proceso oculto (-W Hidden) y no interactivo (-NonI). En otras palabras, un modo perfecto para pasar desapercibido. En la imagen se puede ver el contenido del fichero .bat.


Cuando el fichero .bat se ejecute en la máquina comprometida se lanzará una Powershell sin ningún profile, en modo no interactivo, con ventana oculta y ejecutará el código en base64. Ese código es el que creará la conexión en busca del listener que tenemos configurado. El listener recibirá la conexión y tendremos un nuevo agente. A partir de ese instante el pentester puede ejecutar instrucciones y módulos en la máquina remota. El funcionamiento no es inmediato, el listener prepara las órdenes y el agente realiza conexiones no continuas para obtener la lista de cosas a ejecutar. Esto hace que si en la máquina comprometida se visualizan las conexiones de red, no viésemos la conexión entre el agent y el listener.


Más de 115 módulos disponibles para que el pentester saque el jugo a la máquina comprometida. Técnicas como Pass the Hash, pivoting, exfiltración de datos, escaneo de red interno y externo, etcétera, pueden ser llevados a cabo con el agente desplegado. 

Para esta prueba elegimos un módulo que cuelga de un módulo “curioso” llamado trollsploit. Este módulo proporciona 5 funcionalidades que son las siguientes:
  • Message.
  • Process_Killer.
  • Thunderstruck.
  • Voicetroll.
  • Wallpaper.
No hace falta explicar mucho lo que hace cada funcionalidad. Elegimos para este caso el módulo message. Al ejecutarlo, en la máquina comprometida se mostrará un message box con la información configurada en el módulo.


¿Cuál es el resultado? En esta prueba de concepto se puede ver cómo el listener configuró las órdenes para el agente denominado Win7, el cual fue renombrado previamente. El agente consulta las órdenes cada N segundos contra el listener y ejecuta las instrucciones. 



5 comentarios:

  1. Hola antes que nada gracias por el aporte, pero solo me sirve local, como se le puede hacer para hacerlo externo, solo me detecta agentes de mi red ..

    ResponderEliminar
  2. @randy tendrías que abrir el puerto del router y redirigir el tráfico hacia dónde powershell empire esté escuchando (NAT).Ten en cuenta que es una conexión que viene de Internet hacia tu máquina (la cual si está detrás de un router no será vista). La dirección IP que pongas cuando creas el agent debe ser la de tu router, y como te dije, abrir el puerto en el router para que redirija el tráfico a la dirección IP privada y puerto de tu máquina.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. Buenos Pablo, estoy iniciándome en Empire, ¿Como puedes poner una ip pública al crear el agent? Hay que descodificar el payload,cambiar la ip, y volver a codificar en base64?

      Eliminar
  3. Muchas gracias por responder , Saludos

    ResponderEliminar
  4. a mi no me funciono en nat ni con ddns alguien sabe porqué?

    ResponderEliminar