
Blenny は、Windows 向けの概念実証(PoC)ペイロード難読化ツールであり、実行ファイルのアイコン内に実行可能なペイロードデータを隠します。名前は sabre-toothed blenny fish に由来しており、この魚はクリーナー・フィッシュの行動と見た目を模倣して、油断した魚を捕食します。
正確な経緯は覚えていませんが、retr0id(@DavidBuchanan314)というハッカーが、実行ファイルのアイコン内にペイロードを隠すというアイデアを持ち出しました。PNG ファイルのさまざまな特性と、Windows のアイコンファイルには PNG データを含めることができるという事実により、このアイデアをかなり簡単に実装できると気付きました。多少の労力は必要ですが。私はまさにこの目的のために Facade ライブラリ--PNG ファイル内にペイロードを生成すること専用のライブラリ--を作成しました。
最終的な成果物は、コンパクトなペイロードファイルとビルドシステムであり、Windows 向けの基本的なドロッパー/実行型ペイロードをカスタマイズするために使用できます。
Blenny は、アイコンファイルからペイロードを作成するために Facade ライブラリ を使用します。そのため、リポジトリを取得する際は、サブモジュール(およびそのサブモジュール)を初期化する必要があります:
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
これで、リポジトリをビルド用に初期化するために必要なすべてです。
このプロジェクトは CMake を使うことを念頭に設計されています。そのため、このプロジェクトをビルドする前に、CMake を入手してインストールする ことが絶対に必要です。そうしないとおそらく動作しません(CMake の定義をすべて手動で設定しようという本当に強い意志がない限り)。また、プロジェクトをコンパイルするには Visual Studio のコピーも必要です。
このプロジェクトでは、ビルドプロセスを設定するために多数の CMake 変数を使用します。かわいい羊の友達がデスクトップに現れる基本的なデモンストレーション用ペイロードを生成するには、プロジェクトのメインディレクトリで次のコマンドを実行します:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
デフォルトでは、実行ファイルのアイコンから「blenny.exe」という名前の実行ファイルを現在のユーザーの一時ディレクトリに展開してから、それを実行します。デフォルトのペイロードは、@AdrianoTiger の DesktopPet です。これは90年代のクラシックな esheep.exe を専用に再ビルドしたものです。
これを実現するすべての変数はカスタマイズ可能です! ペイロード変数(BLENNY_TRAILING_PAYLOAD、BLENNY_TEXT_PAYLOAD、BLENNY_ZTEXT_PAYLOAD、または BLENNY_STEGO_PAYLOAD)のいずれかを設定する必要があります。これは、ペイロードが最終的にアイコンにどのように詰め込まれるかを制御します。これらの技術の詳細は Facade ライブラリ を参照してください。たとえば、独自のペイロードを使用するには、次のようにします:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
以下は、設定できるすべての構成オプション、そのデフォルト値、および機能の表です。
| Flag | Type | Default value | Purpose |
|---|
| BLENNY_PAYLOAD_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | アイコンファイルに埋め込むペイロード。注: 最終的な実行技術は ShellExecuteA であるため、これはバッチスクリプトなど、エクスプローラーから起動できる任意のファイルにすることができます! |
| BLENNY_ICON_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | 実行ファイルに使用し、ペイロードを埋め込むアイコン。注: すべてのアイコンで動作するわけではありません! アイコンファイルには PNG セクションが含まれている必要があります。対象のアイコンデータをヘックスエディタで確認して、PNG 画像が含まれているかどうかを確認してください! |
| BLENNY_TRAILING_PAYLOAD | Boolean | OFF | アイコンの PNG ファイル内に末尾データペイロードを有効にします。 |
| BLENNY_TEXT_PAYLOAD | Boolean | OFF | アイコンの PNG ファイル内に tEXt セクションペイロードを有効にします。 |
| BLENNY_ZTEXT_PAYLOAD | Boolean | OFF | アイコンの PNG ファイル内に zTXt セクションペイロードを有効にします。これは圧縮された tEXt ペイロードです。 |
| BLENNY_STEGO_PAYLOAD | Boolean | OFF | アイコンの PNG ファイル内にステガノグラフィーペイロードを有効にします。注: ほとんどのアイコンの画像サイズは 256x256 に制限されているため、すべてのペイロードがこのオプションに収まるわけではありません! |
| BLENNY_PAYLOAD_KEYWORD | String | "blenny" | テキスト/ztext ペイロードの場合、ペイロードデータにラベルを付けるキーワードを設定します。 |
| BLENNY_ADMIN | Boolean | OFF | runas キーワードを有効にして、ペイロードを管理者として実行します。 |
| BLENNY_PATH | String | "%TEMP%" | 実行前にペイロードを保存するパス。環境変数は実行時に展開されます。 |
| BLENNY_FILENAME | String | "blenny" | 展開時にペイロードに付けるファイル名。 |
| BLENNY_RANDOM_FILENAME | Boolean | OFF | 展開時にペイロード用のランダムなファイル名を生成できるようにします。 |
| BLENNY_RANDOM_FILENAME_LENGTH | Integer | 8 | ランダムなファイル名の長さを調整します。 |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Boolean | OFF | 展開時にファイル名にランダムな長さを付けます。 |
| BLENNY_PAYLOAD_ARGS | String | "" | 実行時にペイロードファイルに渡す引数。 |
| BLENNY_FILE_ATTRIBUTES | Integer | 0x80 (別名 FILE_ATTRIBUTE_NORMAL) | 作成時にファイルに付けるファイル属性。 |
| BLENNY_CMD_SHOW | Integer | 5 (別名 SW_SHOW) | 実行時のペイロードファイルの表示状態。別の例としては、0 の SW_HIDE があります。 |