Voidmaw de vxCrypt0r es una nueva técnica de evasión de escáneres de memoria. Es útil para ocultar código malicioso que sería normalmente detectado por soluciones antimalware. Básicamente, es una versión mejorada de Voidgate, pero sin todas las limitaciones anteriores.
Esta técnica es compatible con todos los beacons C2, maneja payloads multihilo y puede manejar ejecutables generados por herramientas como pe_to_shellcode, lo que le permite ejecutar prácticamente cualquier ejecutable que no sea .NET.
Así se ve en el depurador:
Esta técnica se compone de dos programas:
- Dismantle: responsable de la creación del nuevo payload
- Voidmaw: responsable de la ejecución del nuevo payload creado
1.) Dismantle:
Este programa registra todas las instrucciones ejecutadas de forma única y su offset o desplazamiento. Utilizará estos datos para crear un archivo de cabecera (header) que debe incluirse en el segundo programa (Voidmaw), responsable de la ejecución del payload.
Este programa toma un archivo de entrada que contiene el payload deseado (puede ser un beacon de Cobalt Strike o un ejecutable como Mimikatz convertido a shellcode) y lo lee en un búfer.
El programa establecerá la protección PAGE_GUARD en esa página e instalará un manejador de excepciones vectoreado (VEH). Este VEH es responsable de dos cosas:
- Manejar cualquier STATUS_GUARD_PAGE_VIOLATION que el programa genere una vez que creamos un nuevo hilo en el payload dentro de la memoria y guardar el offset y el código ensamblador ejecutado en el puntero de instrucción en una estructura unordered_map, luego estableciendo el TRAP_FLAG para desencadenar un EXCEPTION_SINGLE_STEP. Esto es necesario para restaurar la protección PAGE_GUARD en esa página de memoria, ya que activarla la eliminará.
- Manejar cualquier EXCEPTION_SINGLE_STEP desencadenado por el TRAP_FLAG que fue configurado por nuestro handler y restaurar la protección PAGE_GUARD para que podamos generar una excepción la próxima vez que la CPU intente ejecutar algo en esa página de memoria. Esto es necesario para registrar todas las instrucciones ejecutadas.
Una vez que el programa haya terminado de registrar todas las instrucciones ejecutadas, las cifrará en el unordered_map.
Después de eso, el programa creará una copia del payload ejecutado previamente y enmascarará todas las instrucciones ensamblador ejecutadas registradas con instrucciones INT3.
Una vez que se hayan completado todos los pasos mencionados anteriormente, el programa generará un archivo de salida. Este archivo es un archivo de header que debe incluir en el programa Voidmaw.
2.) Voidmaw:
Este programa es responsable de la ejecución del nuevo payload generado.
El archivo header generado mencionado anteriormente tiene 4 elementos importantes:
- El payload original enmascarado con INT3 sobre cualquier instrucción ejecutada
- La clave de cifrado XOR utilizada para descifrar los datos del unordered_map
- El unordered_map como una variable global
- Una función "InitMap" responsable de inicializar el unordered_map que contiene las instrucciones de ensamblado cifradas emparejadas con el offset donde ocurrieron
Este programa primero llamará a la función InitMap y luego creará una región de memoria donde escribirá el payload, luego instalará un VEH.
Este VEH es responsable de manejar EXCEPTION_BREAKPOINT.
Cuando creamos un nuevo hilo en el payload copiado, cada vez que matcheamos un INT3 (una instrucción que se ejecutó durante nuestra grabación y se enmascaró), dispararemos este VEH. El VEH comprobará a qué desplazamiento u offset se produjo esto. Una vez encontrado el desplazamiento, buscará ese desplazamiento en el unordered_map, copiará el ensamblado cifrado a un búfer, lo descifrará y lo escribirá en el puntero de instrucción donde se produjo la excepción.
Después de esto, el desplazamiento y el tamaño de la instrucción se colocan en una cola, donde se enmascararán de nuevo con INT3 en la siguiente excepción, ocultando así básicamente sus pasos anteriores. Solo una instrucción de ensamblado es visible por hilo.
Las instrucciones de ensamblado solo tienen 2 estados posibles: 1) enmascaradas por INT3 2) reemplazadas por el ensamblado original
Si el payload crea un nuevo hilo en alguna parte de su sección de código, si la instrucción está enmascarada, obtendremos una nueva excepción y la manejaremos también. Esto hace que esta técnica sea capaz de manejar payloads multihilo sin establecer hooks en NtCreateThread u otras formas posibles de crear un nuevo hilo.
Uso:
1.) Dismantle.exe:
.\Dismantle.exe -p "C:\mimikatz.bin" -o "./out.h" -a "privilege::debug"
Dónde:
- -p es la ruta al payload inicial
- -o es la ruta donde se guardará el archivo de cabecera que contiene el payload final
- -a es el argumento requerido para ser pasado al proceso. Esto es opcional. Si este argumento no está configurado, el programa borrará sus argumentos para evitar dar argumentos basura al payload.
2.) Voidmaw.exe: Compila con el archivo de cabecera generado anteriormente y ejecútalo. Este programa no toma argumentos y puede ser entregado como un ejecutable independiente en la máquina objetivo.
Demos:
Beacon de cobaltstrike
Generación del payloadMimikatz
Generación del payloadEjecución del payload
Comentarios
Publicar un comentario