
Un système de livraison de payloads qui les intègre dans le fichier d'icône d'un exécutable !

Blenny est un outil de preuve de concept d'obfuscation de payload pour Windows qui cache les données du payload exécutable dans l'icône de l'exécutable. Il doit son nom au blennie à dents de sabre, qui imite le comportement et l'apparence des poissons nettoyeurs pour piéger des poissons sans méfiance.
Je ne me souviens plus exactement comment l'histoire s'est déroulée, mais un hacker nommé retr0id (@DavidBuchanan314) a soulevé l'idée de cacher un payload dans l'icône d'un exécutable. En raison de diverses particularités des fichiers PNG-- et parce que les fichiers d'icônes Windows peuvent contenir des données PNG-- j'ai réalisé que je pouvais implémenter cette idée assez facilement, il faudrait juste un peu d'huile de coude. J'ai créé la bibliothèque Facade-- une bibliothèque ayant pour but spécifique de générer des payloads dans des fichiers PNG-- à cette fin précise.
Le résultat final est un fichier de payload compact et un système de build qui peuvent être utilisés pour personnaliser un payload de base de type dropper/exécuteur pour Windows.
Blenny utilise la bibliothèque Facade pour créer des payloads à partir de fichiers d'icônes. Ainsi, lors du clonage du dépôt, le sous-module (et ses sous-modules) doit être initialisé :
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
C'est tout ce dont vous avez besoin pour initialiser le dépôt en vue de la compilation.
Ce projet a littéralement été conçu avec CMake à l'esprit. Avant de compiler ce projet, il est absolument indispensable d'acquérir et installer CMake. Cela ne fonctionnera probablement pas autrement (à moins d'être vraiment déterminé à définir manuellement toutes les définitions CMake vous-même). Vous aurez également besoin d'une copie de Visual Studio pour compiler le projet.
Ce projet utilise de nombreuses variables CMake pour configurer le processus de compilation. Pour obtenir un payload de démonstration de base, dans lequel un adorable ami mouton se posera sur votre bureau, vous pouvez exécuter les commandes suivantes dans le répertoire principal du projet :
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
Par défaut, cela extrait un exécutable nommé « blenny.exe » de l'icône de l'exécutable vers le répertoire temporaire de l'utilisateur courant, puis l'exécute. Le payload par défaut est le DesktopPet de @AdrianoTiger, une reconstruction dédiée du classique esheep.exe des années 90.
Toutes les variables qui permettent cela sont personnalisables ! Une variable de payload (BLENNY_TRAILING_PAYLOAD, BLENNY_TEXT_PAYLOAD, BLENNY_ZTEXT_PAYLOAD ou BLENNY_STEGO_PAYLOAD) doit être définie. Cela contrôle la manière dont le payload est finalement inséré dans l'icône. Voir la bibliothèque Facade pour plus de détails sur ces techniques. Par exemple, pour utiliser votre propre payload, faites ceci :
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
Voici un tableau de toutes les différentes options de configuration que vous pouvez définir, leurs valeurs par défaut et leur rôle.
| Option | Type | Valeur par défaut | But |
|---|
| BLENNY_PAYLOAD_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | Le payload à intégrer dans le fichier d'icône. Remarque : Étant donné que la technique d'exécution finale est ShellExecuteA, il peut s'agir de n'importe quel fichier pouvant être lancé depuis l'Explorateur, comme un script batch ! |
| BLENNY_ICON_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | L'icône à utiliser pour l'exécutable et dans laquelle intégrer le payload. Remarque : Toutes les icônes ne fonctionneront pas ! Une section PNG doit être présente dans le fichier d'icône. Vérifiez les données de l'icône cible dans un éditeur hexadécimal pour voir si une image PNG est incluse ! |
| BLENNY_TRAILING_PAYLOAD | Boolean | OFF | Activer un payload de données final dans le fichier PNG de l'icône. |
| BLENNY_TEXT_PAYLOAD | Boolean | OFF | Activer un payload de section tEXt dans le fichier PNG de l'icône. |
| BLENNY_ZTEXT_PAYLOAD | Boolean | OFF | Activer un payload de section zTXt dans le fichier PNG de l'icône, qui est un payload tEXt compressé. |
| BLENNY_STEGO_PAYLOAD | Boolean | OFF | Activer un payload stéganographique dans le fichier PNG de l'icône. Remarque : en raison de la taille d'image de la plupart des icônes limitée à 256x256, tous les payloads ne rentreront pas dans cette option ! |
| BLENNY_PAYLOAD_KEYWORD | String | "blenny" | Pour les payloads text/ztext, définir le mot-clé étiquetant les données du payload. |
| BLENNY_ADMIN | Boolean | OFF | Active le mot-clé runas pour exécuter le payload en tant qu'administrateur. |
| BLENNY_PATH | String | "%TEMP%" | Le chemin où stocker le payload avant l'exécution. Les variables d'environnement sont développées au moment de l'exécution. |
| BLENNY_FILENAME | String | "blenny" | Le nom de fichier à donner au payload lors de l'extraction. |
| BLENNY_RANDOM_FILENAME | Boolean | OFF | Active la génération d'un nom de fichier aléatoire pour le payload lors de l'extraction. |
| BLENNY_RANDOM_FILENAME_LENGTH | Integer | 8 | Ajuste la longueur du nom de fichier aléatoire. |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Boolean | OFF | Donne une longueur aléatoire au nom de fichier lors de l'extraction. |
| BLENNY_PAYLOAD_ARGS | String | "" | Les arguments à donner au fichier de payload lors de l'exécution. |
| BLENNY_FILE_ATTRIBUTES | Integer | 0x80 (aka FILE_ATTRIBUTE_NORMAL) | Les attributs de fichier à donner au fichier lors de sa création. |
| BLENNY_CMD_SHOW | Integer | 5 (aka SW_SHOW) | La disposition visuelle du fichier de payload lors de l'exécution. Un autre exemple est SW_HIDE, qui vaut 0. |