SYNful Knock – Cisco ルーター インプラント – パート I

syn1 news

概要

エンタープライズ スペースのどのベンダーからのルーター インプラントも、本質的に理論的なものであり、特に実際に使用されていると広く信じられてきました。ただし、最近のベンダー アドバイザリは、これらが実際に見られたことを示しています。 Mandiantは、4 つの異なる国 (ウクライナ、フィリピン、メキシコ、インド) に広がる少なくとも 14 のそのようなルーター インプラントの存在を確認できます。

SYNful Knock は、被害者のネットワーク内で永続性を維持するために使用できる、ルーターのファームウェア イメージのステルスな変更です。それは本質的にカスタマイズ可能でモジュール式であるため、移植後に更新することができます。バックドアは非標準のパケットを疑似認証の形式として使用するため、バックドアの存在を検出することさえ困難な場合があります。

初期の感染経路は、ゼロデイ脆弱性を利用していないようです。バックドアをインストールするために、クレデンシャルはデフォルトであるか、攻撃者によって発見されたものであると考えられています。ただし、ネットワーク内でのルーターの位置は、再侵入またはさらなる感染の理想的な標的になります。

ネットワーク内のバックドアを見つけるのは難しい場合があります。ルーターインプラントを見つけることはなおさらです。この記事では、インプラントを分析するだけでなく、SYNful Knock の侵害を検出するための実用的な方法とツールも提供します。

ネットワーク上でこのインプラントを発見した場合の影響は深刻であり、他の足がかりや侵害されたシステムの存在を示している可能性が最も高いです。このバックドアは、攻撃者がこれを非常にステルスな橋頭堡として使用して、他のホストや重要なデータを伝播および侵害するための十分な機能を提供します。

インプラントの概要

このインプラントは、攻撃者がインターネットの匿名性からさまざまな機能モジュールをロードできるようにする変更された Cisco IOS イメージで構成されています。このインプラントは、秘密のバックドア パスワードを使用した無制限のアクセスも提供します。各モジュールは、ルーター インターフェイスに送信される特別に細工された TCP パケットを使用して、(HTTPS ではなく) HTTP プロトコルを介して有効になります。パケットには、非標準のシーケンスと対応する確認番号があります。モジュールは、バックドア パスワードと同様の機能を提供するルーター IOS 内の独立した実行可能コードまたはフックとして現れる可能性があります。バックドア パスワードにより、コンソールと Telnet を介してルーターにアクセスできます。

syn1

既知の影響を受けるハードウェア
  • Cisco 1841 ルータ
  • Cisco 2811 ルータ
  • Cisco 3825 ルータ

注: 最初の識別では、コア機能と IOS コード ベースの類似性に基づいて、他のモデルが影響を受ける可能性が高いことが明らかになりました。

持続性

インプラントは、変更された Cisco IOS イメージ内に常駐し、ロードされると、システムの再起動後も環境内で永続性を維持します。ただし、攻撃者によってロードされたその他のモジュールは、ルーターの揮発性メモリにのみ存在し、再起動後には使用できなくなります。フォレンジックの観点から、モジュールが揮発性メモリにロードされている場合、ルータ イメージのコア ダンプを取得することで分析できます。 [1]。

詳細

IOS バイナリへの変更は、次の 4 つの機能に分けることができます。

  1. 変換ルックアサイド バッファー (TLB) の読み取り/書き込み属性を変更します。
  2. 正当な IOS 機能を変更して、マルウェアを呼び出して初期化する
  3. 正規のプロトコル処理機能を悪意のあるコードで上書きする
  4. 正規の関数が参照する文字列をマルウェアが使用する文字列で上書きする
TLB 読み取り/書き込み属性

このマルウェアは、すべての TLB 読み取りおよび書き込み属性を強制的に読み取り/書き込み (RW) にします。この変更は、ロードされたモジュールによる IOS 機能のフックをサポートするために行われたと考えられます。 TLB 属性が RW に設定されていない場合、キャッシュされたページへの変更がメモリ内の元のページに反映されない場合があります。

これは、TLB の構成に関与していると思われる IOS 機能に 2 つのシングルバイトの変更を加えることで達成されます。変更されていない関数はレジスタの最初の 2 ビットを 1 に設定し、変更された関数は最初の 3 ビットを 1 に設定します。Mandiant は、3 番目のビットが TLB エントリの書き込み許可を制御すると考えています。図 3 は、変更された命令を示しています。

TLB 属性の変更
図 3: TLB 属性の変更

これにより、上記で説明したホストベースの指標の 1 つにつながります。 TLB 属性は、イネーブル モード コマンド「show platform」を使用して調べることができます。変更されていない IOS イメージの TLB 出力を以下の図 4 に示します。

