8 jun 2020

Ofuscando ficheros con PowerShell

¡Muy buenas!

El otro día, durante unas pruebas, nos surgió la necesidad de automatizar la ofuscación de distintos ficheros .ps1 en PowerShell. Tras realizar una pequeña investigación por Internet, descubrimos una herramienta que nos llamó la atención y que os traemos hoy en este post: Invoke-Obfuscation.


La herramienta ha sido desarrollada por Daniel Bohannon, de Mandiant, y con algunos commits de Ryan Cobb, de SpecterOps (a los que sigáis el hilo de Covenant de nuestro compañero MrSquid os sonará este nombre), por lo que ya pudimos sospechar desde el principio que la herramienta no iba a ser ninguna ñapa. La podéis descargar desde este enlace.

Usar la herramienta, al estar desarrollada íntegramente en PowerShell, es algo bastante sencillo: simplemente hay que importar el módulo y llamar a la función importada.

Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
Tras esto se cargará una curiosa animación donde se aprecia el proceso (inverso) de ofuscación que vemos en la imagen del principio del post (no muy agradable si vas con prisa, creedme) y se cargará la interfaz de bienvenida siguiente:

Demasiada información, ¿verdad?
Demasiada información, ¿verdad?

Si como a nosotros te brillan los ojos cuando ves la palabra "Tutorial", os podréis dar cuenta de que el procedimiento no es complejo:


Como veis, el tutorial es bastante autoexplicativo, así que vamos a contaros paso a paso cómo hemos hecho la ofuscación de un fichero (no os diremos cual hasta el final :) ).

El primer paso sería darle al programa la ruta hasta el PS1 con el comando SET SCRIPTPATH. Para ver que se ha cargado correctamente, podemos usar el comando TEST y ver cómo se muestra en pantalla el código importado.

La primera opción -TOKEN- permite ofuscar los "tokens" del script, es decir, las tradicionales modificaciones en el código para complicar la lectura por un humano (ofuscación básica, vaya). Como veis en la siguiente imagen, el programa soporta varios métodos de ofuscación distintos... pero no caigo en ninguna situación en la que no se elija "ALL" :)

Ofuscación de tokens, check

La siguiente opción -AST- permite la ofuscación de los nodos AST. Sinceramente, sospecho lo que hace, pero no lo tengo muy claro... y total, tampoco funciona :D. Investigaré un poco y volveré a contároslo en un post más adelante.

No sé que hace esto, pero ALL :)

La siguiente opción -STRING- es más sencilla: realiza cambios en las líneas de código, cambia el orden de las funciones, invierte el texto o sustituye ciertos strings que aparezcan muchas veces.

Esto ya es liar el código por malicia, pero ese es el objetivo, ¿no? :)

La opción ENCODING permite codificar el código de distintas maneras. De nuevo, se permiten realizar varias codificaciones, a gusto del consumidor. Me parece especialmente curiosa la opción de cifrar todo el contenido en un SecureString porque, aunque la clave de descifrado queda dentro del mismo script, se podrán bypassear fácilmente muchos antivirus perimetrales.

Opciones de encoding

La siguiente opción es COMPRESS. Nunca viene mal ahorrar espacio, poco más que añadir.

Antes de comprimir eran unos 570.000 caracteres

La última opción -LAUNCHER- puede ser muy interesante ya que nos ofrece un montón de maneras de ejecutar el código ofuscado (nunca viene mal tener a mano un oneliner de CMD o PowerShell)


Si preferís tener vuestro código ofuscado guardadito en un fichero, es tan fácil como usar el comando OUT y dar la ruta de salida.

El programa es educado y te abre el Notepad para que veas que ha hecho su trabajo

Pues bien, ahora es cuando vamos a ejecutar el ps1 ofuscado:


Vale, sí, era un PowerUp normal y corriente. Pero ¿qué ocurre si ejecuto el original en la misma PowerShell?

El antivirus dice que me peine, pero el ofuscado entra perfectamente...

Ya no sólo es que vayamos a evitar que los antivirus detecten el payload en disco (¡suerte buscando firmas!) sino que, en algunos antivirus, puede incluso evitarse la detección en memoria de algunos antivirus que no implementan bien su interacción con AMSI. Aquí Windows Defender se lleva un premio, no ha habido manera de hacer que no pille el script (¡de hecho, no dejaba ni usar el Invoke-Obfuscation!)

¡Saludos!

No hay comentarios:

Publicar un comentario