
Ivy es un framework de creación de payloads para la ejecución de código fuente arbitrario de VBA (macro) directamente en memoria. El loader de Ivy logra esto mediante el uso de acceso programático en el entorno de objetos de VBA para cargar, descifrar y ejecutar shellcode.
Para ver la última versión de Ivy o para enviar un problema, consulte https://github.com/Tylous/Ivy.
Si desea obtener más información sobre las técnicas utilizadas en este framework, así como las medidas defensivas para ayudar a defenderse contra él, eche un vistazo al Artículo.
Ivy es un framework de creación de payloads para la ejecución de código fuente VBA (macro) arbitrario en memoria. El loader de Ivy hace esto abusando del acceso programático en el entorno de objetos VBA para cargar, descifrar y ejecutar shellcode. Esta técnica es lo más cercano posible a ser verdaderamente fileless, ya que la mayoría de los ataques fileless hoy en día requieren algún tipo de archivos que se depositen en el disco, evitando así las reglas estándar basadas en firmas para detectar código VBA. Los payloads VBA típicos tienen las siguientes características:
Al ejecutarse puramente en memoria, estas características de comportamiento dificultan su detección por parte de los EDR.
Los loaders de Ivy se cifran con cifrado RC4 (el cifrado AES provoca mucho bloat y tarda una eternidad en descifrarse con VBA) y luego se dividen en cadenas separadas, evitando que cualquier sandboxing reconozca estas cadenas como cadenas cifradas que deberían investigarse. Esto también evita que cualquier mecanismo de decodificación reconozca estos payloads como algo más que caracteres basura.
El loader de Ivy primero realiza una consulta de registro para habilitar "Confiar en el acceso al modelo de objetos de proyectos de VBA". Este valor de clave de registro se almacena en modo usuario, lo que permite al usuario modificar el valor sin requerir permisos elevados. El valor del registro se establece de cero a uno; si la clave de registro no existe, Ivy la creará con un valor de "1". Con este valor habilitado, se permite el acceso programático al entorno de objetos VBA desde un proceso diferente.
Una vez hecho esto, el loader generará un proceso oculto de Excel y cargará las cadenas cifradas en una función VBA. Esto se hace usando ActiveX para simular las acciones de la GUI de realizar la misma tarea. Esto ayuda a evadir muchos controles tradicionales establecidos para monitorear la ejecución. Como resultado, la función de descifrado y el shellcode se mueven de un búfer de memoria a otro, sin tocar nunca el disco. Finalmente, el loader utiliza llamadas command-GUI y ejecuta la función run, que simula el acto de hacer clic en el botón de ejecutar macro en el panel de GUI de VBA, comenzando la función de descifrado, seguida de la ejecución real del shellcode.
IMPORTANTE
El endpoint objetivo debe tener Microsoft Office instalado y activado para poder ejecutarse porque Ivy depende de abusar del acceso programático al entorno VBA de Microsoft Office.
Esto permite a Ivy usar llamadas de sistema de bajo nivel para construir su propia versión de la función de Windows WriteProcessMemory al referenciar la dirección de memoria exacta y los valores de registro indirectamente. Ivy puede sobrescribir secciones de memoria que no son escribibles sin llamar a ninguna de las funciones de API de cambio de memoria. Esto se debe a una característica de WriteProcessMemory que cambia temporalmente los permisos de la región de memoria a escribible (si tienes privilegios suficientes, que los tenemos ya que somos dueños del proceso). Escribe el valor y restaura los permisos originales sin llamar a la función VirtualProtect; en su lugar, llama automáticamente a la syscall asociada (NtProtectVirtualMemory).
Ivy no utiliza su propia versión de NtWriteVirtualMemory porque este proceso de cambiar temporalmente los permisos de memoria no ocurriría, lo que significa que la protección de la dirección de memoria específica no se modificaría y la ejecución fallaría. Esta es una "característica" que Microsoft ha lanzado para hacer que los depuradores sean más estables. Como los depuradores quieren modificar la memoria sobre la marcha, simplemente pueden modificar una sección sin tener que realizar múltiples tareas. (Consulte devblogs.microsoft.com para obtener información)
Echemos un vistazo a la serie de eventos que un EDR vería:
Una vez que todos los hooks del EDR han sido eliminados, el loader realiza su acción normal para establecer una sesión remota.
Ivy aborda esto desenganchando DLLs comunes del sistema que los EDR enganchan, esto incluye:
Al usar unhook con un tipo de payload Inject, el loader de Ivy primero desengancha el proceso de Office eliminando el EDR de él y luego elimina los hooks en el proceso inyectado. Esto asegura que ambos procesos estén libres de hooks, evitando que cualquier telemetría del proceso padre e hijo se envíe al EDR.
Usando la misma técnica para desenganchar, Ivy puede parchear funciones de ETW, evitando que se genere cualquier evento por parte del proceso. ETW utiliza syscalls integradas para generar esta telemetría. Dado que ETW es una característica nativa integrada en Windows, los productos de seguridad no necesitan "enganchar" las syscalls de ETW para obtener la información. Como resultado, para evitar ETW, Ivy parchea numerosas syscalls de ETW, vaciando los registros y devolviendo el flujo de ejecución a la siguiente instrucción. El parcheo de ETW ahora está predeterminado en todos los loaders; si desea no parchear ETW, use la opción de línea de comandos -noetw para deshabilitarlo en su loader.
Ivy fue desarrollado con go.
El primer paso, como siempre, es clonar el repositorio. Antes de compilar Ivy, necesitarás instalar las dependencias. Para instalarlas, ejecuta los siguientes comandos:
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go
Luego constrúyelo
go build Ivy.go
$ ./Ivy -h
___ ___ ___ ___ ___
|\ \ |\ \ / /||\ \ / /|
\ \ \\ \ \ / / /\ \ \/ / /
\ \ \\ \ \/ / / \ \ / /
\ \ \\ \ / / \/ / /
\ \__\\ \__/ / __/ / /
\|__| \|__|/ |\___/ /
\|___|/
(@Tyl0us)
The suffering. The pain. Can't you hear them?
Their cries for mercy?