BookinglyTech News
Ciberseguridad

EvilVM empaqueta un compilador Forth en shellcode x86_64 de 5 a 10 KB

El proyecto de seguridad ofensiva se presentó como alfa en la NolaCon de 2019 y expone un REPL sobre TCP o HTTP para ejecutar código en un sistema remoto.

3 min de lecturaLobsters0 vistas

EvilVM es un compilador de Forth nativo que se despliega como shellcode independiente de posición para x86_64. El agente completo pesa entre 5 y 10 KB según las opciones y el encapsulado que se elijan, y se controla desde un intérprete interactivo, un REPL, al que se llega por red. El código está publicado en GitHub, en el repositorio de jephthai, y la versión alfa se presentó en la NolaCon de 2019.

La idea es la de siempre en este terreno: dejar un agente en una máquina remota y trabajar sobre ella. La diferencia está en la elección de lenguaje. El intérprete exterior del Forth hace de shell interactiva, y lo que se le manda por el canal se compila y se añade a lo que el proyecto llama entorno global hiperestático, de modo que el código nuevo queda disponible para el siguiente.

Qué ofrece el entorno

El apartado de entrada y salida no está atado a una consola local: el paradigma de I/O se abstrae en flujos con capacidad de red, así que sirve lo mismo para TCP que para HTTP. Por debajo, el entorno da acceso directo a las tripas del compilador, al código máquina y a la memoria, sin capas de por medio.

Para mezclarse con código ajeno, EvilVM incluye una FFI de C sencilla. Con ella se importan DLLs, se localizan sus exportaciones y se envuelven en definiciones de función de Forth, de forma que desde el shell se llaman como cualquier otra palabra del lenguaje.

La generación de cargas útiles admite distintos esquemas de codificación y encapsulado, pensados para encajar en los escenarios habituales de entrega maliciosa: exploits, inyección y similares. Esa parte no es un añadido, sino uno de los objetivos declarados del diseño.

El Forth encaja bien aquí por dos motivos que la documentación subraya. Por abajo se queda cerca del ensamblador, y por arriba permite extender la sintaxis del lenguaje en tiempo de ejecución, algo que lo hace apto para metaprogramación.

Documentación y estado

Quien quiera probarlo tiene una guía de inicio rápido con los primeros pasos. De la charla de la NolaCon quedó una grabación en YouTube, obra de Irongeek, y las diapositivas en formato ODP y PDF.

El material, sin embargo, no permite fechar nada más allá de eso. La página de documentación no se toca desde el 6 de mayo de 2019 y no menciona cambios posteriores, versiones nuevas ni notas de compatibilidad con kernels o distribuciones actuales. Lo que hay descrito es el alfa de hace años, con el repositorio como única fuente viva. Si el shellcode de entonces sigue cargando en un x86_64 de hoy es algo que se comprueba montándolo, no leyendo la web.

Para quien trabaja en explotación o en pruebas de intrusión, el interés no está en la novedad sino en el enfoque: un lenguaje con techo alto metido en un payload de pocos kilobytes, con interoperabilidad con bibliotecas nativas y transporte configurable. Es una pieza de 2019 que sigue en pie por lo que propone, no por lo que anuncia.