lunes, abril 20, 2020

HTTPRevShell: Shell reversa en PowerShell & Bypass AMSI (All-in-One)

Estas cinco semanas de confinamiento ha dado lugar a que podamos revisar más información y que intentamos evadirnos conociendo nuevos conceptos y nuevas herramientas. Hace poco estuve revisando el blog de DarkByte y encontré un artículo interesante sobre un proyecto llevado a cabo por @3v4Si0N en el que se proporciona una shell inversa en Powershell. Hasta aquí puede parecer un shell inversa más, pero lo que llamó mi atención es que ya preveía que AMSI daría guerra.

Figura 1: HTTPRevShell: Shell reversa en PowerShell & Bypass AMSI (All-in-One)

Ya hemos comentado por aquí que a veces nos dicen que iBombshell no funciona, que AMSI te la detecta y nosotros siempre respondemos que si una medida defensiva como AMSI y Windows Defender detectan la consola de iBombshell es algo bueno y positivo, pero no es lo que tú quieres cuando estas haciendo un Hacking a un Windows.

Figura 2: Hacking Windows: Ataques a sistemas y redes Microsoft

Lo ‘único’ que tiene que hacer el pentester es hacer un bypass de AMSI. Existen diferentes técnicas y en este blog se han visto unas cuantas. Es más, el propio iBombShell dispone de varias funciones de bypass de AMSI.

Figura 3: iBombShell en GitHub

La estrategia seguida por @3v4Si0N es clara: primero lanzo una función que me permita hacer el bypass de AMSI y luego ya ejecuto el código de la shell inversa. Está bien. Si nos encontramos que el día de mañana al descargar la función que nos propone @3v4Si0N nos la detecta AMSI, habría que ir parte por parte:
1. Cogemos la parte de código del bypass de AMSI e intentamos cargarlo en memoria. 
2. Si nos lo detecta. Tendremos que ir, casi o sin casi, instrucción por instrucción para ver dónde está rompiendo, es decir, dónde se está detectando. Si tenemos esto claro, lograremos llegar a la instrucción que no le gusta a AMSI. A partir de aquí la ofuscación, la modificación o el cifrado pueden ser aliados. Esto ya lo hemos visto en algún post dónde hablamos de los AMSI “Classics”. 
3. Una vez que tenemos localizado esto y conseguimos cargar la función en memoria, se ejecuta. AMSI deshabilitado. La técnica más buscada y utilizada es ScanBuffer igual a 0. De esta forma AMSI informará de que no ha leído nada, pero realmente se está ejecutando lo que queramos.
De todo esto se habla en la charla Powershell Revolution: El mundo del pentesting en tus manos que os dejo aquí en un vídeo para que te la veas y no te dejes nada sin aprender.


Figura 4: PowerShell Revolution

Y ahora vamos a ver paso a paso cómo probar estos dos escenarios de los que hemos hablando antes. Primero con conexiones HTTP y luego añadiendo una capa de cifrado SSL a las comunicaciones para tener una conexión HTTPs.

Manos a la obra: probando HTTP revshell

Se puede descargar desde su Github, recomendable hacer un clone desde su rama Dev:
git clone –b dev [git url]
De esta forma ver sus últimos avances disponibles antes de pasar a master. Como decía anteriormente, lo que me llamó la atención de la herramienta era su integración directa con un bypass de AMSI. En el script podemos encontrar una función llamada Invoke-PatchMe, la cual implementa ese bypass.

Figura 5: Función Invoke-Patchme

En la parte del command and control no hay mucho que decir, tenemos dos opciones o ir por HTTP o gestionar la shell a través de HTTPs. La segunda opción es una opción más interesante, ya que permitirá evadir la detección por análisis de lo que estamos enviando, pero se podrá detectar el uso del SSL en una comunicación, digamos no autorizada. Hay que barajar el entorno y los PROs y CONs en cada escenario de red y veremos cómo hacerlo usando este servidor escrito en Pyhton.

Figura 6: Libro de "Python para Pentesters" y "Hacking con Python" de 0xWord