正当な IOS イメージの TLB エントリ
図 4: 正当な IOS イメージの TLB エントリ

変更された IOS イメージがルータに組み込まれている場合、RW 属性は次のようになります。

変更された IOS イメージの TLB エントリ
図 5: 変更された IOS イメージの TLB エントリ

ルーターのハードウェアによって異なりますが、特定の範囲のメモリ アドレスは通常、読み取り専用の実行可能コード セクションです。ルーターが変更されているかどうかを判断する最も簡単な方法は、「show platform | include RO, Valid」コマンドを使用することです。結果が表示されない場合は、IOS イメージが改ざんされて、実行可能コードを変更できるようになっている可能性があります。

マルウェアを初期化する

Mandiant は、IOS イメージの読み込み中にマルウェアを実行するために、プロセス スケジューリングに関連する機能が変更されたと考えています。これが選択されたのは、変更された関数が IOS ブート シーケンスの早い段階で呼び出され、IOS が正しくブートする限り常に呼び出されるためです。関数呼び出しのターゲット アドレスは、マルウェア フック処理関数を指すように変更されます。私たちの調査では、変更された IOS でフック処理関数が呼び出し関数が有効であることを確認した後、マルウェアが初期化されることが示されています。マルウェアが起動して実行されるようになったので、元の IOS 機能を実行するため、誰も賢明ではありません。

Mandiant は、変更された関数がプロセス スケジューリング タスクにリンクされていると考えています。この動作は、呼び出されると無限ループに入るようなものです。さらに、サブ関数のいくつかは、「しきい値: %s CPU 使用率 (合計/内部):…」など、プロセスのスケジューリングに関連付けられた文字列を参照します。

マルウェア実行可能コードの配置

イメージのサイズが変化しないようにするために、マルウェアはいくつかの正当な IOS 機能を独自の実行可能コードで上書きします。攻撃者は、ルーターの現在の機能を調べ、ルーターに問題を引き起こさずに上書きできる機能を特定します。したがって、上書きされる機能は展開によって異なります。

マルウェア文字列と構成

上記のテーマに沿って、画像サイズは変更できないため、インプラントはレポート文字列の一部を独自の構成で上書きしました。これは、検出目的で使用できる侵害の別の指標です。上書きされる正規の文字列を図 6 に示します。

マルウェアによって上書きされた有効な関数に関連付けられた文字列
図 6: マルウェアによって上書きされた有効な関数に関連付けられた文字列

図 6 に示されている内容は、図 7 に示されている内容に置き換えられました。コマンド アンド コントロールで使用される HTTP ヘッダーに含まれるマルウェアの文字列と、意図的に空白にしたデフォルトのパスワードがはっきりと確認できます。これにより、潜在的な被害者が自分のネットワークを検索して侵害を探し、問題を修復する時間を提供できます。 synfulknock-at-fireeye.com まで電子メールでお気軽にお問い合わせください。侵害された疑いがある場合は、パスワードをお知らせします。

マルウェア文字列
図 7: マルウェア文字列

再び、インプラントの存在を識別するために使用できる可能性のある別のホストベースのインジケーターに到達します。ただし、構成文字列の場所は展開によって異なる場合があり、最初に検出する必要があります。

変更された IOS イメージは、通常の IOS コマンドのように見えるものを実行すると、非常に異なる疑わしい結果を生成します。

syn2

バックドア パスワード

攻撃者は、3 つの異なる認証シナリオで秘密のバックドア パスワードを利用できます。インプラントはまず、ユーザー入力がバックドア パスワードであるかどうかを確認します。その場合、アクセスが許可されます。それ以外の場合、埋め込まれたコードは、潜在的に有効な資格情報の検証のために資格情報を渡します。これにより、疑惑が最小限に抑えられます。次の 3 つのインスタンスは、バックドア パスワードを使用してアクセスできることが確認されています。

秘密のバックドアパスワードを利用できる認証機能
表 1: 秘密のバックドア パスワードを使用できる認証機能

調査によると、SSH または HTTPS セッションではバックドア パスワードへのアクセスは提供されません。これは構成の問題である可能性があり、妥協によって異なる場合があります。

正当なパスワードを使用した認証とバックドア パスワードを使用した認証の微妙な違い
図 8: 正当なパスワードを使用した認証とバックドア パスワードを使用した認証の微妙な違い
ネットワーク コマンド アンド コントロール (CnC)

