
Un sistema de entrega de payloads que incrusta payloads en el archivo de icono de un ejecutable.

Blenny es una herramienta de prueba de concepto de ofuscación de payloads para Windows que oculta datos de payload ejecutables dentro del icono del ejecutable. Debe su nombre al pez blenio de dientes de sable, que imita el comportamiento y la apariencia de los peces limpiadores para cazar a peces desprevenidos.
No recuerdo exactamente cómo va la historia, pero un hacker llamado retr0id (@DavidBuchanan314) propuso la idea de ocultar un payload dentro del icono de un ejecutable. Debido a varias peculiaridades de los archivos PNG—y a que los archivos de icono de Windows pueden contener datos PNG en su interior—me di cuenta de que podía implementar esta idea con bastante facilidad; solo requeriría un poco de esfuerzo. Creé la biblioteca Facade—una biblioteca con el propósito específico de generar payloads en archivos PNG—para este mismo fin.
El resultado final es un archivo de payload compacto y un sistema de compilación que se puede utilizar para personalizar un payload básico de tipo dropper/ejecutor para Windows.
Blenny utiliza la biblioteca Facade para crear payloads a partir de archivos de icono, por lo que al clonar el repositorio, es necesario inicializar el submódulo (y sus submódulos):
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
Esto debería ser todo lo que necesitas para inicializar el repositorio para la compilación.
Este proyecto fue diseñado literalmente pensando en CMake, por lo que antes de compilar este proyecto, es un requisito absoluto obtener e instalar CMake. Probablemente no funcionará de otra manera (a menos que estés realmente empeñado en configurar manualmente todas las definiciones de CMake por ti mismo). También necesitarás una copia de Visual Studio para compilar el proyecto.
Este proyecto utiliza numerosas variables de CMake para configurar el proceso de compilación. Para obtener un payload de demostración básico, en el que una adorable oveja aterrizará en tu escritorio, puedes ejecutar lo siguiente en el directorio principal del proyecto:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
Por defecto, esto extrae un ejecutable llamado "blenny.exe" del icono del ejecutable al directorio temporal del usuario actual y luego lo ejecuta. El payload predeterminado es el DesktopPet de @AdrianoTiger, una reconstrucción dedicada del clásico esheep.exe de los años 90.
¡Todas las variables que hacen posible esto son personalizables! Es necesario establecer una variable de payload (BLENNY_TRAILING_PAYLOAD, BLENNY_TEXT_PAYLOAD, BLENNY_ZTEXT_PAYLOAD o BLENNY_STEGO_PAYLOAD). Esto controla cómo se introduce finalmente el payload en el icono. Consulta la biblioteca Facade para obtener detalles sobre estas técnicas. Por ejemplo, para usar tu propio payload, haz lo siguiente:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
Aquí tienes una tabla de todas las diferentes opciones de configuración que puedes establecer, sus valores predeterminados y qué hacen.
| Opción | Tipo | Valor predeterminado | Propósito |
|---|
| BLENNY_PAYLOAD_FILE | Cadena | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | El payload que se incrustará en el archivo de icono. Nota: Debido a que la técnica de ejecución final es ShellExecuteA, este puede ser cualquier archivo que pueda lanzarse desde Explorer, ¡como un script por lotes! |
| BLENNY_ICON_FILE | Cadena | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | El icono que se usará para el ejecutable y en el que se incrustará el payload. Nota: ¡No todos los iconos funcionan! El archivo de icono debe contener una sección PNG. ¡Comprueba los datos del icono de destino en un editor hexadecimal para ver si se incluye una imagen PNG! |
| BLENNY_TRAILING_PAYLOAD | Booleano | OFF | Habilita un payload de datos al final dentro del archivo PNG del icono. |
| BLENNY_TEXT_PAYLOAD | Booleano | OFF | Habilita un payload en la sección tEXt dentro del archivo PNG del icono. |
| BLENNY_ZTEXT_PAYLOAD | Booleano | OFF | Habilita un payload en la sección zTXt dentro del archivo PNG del icono, que es un payload tEXt comprimido. |
| BLENNY_STEGO_PAYLOAD | Booleano | OFF | Habilita un payload esteganográfico dentro del archivo PNG del icono. Nota: debido a que el tamaño de imagen de la mayoría de los iconos está limitado a 256x256, ¡no todos los payloads cabrán en esta opción! |
| BLENNY_PAYLOAD_KEYWORD | Cadena | "blenny" | Para payloads de texto/ztext, establece la palabra clave que etiqueta los datos del payload. |
| BLENNY_ADMIN | Booleano | OFF | Habilita la palabra clave runas para ejecutar el payload como administrador. |
| BLENNY_PATH | Cadena | "%TEMP%" | La ruta donde se almacena el payload antes de ejecutarlo. Las variables de entorno se expanden en el momento de la ejecución. |
| BLENNY_FILENAME | Cadena | "blenny" | El nombre de archivo que se le dará al payload al extraerlo. |
| BLENNY_RANDOM_FILENAME | Booleano | OFF | Habilita la generación de un nombre de archivo aleatorio para el payload al extraerlo. |
| BLENNY_RANDOM_FILENAME_LENGTH | Entero | 8 | Ajusta la longitud del nombre de archivo aleatorio. |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Booleano | OFF | Asigna una longitud aleatoria al nombre de archivo al extraerlo. |
| BLENNY_PAYLOAD_ARGS | Cadena | "" | Los argumentos que se le pasarán al archivo de payload al ejecutarlo. |
| BLENNY_FILE_ATTRIBUTES | Entero | 0x80 (también conocido como FILE_ATTRIBUTE_NORMAL) | Los atributos de archivo que se asignarán al archivo al crearlo. |
| BLENNY_CMD_SHOW | Entero | 5 (también conocido como SW_SHOW) | El modo de visualización del archivo de payload al ejecutarse. Otro ejemplo es SW_HIDE, que es 0. |