La ejecución del C2 es sencilla, simplemente utilizamos o lanzamos el fichero server.py apuntando a una dirección IP y un puerto local. Tanto dirección IP como puerto son locales, y como podéis ver, el servidor está escrito en nuestro querido Python.

Figura 7: HTTP/S Revshell escrito en Python desde nuestro Kali Linux

Para el ejemplo, levantamos una Powershell en un Windows 10 y probamos a descargar el script, tal y como comenté anteriormente, si esto lo detecta AMSI habría que dividir el contenido del script e ir cargándolo poco y, quizá, necesitemos del uso de la ofuscación.

Figura 8: Pentesting con PowerShell 2ª Edición

Es decir, para aplicar esa aproximación paso a paso, sería como utilizar la estrategia Divide & Conquer (Divide y Vencerás) que tanto se usa en algorítmica tradicional, pero aplicado al mundo del pentesting en una disciplina de un ciberseguridad.

Figura 9: Ejecución Invoke-WebRev

En este caso, no hay detección por parte de AMSI, por lo que podemos invocar directamente la shell reversa. Una vez que se ejecuta la función Invoke-WebRev pasan dos cosas:
1. La primera es que se ha ejecutado el Invoke-PatchMe y AMSI se ha parcheado, logrando el bypass de éste. 
2. Ahora se invoca a la función Invoke-WebRev y se conecta contra el C2 escrito en Python.
De la primera situación podemos sacar lo siguiente. Para comprobar que AMSI está deshabilitado, si ejecutamos el comando “amsiutils” veremos que no lo reconoce. Si AMSI estuviera habilitado, el mensaje sería distinto, indicando que ha sido bloqueado por ser software malicioso. Este comando es un comando de prueba para ver si AMSI está habilitado o no.

Figura 10: Comprobando si AMSI está deshabilitado o no

Cuando la función Invoke-WebRev es ejecutada, se logra la conexión con el C2. Debemos aceptarla dando un ENTER. El juego de peticiones es curioso, ya que desde la shell se envía un POST, la primera vez, dejando abierta la conexión. Cuando queramos interactuar con la shell, contestaremos con un OK y algo más de info en forma de comando.

Figura 11: Ejecución de comando dir sobre sesión PowerShell remota

Entonces, el resultado de la ejecución de la shell se devuelve de nuevo en un POST que deja abierta la conexión para el siguiente comando. Es como si hubiera un desfase. En la siguiente imagen se puede ver la salida de la ejecución del comando “dir” sobre la Powershell remota con la que se interactúa gracias al uso de la shell implementada en Powershell.

Figura 12: Tráfico generado por HTTP ( POST y OKs)

Aquí se puede ver el tráfico por HTTP y el juego de POST y respuestas de OK. Salvo que el OK lo manda el C2 cuando quiere algo, y el POST es generado como una nueva petición que sale desde la Powershell hasta el C2 cuando se quiere devolver resultados. Es cómo utilizar HTTP de forma asíncrona.

Figura 13: Ejecución de servidor con cifrado SSL

Para ver cómo funciona la opción con SSL ejecutamos lo siguiente:
 Python server.py –ssl [ip] [puerto]
La única diferencia con el caso anterior es que hacemos uso del parámetro SSL. Tal y como se puede ver en las imágenes anterior y siguiente.

Figura 14: Ejecución con cifrado ssl

Si analizamos con Wireshark la comunicación, veremos que ya no hay tráfico por HTTP y que en cuanto enviamos comandos y obtenemos resultados, tenemos el tráfico cifrado. Ahí se puede ver el inicio de una conexión con el Client HELLO.

Figura 15: Ahora el tráfico va completamente cifrado

Sin duda es una herramienta interesante que puede ser utilizada dentro de herramientas como iBombShell o Empire. Incluso, se puede hacer uso a través de Metasploit gracias al uso de la extensión de Powershell que existe en Meterpreter. Lo ideal es almacenarla dentro de alguna DLL y que en el proceso de explotación de una vulnerabilidad se inyecte la DLL y se ejecute esta interesante shell.

Saludos,

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 16: Contactar con Pablo González

No hay comentarios:

Publicar un comentario