インプラントのコマンド アンド コントロール部分はモジュール式で、追加機能を IOS にロードできます。 CnC 機能は、マルウェアが特定の TCP ヘッダー値とコンテンツを監視する一連の TCP トリガー パケットを必要とするため、ステルスです。ルーターでフィルターが有効になっている場合でも、TCP トリガーはマルウェアによって処理されます。マルウェアは、ルーター インターフェイス、ブロードキャスト IP、およびネットワーク アドレス (サブネットの最初の IP) の 3 つの異なるアドレスに送信されたトリガー パケットに応答します。

1. プロセスを開始するために、独自に作成された TCP SYN パケットが「埋め込まれた」ルーターのポート 80 に送信されます。シーケンス番号と確認応答番号の違いは 0xC123D に設定する必要があることに注意してください。また、ACK 番号はゼロである必要はありません。

0xC123D のシーケンスおよび確認応答オフセットを持つ TCP SYN
図 9: シーケンスと確認応答のオフセットが 0xC123D の TCP SYN

1. 通常の 3 ウェイ ハンドシェイクと同様に、マルウェアは最初の SYN メッセージを確認する TCP SYN-ACK メッセージで応答します。ただし、次の条件が存在します。

  • 確認応答番号とシーケンス番号の差は 0xC123E になりました
  • 次のハードコードされた TCP オプションが設定されています: “02 04 05 b4 01 01 04 02 01 03 03 05”
  • 緊急ポインタも 0x0001 に設定されていますが、緊急フラグは設定されていません
  • また、マルウェアは、シーケンス番号の SYN パケットから確認番号をコピーします。典型的なサーバーは通常、ランダムなシーケンス番号を生成するため、これは標準の TCP ハンドシェイクではありません。

これらの固有の条件は、Mandiant がネットワーク検出シグネチャとツールを作成するために使用した異常です。

0xC123E のシーケンスおよび確認応答オフセットを持つ TCP SYN-ACK
図 10: 0xC123E のシーケンスと確認応答オフセットを持つ TCP SYN-ACK

1. 3 ウェイ ハンドシェイクを完了するための最後の ACK の後、コントローラは次の TCP メッセージを送信します。

  • PUSH フラグと ACK フラグが設定されている
  • TCP ヘッダーの先頭から、オフセット 0x62 に文字列「text」が書き込まれます。
  • 以下に示すコマンドは、TCP ヘッダーからのオフセット 0x67 にあります。

コマンドの形式は次のとおりです。

syncommand

[CMD Data] は、静的キーでエンコードされた XOR です。デコードされた [CMD Data] の 4 バイト XOR であるチェックサム アルゴリズムがあります。

コントローラ コマンド パケット
図 11: コントローラ コマンド パケット

1. マルウェアの応答は、次の静的 HTTP/HTML サーバー応答にカプセル化されます。幸いなことに、マルウェアからの応答は XOR エンコードされていないため、簡単に解読できます。

被害者の対応

被害者の対応 (ボット)
図 12: 被害者の反応
サポートされているコマンド

このインプラントはモジュール式であると前述しました。次の表に示す 5 つのコマンドは、被害者のルーターに追加のモジュールと機能をロードするために使用されます。合計 100 個の追加モジュールをロードできますが、これらのモジュールはメモリ常駐であり、再起動または再ロード後に保持されません。

コマンド メッセージは、最初の WORD (4 バイト ビッグ エンディアン) をゼロに設定します。 2 番目の WORD は、メッセージ タイプを識別します (0 ~ 4 の値)。すべてのメッセージ タイプは、次の 8 バイトで始まります。

ID 説明
0 ロードされたモジュールとその現在の状態を一覧表示します。応答には、ID 番号を表す単語と、その後にロードされた各モジュールの状態を表す単語が含まれます。

有効な状態は次のとおりです。
00 – メモリが割り当てられています
01 – モジュールがメモリにロードされています
02 – モジュールがアクティブ化されています

たとえば、マルウェアが次のメッセージで応答した場合:

00 00 00 03 00 00 02

次に、メッセージは、モジュール 03 がアクティブ化された状態 (02) にあることを示します。
ロードされたモジュールとその現在の状態を一覧表示します。応答には、ID 番号を表す単語と、その後にロードされた各モジュールの状態を表す単語が含まれます。

有効な状態は次のとおりです。
00 – メモリが割り当てられています
01 – モジュールがメモリにロードされています
02 – モジュールがアクティブ化されています

たとえば、マルウェアが次のメッセージで応答した場合:

00 00 00 03 00 00 02

次に、メッセージは、モジュール 03 がアクティブ化された状態 (02) にあることを示します。

1 追加のモジュールをロードするためのスペースを割り当てます。このコマンドは、2 つの必要なバッファーのモジュール サイズを提供します。マルウェアは 2 つのバッファにメモリを割り当て、応答でアドレスを返します。最初のバッファーは実行可能コードで、2 番目のバッファーは構成と保存用であると思われます。このメッセージの構文は、次の形式に従います。

