Operation Clandestine Wolf – APT3 フィッシング キャンペーンにおける Adobe Flash ゼロデイ

6 月、FireEye のFireEye as a Serviceチームは、Adobe Flash Player のゼロデイ脆弱性 (CVE-2015-3113) を悪用するフィッシング キャンペーンを発見しました。攻撃者の電子メールには、無害なコンテンツまたは CVE-2015-3113 を悪用する悪意のある Adobe Flash Player ファイルのいずれかを提供する侵害された Web サーバーへのリンクが含まれていました。

アドビは、CVE-2015-3113 のパッチをアウトオブバンド セキュリティ速報ですでにリリースしています ( https://helpx.adobe.com/security/products/flash-player/apsb15-14.html )。 FireEye は、Adobe Flash Player のユーザーができるだけ早く最新バージョンに更新することをお勧めします。

FireEye MVX はこの脅威を Web 感染として検出し、IPS エンジンは攻撃を CVE-2015-3113 として報告し、SHOTPUT バックドアは Backdoor.APT.CookieCutter として報告します。

APT3

中国を拠点とする脅威グループ FireEye が APT3 (別名 UPS) として追跡しているのは、このエクスプロイトと、以前のブログ投稿Operation Clandestine Foxで特定された活動に関与しています。このグループは、FireEye Threat Intelligence が追跡するより高度な脅威グループの 1 つであり、ブラウザーベースの新しいゼロデイ エクスプロイト (Internet Explorer、Firefox、Adobe Flash Player など) を導入した歴史があります。標的ホストの悪用に成功した後、このグループはすぐに認証情報をダンプし、別のホストに横移動し、カスタム バックドアをインストールします。 APT3 のコマンド アンド コントロール (CnC) インフラストラクチャは、キャンペーン間での重複がほとんどないため、追跡が困難です。

活動概要

ここ数週間で、APT3 攻撃者は次の業界の組織に対して大規模なフィッシング キャンペーンを開始しました。

  • 航空宇宙と防衛
  • 建設とエンジニアリング
  • ハイテク
  • 電気通信
  • 交通手段

フィッシング メールに記載されている URL をクリックすると、標的は JavaScript プロファイリング スクリプトをホストする侵害されたサーバーにリダイレクトされました。ターゲット ホストのプロファイリングが完了すると、被害者は悪意のある Adobe Flash Player SWF ファイルと FLV ファイルをダウンロードしました。これにより、最終的に SHOTPUT と呼ばれるカスタム バックドアが FireEye によってBackdoor.APT.CookieCutterとして検出され、被害者のシステムに配信されました。

ペイロードは xor エンコーディングを使用して隠蔽され、有効な GIF ファイルに追加されます。

攻撃ベクトル

このキャンペーン中に APT3 が使用したフィッシング メールは、本質的に極めて一般的なものであり、ほとんどスパムのように見えました。メール本文の例:

このリンクから Apple 認定再生品 iMac を購入すると、200 ~ 450 ドル節約できます。再生品の iMac には、新品の iMac と同じ 1 年間の延長保証が付いています。供給は限られていますが、頻繁に更新されます。

躊躇しないでください。 . .>セールに行く

「>Go to Sale」という文字列は、次の URL 構造を使用したリンクでした。

hxxp://<サブドメイン>.<正当なドメイン>.<TLD>/<ディレクトリ>/<英数字ID>.html

エクスプロイトの詳細

この攻撃は、Adobe Flash Player が Flash Video (FLV) ファイルを解析する方法で、パッチが適用されていない脆弱性を悪用します。このエクスプロイトは、一般的なベクター破損技術を使用して Address Space Layout Randomization (ASLR) をバイパスし、Return-Oriented Programming (ROP) を使用してデータ実行防止 (DEP) をバイパスします。彼らの ROP 技術に対する巧妙なトリックにより、悪用が容易になり、一部の ROP 検出技術を回避できます。

シェルコードは、圧縮された Adobe Flash Player エクスプロイト ファイルに、復号化に使用されるキーとともに保存されます。ペイロードは xor エンコードされ、画像内に隠されています。

エクスプロイト パッケージング

Adobe Flash Player のエクスプロイトは、単純な RC4 パッカーでパックされています。 RC4 キーと暗号文は、パッカーがレイヤー 2 Adobe Flash Player ファイルを復号化するために使用する BinaryData blob です。復号化されると、レイヤー 2 が loader.loadBytes で実行されます。

ベクターの破損

レイヤー 2 は、古典的な Adobe Flash Player のベクター破損技術を使用して、ヒープ破損の脆弱性を ActionScript3 で利用可能な完全な相対読み取り/書き込みに発展させます。この手法では、攻撃者は Adobe Flash Player ベクターをヒープにスプレーし、書き込みの脆弱性をトリガーしてベクターの 1 つのサイズを変更します。その後、攻撃者は、AS3 からの破損した Vector オブジェクトの意図された境界の外側で、メモリへの後続の読み取りと書き込みを実行できます。この手法の詳細については、 Flash in 2015を参照してください。

攻撃者がメモリへの読み取り/書き込みアクセスを制限すると、2 番目のベクターを破壊して、0x3fffffff バイトの範囲へのアクセスを増やすことを選択します。この 2 番目のベクターは、エクスプロイトの残りの部分で使用されます。

リターン指向プログラミング

攻撃者は ROP チェーンを使用して kernel32!VirtualAlloc を呼び出し、シェルコードにジャンプする前にシェルコードを実行可能としてマークします。

シェルコードとペイロードとともに ROP チェーンをヒープに書き込む代わりに、別の手法を使用しました。通常、エクスプロイトの開発者は、Sound オブジェクトなどの組み込みの Adobe Flash Player オブジェクトを破損します。代わりに、攻撃者は、多くの引数を取る関数を使用して、AS3 で独自のクラスを定義することを選択しました。

クラスCustomClass {
public functionvictimFunction(arg1:uint, arg2:uint, …, arg80:uint):uint
}

次に、攻撃者は、スタック ポインターに追加して ROP にピボットするガジェットで関数ポインターを上書きするだけです。 ROP チェーンの絶対アドレスを特定して、典型的な xchg reg32、esp ピボットのレジスタに保存する必要はありません。さらに、ROP チェーンをスタックに格納すると、スタック ポインタがスレッドのスタック領域の外を指している場合の検出を中心に設計された ROP 検出メカニズムを回避できます。

this.customObj.victimFunction(
6f73b68b、// ret; (ROPそり)
…、
6f73b68a, //pop eax
1f140100、
6fd36da1, //Kernel32 を呼び出す!VirtualAlloc(0x1f140000, 0x10000, 0x1000, 0x40)
1f140000, // アドレス
00010000, // サイズ
00001000, // タイプ
00000040, // 保護 = RWX
6f73b68b*9 // ret (ROPsled)
6fd36da7*2 // 戻る
6f73aff0 ポップ ecx
6fd36da7
6fd36da7 jmp [eax]

)
this.customObj.victimFunction
ポインターが次のように変更されました。
00000000`6de533dc 5e ポップ rsi
00000000`6de533dd 83c448 esp,48h を追加
00000000`6de533e0 c3 ret

最後に、ROP チェーンには、VirtualAlloc の呼び出しに続く ROPsled があります。これは単なる開発の成果物である可能性があります。または、VirtualAlloc への呼び出しで制限された深さまで有効なリターン アドレスをテストする検出メカニズムをバイパスするように設計されている可能性があります。

完全なエクスプロイト フロー

1. 新しいビデオ オブジェクトを作成する

2. ペイロードを取得する

3. ビデオを新しい NetStream に添付する

4. Adobe Flash Player ベクトルをヒープにスプレーする

を。 1022 個の単位を含む 98688 個のベクトルを含むベクトルを作成する

b.各 Vector<uint> の最初の 2 つの dword を 0x41414141、0x42424242 に設定します。

5. 制御された FLV オブジェクトの穴を作成する

を。スプレー内の約 3番目のベクターごとにフリー

6. 将来のコントロール転送のためにカスタム クラス オブジェクトをスプレーする

を。新しいクラス CustomClass を定義します

私。多くの引数を持つ関数victimFunctionを定義する

b. CustomClass インスタンスへの 1007 参照の 0x100 ベクトルのベクトルを作成します。

7. FLV エクスプロイトを取得して再生する

を。 FLV ファイルは、手順 5 の穴の 1 つに攻撃者が制御するオブジェクトを割り当てます。

b.攻撃者が制御するオブジェクトは、隣接するベクトルの長さフィールドを上書きします

8. 手順 4 のように、手順 5 の穴をベクトルで埋め直します。

9. 破損したベクターを見つける

を。手順 4 からベクトルを検索します。

b.各ベクターの長さをチェックして、異常に大きいものを見つけます

10. 2 番目のベクター (Vector2) を破損する

を。手順 9 の破損したベクターを使用して、相対メモリ アドレスを読み書きする

私。隣接するベクトルのメモリを検索する

ii.長さフィールドを 0x3fffffff で上書きします

iii.長さが 0x3fffffff の破損したベクトルがスプレーに存在することを確認します

1.そうでない場合は、破損を元に戻し、次のベクターの破損を試みます

11. シェルコードを復号化し、それとペイロードをヒープに保存する

12. CustomClass.victimFunction 関数ポインターを上書きします。

を。ステップ 6 からスプレーされた CustomClass オブジェクト インスタンス参照を見つけます。

b.新しい機能は、攻撃者に制御を移す「ピボット」の形です

13. スタック上に ROP チェーンを構築し、それを呼び出します

を。 Vector2 を使用してメモリ内の ROP ガジェットを検索する

私。 kernel32!VirtualAlloc への呼び出しを含む

b.ステップ 6.ai の破損した CustomClass.victimFunction を呼び出します。

私。関数への引数は ROP チェーンのガジェットです

ii.それらは便利にスタックにプッシュされます

iii.手順 12 で破損した vtable がピボットを呼び出す

1. ROP チェーンがオンになっているため、「ピボット」はスタック ポインターに追加され、戻ります。

スタック

14. ROP チェーン呼び出しシェルコード

を。 kernel32!VirtualAlloc を呼び出す

b. jmp からシェルコードへ

15. シェルコード呼び出しペイロード

を。シェルコードは、イメージ内に格納されているペイロードのメモリを検索します

b.シェルコードは、各バイト (0 または 0x17 ではない) を 0x17 で xor してペイロードをデコードします。

結論

APT3 が標的のネットワークにアクセスできるようになると、迅速に機能し、アクセスを維持するために横方向に移動して列挙することに非常に長けています。さらに、このグループは、ゼロデイ エクスプロイト、継続的に更新されるカスタム バックドア、使い捨ての CnC インフラストラクチャを使用しているため、キャンペーン全体でそれらを追跡することは困難です。

謝辞

このブログの次の寄稿者に感謝します。

· FireEye の Joseph Obed、Ben Withnell、Kevin Zuk、Genwei Jiang、Corbin Suuffrant

参考: https ://www.mandiant.com/resources/blog/operation-clandestine-wolf-adobe-flash-zero-day

Comments

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