[WORD ID][WORD 1 番目のバッファ長][WORD 2 番目のバッファ長]

モジュール ID 0x02 の最初のバッファに 0x0C バイトを割り当て、2 番目のバッファに 0x90 バイトを割り当てるようにマルウェアに指示するコマンドの例:

00 00 00 02 00 00 00 0C 00 00 00 90

サーバーからの応答の例は、最初のバッファがメモリ アドレス 0x66012C4C にあり、2 番目のバッファが 0x650DCD20 にあることを示しています。

66 01 2C 4C 65 0D CD 20

このコマンドの実行後、モジュールの状態はゼロに設定されます。 追加のモジュールをロードするためのスペースを割り当てます。このコマンドは、2 つの必要なバッファーのモジュール サイズを提供します。マルウェアは 2 つのバッファにメモリを割り当て、応答でアドレスを返します。最初のバッファーは実行可能コードで、2 番目のバッファーは構成と保存用であると思われます。このメッセージの構文は、次の形式に従います。

[WORD ID][WORD 1 番目のバッファ長][WORD 2 番目のバッファ長]

モジュール ID 0x02 の最初のバッファに 0x0C バイトを割り当て、2 番目のバッファに 0x90 バイトを割り当てるようにマルウェアに指示するコマンドの例:

00 00 00 02 00 00 00 0C 00 00 00 90

サーバーからの応答の例は、最初のバッファがメモリ アドレス 0x66012C4C にあり、2 番目のバッファが 0x650DCD20 にあることを示しています。

66 01 2C 4C 65 0D CD 20

このコマンドの実行後、モジュールの状態はゼロに設定されます。

2 モジュールに割り当てられたメモリを設定します。このコマンドは、実行可能コードと疑わしい構成データを入力するために使用されます。

[0x80 バイト フック データ][WORD の最初のバッファーの長さ][WORD の 2 番目のバッファーの長さ] [最初のバッファー…][2 番目のバッファー…]

デフォルトのパスワード フックの機能と同様に、フック データ バッファを使用して追加のフックを IOS に挿入します。フック バッファは、フックをインストールする必要がある IOS 内のアドレスと、フックの実行時に実行するコードを提供します。

このコマンドを実行すると、モジュールの状態が 1 に設定されます。
モジュールに割り当てられたメモリを設定します。このコマンドは、実行可能コードと疑わしい構成データを入力するために使用されます。

[0x80 バイト フック データ][WORD の最初のバッファーの長さ][WORD の 2 番目のバッファーの長さ] [最初のバッファー…][2 番目のバッファー…]

デフォルトのパスワード フックの機能と同様に、フック データ バッファを使用して追加のフックを IOS に挿入します。フック バッファは、フックをインストールする必要がある IOS 内のアドレスと、フックの実行時に実行するコードを提供します。

このコマンドを実行すると、モジュールの状態が 1 に設定されます。

3 ロードされたモジュールをアクティブにします。マルウェアはフック データ バッファを解析し、モジュールを実行するために必要なフックを OS 内に作成します。唯一の引数は、モジュール ID を表す WORD です。

このコマンドの実行後、モジュールの状態は 2 に設定されます。
ロードされたモジュールをアクティブにします。マルウェアはフック データ バッファを解析し、モジュールを実行するために必要なフックを OS 内に作成します。唯一の引数は、モジュール ID を表す WORD です。

このコマンドの実行後、モジュールの状態は 2 に設定されます。

4 モジュールを削除します。モジュールに割り当てられたメモリが解放され、状態がゼロに設定されます。モジュールは、active modules コマンドに表示されなくなります。
モジュールを削除します。モジュールに割り当てられたメモリが解放され、状態がゼロに設定されます。モジュールは、active modules コマンドに表示されなくなります。

表 2: サポートされているコマンド

メッセージの最初の WORD がゼロでない場合、最初の WORD のモジュール ID に関連付けられたコードが実行されます。これにより、IOS 関数にフックされていないコードの実行が可能になります。

結論

この投稿が、この柔軟でステルスなルーター インプラントの理解を深めてくれたことを願っています。この攻撃ベクトルが非常に現実的であり、その人気と普及率が高まる可能性が高いことは明らかです。このシリーズの次の部分では、このインプラントを受動的および能動的に検出するために使用できる方法を検討します。

次のブログ エントリは、Cisco IOS コア ダンプを生成する方法を示しています。 http://blogs.cisco.com/security/offline-analysis-of-ios-image-integrity

参照: https://www.mandiant.com/resources/blog/synful-knock-acis

Comments

タイトルとURLをコピーしました