脅威のスポットライト: MenuPass/QuasarRATバックドア

By The Cylance Threat Research Team

本ブログ記事は、2019年6月10日に米国で公開された抄訳版です。原文はこちらからご覧頂けます。

はじめに

2018年後半、BlackBerry Cylanceの脅威リサーチャーたちは、ヨーロッパ、中東、およびアフリカ地域における複数業種の企業を標的としたキャンペーンを追跡しました。このキャンペーンは脅威アクター「MenuPass(別名:APT10/Stone Panda/Red Apollo)」と関係があると思われ、QuasarRATというオープンソースのバックドアを利用して組織内での持続性を確保していました。私たちは、機械学習(ML)を利用して弊社のマルウェアコーパスを分析することで、特定の標的向けにカスタマイズされた、異なるローダーの亜種をいくつか特定しました。MenuPassグループのメンバー数人がFBIに摘発されたのとほぼ同時期の2018年末以来、新たなQuasarRATのサンプルは観察されていません。

QuasarRATは、C#で記述された軽量なリモート管理ツールです。システム情報の収集、アプリケーションのダウンロードと実行、ファイルのアップロード、キー入力の記録、スクリーンショットの取得、カメラ映像の録画、システムパスワードの取得、およびシェルコマンドの実行が可能です。リモートアクセス型トロイの木馬(RAT)が、カスタムメイドのローダー(別名:DILLWEED)によって読み込まれます。暗号化されたQuasarRATペイロードがMicrosoft.NETディレクトリに格納され、メモリ内に復号され、CLRホストアプリケーションを使用してインスタンスが作成されます。後の亜種では、さらに追加のコンポーネントを使って、サービスとしてのRAT(別名:DILLJUICE)がインストールされます。

以下の技術的分析は、MenuPassによって開発されたカスタムメイドのQuasarRATローダーと、QuasarRATバックドアに行われた変更に焦点を当てています。

QuasarRATローダーについて

概要

TQuasarRATローダーは通常、64ビットのサービスDLLとして届きます。その主要な目的は、CppHostCLR手法を使用して、埋め込まれた.NETアセンブリをメモリ内で復号、読み込み、起動することです。この手法は、Microsoftデベロッパーセンターでサンプルとして提供されているコードスニペットに基づいています。ConfuserExによって難読化されたアセンブリは、その後、別個の悪意ある.NETモジュールの発見、復号、および実行を行います。暗号化されたモジュールは、%WINDOWS%/Microsoft.NETディレクトリに格納されます。 

調査時には、ローダーの複数の亜種に遭遇しました。これは1年以上に及ぶ開発の軌跡を示すものでした。また、こうしたローダーの亜種に属する暗号化されたペイロードファイルの一部(全部ではありません)も見つかりました。これらのペイロードは、復号後、 オープンソースコードQuasarRAT[1]バージョン2.0.0.0および1.3.0.0をベースとするバックドアであることが判明しました。

特徴

  • 難読化のための複数レイヤー
  • ペイロードとその直接のローダーは.NETアセンブリ
  • 初期ローダーはCppHostCLR[2]手法を使用して、.NETローダーアセンブリを注入し、実行
  • ペイロードは、Microsoft.NETディレクトリに暗号化して格納
  • QuasarRATを読み込むことが知られているが、他の任意の.NETペイロードとともに動作する可能性あり

初期ローダーとAntiLib

初期ローダーバイナリは64ビットPE DLLで、サービスとして実行することが意図されています。DllMain関数は空で、悪意のあるコードはServiceMainのエクスポートに含まれています。一部の亜種には、ランダムに命名された追加のエクスポートが含まれ、これが悪意のあるサービスを作成します。より新しいバージョンでは、この機能はスタンドアロンのモジュールに移行しています。

マルウェアはまず、埋め込まれた次のステージの実行可能ファイルの難読化を解除します。最も早期の亜種では、これはランダムな文字からなる8バイトのハードコードされた1つのキーを用いたシンプルなXORを使って実行されます。より新しい亜種では、1バイトのキーを2つ必要とするアルゴリズムに基づく、少しだけ高度なXORを使用します。このアプローチは、XORブルートフォース試行を阻止するために実装された可能性もあります。


図1:第2ステージの復号ループ

亜種3からは、.NETインジェクションメカニズムが第2ステージのDLL内に実装されており、これはデバッグ文字列によると、"AntiLib"というプロジェクトの一部に見えます。


図2:亜種3のデバッグ文字列

このDLLは、難読化されたシェルコードのようなルーチンによりメモリに反射型で読み込まれ、"FuckYouAnti"という明確な名前を持つエクスポートを実行することで呼び出されます。より古いサンプルにはこの第2ステージのライブラリは含まれず、.NET読み込み機能は初期ローダーに直接実装されています。


図3:コードおよび第2ステージDLLエクスポートテーブル内のFuckYouAnti文字列

実行されると、"FuckYouAnti"関数は、ハードコードされたキーの別のペアを用いる同じXORベースのアルゴリズムを使用して、.NETローダーバイナリを復号します。

アセンブリをメモリに直接読み込むために、このマルウェアは"CppHostCLR"という手法を利用します。この手法については、Microsoftデベロッパーセンターで詳しく説明されています。このコードは、Microsoftから提供されているサンプルコードに似ています。ハードコードされたクラス名とメソッド名(これらはランダムでサンプルごとに異なります)を使用して、ローダーのエントリポイントを起動します。


図4:CppHostCLR手法の使用


図5:.NETアセンブリローダーの起動

文字列の暗号化

ハードコードされた.NETバージョン文字列と持続性に関する複数の文字列(早期の亜種におけるもの)は、カスタムのアルゴリズムを使って暗号化されています。このアルゴリズムは、16バイトのXORと組み合わされた、AES-256のシングルユニットT-box実装をベースとしています。どちらのキーもハードコードされており、最も古い亜種を除き、各サンプルで異なります。最も古い亜種では、キーが"1234567890ABCDEF1234567890ABCDEF"と"1234567890ABCDEF"にそれぞれ設定されており、どのサンプルでも同じです。


図6:AESおよびXOR復号キーの例


図7:文字列の復号ルーチン

デジタル証明書

亜種3のローダーに属するサンプルには、Symantecの連署を持つ、CONVENTION DIGITAL LTDの有効なデジタル署名(シリアル番号:52 25 B8 E2 2D 3B BC 97 3F DD 24 2F 2C 2E 70 0C)が付いています。


図8:亜種3のデジタル証明書

.NETローダー

実行されると、悪意のあるアセンブリは、%WINDOWS%/Microsoft.NETにある全ファイルを順に処理し、指定のサイズに一致するファイルの復号を試みます。これは、CBCモードにおけるRijndaelManagedアルゴリズムの実装を使用します。


図9:暗号化されたペイロードの検索


図10:最終的なペイロードの復号

復号に成功すると、マルウェアは復号されたアセンブリを読み込み、指定されたメソッドを起動しようと試みます。


図11:バックドアペイロードの起動

最終的なペイロードアセンブリは、暗号化されたファイルとしてMicrosoft.NET Frameworkディレクトリ内のいずれかの場所に格納されます。Frameworkのバージョンは、暗号化された形式でローダーバイナリにハードコードされており、ほとんどのサンプルでは"v4.0.30319"に設定されています。格納場所はサンプルによって異なり、同じディレクトリにある他の正規ファイルの1つを模倣してファイル名が付けられます。以下にパスの例を示します。

  • %WINDOWS%/Microsoft.NET/Framework/v4.0.30319/WPF/Fonts/GlobalSerif.CompositeFont.rsp
  • %WINDOWS%/Microsoft.NET \Framework\v4.0.30319\Microsoft.Build.Engine.dll.uninstall

ペイロードは復号され、"Client"としてメモリ内に読み込まれます。Clientには2.0.0.0と1.3.0.0の2つのバージョンがありました。これらは似ており、両方とも構成セクションのバージョン文字列は"2.0.0.0"に設定されています。


図12:メモリ内のバックドアアセンブリ(バージョン2.0.0.0)


図13:メモリ内のバックドアアセンブリ(バージョン1.3.0.0)

QuasarRATバックドア

QuasarRATは、合法的なシステム管理および従業員監視のために設計、と唱われているオープンソースプロジェクトです。そのコードとドキュメントはGitHubで提供されています。

特徴:

図14:Quasar GitHubリポジトリのREADME.md

動作

この.NETペイロードは、QuasarRAT[3]というオープンソースのリモート管理ツールをベースとする、非常に難読化されたバックドアです。その構成はSettingsというクラスに格納され、隠したい文字列値はCBFモードでAES-128を使って暗号化され、base64でエンコードされています。この文字列の復号キーは、Settings内のENCRYPTIONKEY値から導かれ、すべての文字列で同じになります。


図15:部分的に暗号化された構成(難読化解除の後)

この脅威アクターは元のバックドアを変更して独自のフィールドを構成に追加し、インターネット接続をチェックするためのコードを追加しています。構成の最後の値に有効なURLアドレスが指定されている場合、このマルウェアはそのURLのコンテンツのダウンロードを試行します。そしてダウンロードに成功した場合のみ、コマンド&コントロール(C2)サーバーに接続します。


図16:カスタムの接続チェック

バックドアは、IPアドレスが構成のHOSTS値で指定されているC2サーバーと通信します。すべての通信は、構成のKEY値とAUTHKEY値を使い、CBFモードでAES-128を用いて暗号化されます。


図17:メモリ内で復号されたC2 IPアドレス

復号された構成の例:

他の観察事項

ローダー亜種の相違点

すべての亜種に共通の特徴:

  • 収集されたサンプルのほとんどは、VisualStudio 2010 RTMビルド30319を使ってコンパイルされているようだが、亜種4だけは異なる/未知のコンパイラシグネチャを使用している。
  • 一部の文字列は、XORと組み合わされたAES256のカスタム実装に基づくアルゴリズムを使用して暗号化されている。
  • .NETローダーは常に、Microsoft CPPHostCLRメソッドを使って注入される。そのエントリポイントのクラス/メソッド名はランダムで、各サンプルで異なる。
  • .NETローダーはConfuserEx v1.0.0を使用して難読化されている。

亜種2以降に共通の特徴:

  • .NETローダーのサイズは65,536バイト   
  • .NETローダーの内部名は、.NETランタイムディレクトリにある有効なファイル名をランダムに模倣する。 
  • 第2ステージは、2つのハードコードされた1バイトキー(キーはサンプルごとに異なる)を使い、XORベースのアルゴリズムを使用して暗号化される。 
  • 文字列を復号するためのAESキーとXORキーは、サンプルごとに異なるランダムに生成された文字列として、ハードコードされて格納されている。

亜種1:

  • 想定される開発タイムライン:2017年6月~2017年12月
  • 初期ローダーバイナリのサイズ:最大150KB
  • .NETローダーのサイズ:56,832バイト
  • .NETローダーの内部名:loader.dat/loader2.dat
  • 含まれる難読化レイヤーは1つだけ
  • 第2ステージは、8つのランダムな大文字/小文字からなるハードコードされたキーを使い、シンプルなXORを使用して暗号化されている
  • ランダムに命名されたエクスポートを含み、このエクスポートが持続性メカニズムとしてサービスを作成する
  • ハードコードされた文字列復号キー
    • AES = 1234567890ABCDEF1234567890ABCDEF
    • XOR = 1234567890ABCDEF

亜種2:

  • 想定される開発タイムライン:2018年1月
  • 初期ローダーバイナリのサイズ:163~169KB

亜種3:

  • 想定される開発タイムライン:2018年2月
  • 初期ローダーバイナリのサイズ:262KB
  • 2番目の難読化レイヤーが追加される
  • ServiceMain内の関数が第2ステージのDLL(SvcDll.dll)とシェルコードのようなルーチンを復号し、ルーチンがこのDLLをメモリに注入して、"FuckYouAnti"エクスポートを呼び出す
  • 第2ステージ+ローダーのサイズ:163,840バイト
  • このバージョンの一部のサンプルには、デバッグ文字列が含まれる
  • このバージョンの一部のサンプルは、Symantecから発行されたCONVENTION DIGITAL LTDの有効な証明書によって署名されている
    • シリアル番号:52 25 B8 E2 2D 3B BC 97 3F DD 24 2F 2C 2E 70 0C

亜種4:

  • 想定される開発タイムライン:2018年4月
  • 初期ローダーのサイズ:439KB
  • 第2ステージ+ローダーのサイズ:236,532バイト。以前の各バージョンと比較すると、最大72KBの静的バッファが追加されている
  • 持続性メカニズムの設定は、スタンドアロンモジュール(DILLJUICE)[4] に移行している
  • このバージョンでは、異なる/未知のコンパイラが使用されている

亜種5:

  • 想定される開発タイムライン:2018年4月~5月
  • 初期ローダーのサイズ:291~293KB
  • 第2ステージ+ローダーのサイズ:236,532バイト 
  • 第2ステージの復号機能は別個のサブルーチンに移行している
  • 2,000~5,000バイトのランダムな長さを持つランダムなbase64文字列の記載が追加されている。これはポリモーフィックのためのシンプルな手段の可能性がある(バージョン5のみ)
  • この亜種の複数のより新しいサンプルでは、AntiLibのFuckYouAnti関数が、追加のミューテックスとして"ABCDEFGHIGKLMNOPQRSTUVWXYZ"を作成する

亜種6:

  • 想定される開発タイムライン:2018年7月~8月
  • 初期ローダーのサイズ:341~394KB
  • 第2ステージ+ローダーのサイズ:236,532バイト
  • 第2ステージの復号はServiceMainに戻る

亜種:

SHA256

亜種

サイズ

ファイル名

e24f56ed330e37b0d52d362eeb66c148d09c25721b1259900c1da5e16f70230a

1

153600

prints.dll

9bbc5b8ad7fb4ce7044a2ced4433bf83b4ccc624a74f8bafb1c5932c76511308

1

153600

EntApp.dll

fe65e5c089f8a09c8a526ae5582aef6530e1139d4a995eb471349de16e76ec71

1

153600

LSMsvc.dll

cf08dec0b2d1e3badde626dbbc042bc507733e2454ae9a0a7aa256e04af0788d

1

155136

useracc.dll

239e9bc49de3e8087dc5e8b0ce7494dabce974de220b0b04583dec5cd4af35e5

2

166912

Sezlnsrsvc.dll

cf981bda89f5319a4a30d78e2a767c54dc8075dd2a499ddf79b25f12ec6edd64

2

166912

wlytkansvc.dll

41081e93880cc7eaacd24d5846ae15016eb599d745809e805deedb0b2f7d0859

2

166912

Wbyfziosrvc.dll

1ddb533be5fa167c9a6fce5d1777690f26f015fcf4bd82efebd0c5c0b1e135f2

2

167728

tk.dll

26866d6dcb229bf6142ddfdbf59bc8709343f18b372f3270d01849253f1caafb

3

268872

Mpnrrdim.dll

7f7fc0db3ea3545f114ed41853e4dc3764addfa352c28b1f6643d3fdaf7076c5

3

268872

Witwaservc.dll

c8c707575bb87c17ec17c4517c99229a993f80a76261191b2b89d3cb88e24aea

3

268872

Icyowsvcext.dll

6037b5ce5e7eda68972c7d6dfe723968bea7b40ac05b0f8c779a1f1d542b4ae4

3

268872

Upqmnnphost.dll

cc02561e5632a2c8b509761ee7a23a75e3899441f9c77d778d1a770f0f82a9b7

5

297984

Pnniorpauto.dll, SvchostSvc.dll

c8f2cc7c4fdf8a748cb45f6cfb21dd97655b49dd1e13dd8cc59a5eab69cc7017

5

297984

UsyaerDataAccessRes.dll

0eff243e1253e7b360402b75d7cb5bd2d3b608405daece432954379a56e27bff

6

403948

11-PrivateBatch.dll

31f0ff80534007c054dcdbaf25f2449ee7856aceac2962f4d8463f89f61bb3b0

6

399280

Wostqrkfolderssvc.dll

e8f00263b47b8564da9bc2029a18a0fec745377372f6f65a21aa2762fc626d4c

6

400947

11-PrivateBatch.dll

56f727b3ced15e9952014fc449b496bfcf3714d46899b4bb289d285b08170138

6

358867

daoris.dll

721caf6de3086cbab5a3a468b21b039545022c39dc5de1d0f438c701ecc8e9df

6

349810

updgwnphost.dll

f8a7e8a52de57866c6c01e9137a283c35cd934f2f92c5ace489b0b31e62eebe7

6

377236

USHBEERDATAACCESSRES.DLL, 10-FileCopy.dll

f1c5a9ad5235958236b1a56a5aa26b06d0129476220c30baf0e1c57038e8cddb

N/A[1]

79360

ZpNxNaQ.dll, SvchostSvc.dll

0aa3d394712452bba79d7a524a54aa871856b4d340daae5bf833547da0f1d844

N/A4

73728

SvchostSvc.dll

まとめ:

テストにおいて、CylancePROTECT®は、QuasarRATとその亜種を検知し、阻止しました。実際、AIを活用した弊社のセキュリティエージェントは、現在のQuasarRATサンプルのほとんどに対し、3年以上の予測優位性[5] ]を発揮しました。

侵入の痕跡(IoCs):

インジケータ

タイプ

CONVENTION DIGITAL LTD

証明書

52 25 B8 E2 2D 3B BC 97 3F DD 24 2F 2C 2E 70 0C

証明書シリアル

FuckYouAnti

DLLエクスポート

195.54.163.74

C2 IP

9s1IUBvnvFDb76ggOFFmnhIK

ミューテックス

ERveMB6XRx2pmYdoKjMnoN1f

ミューテックス

ABCDEFGHIGKLMNOPQRSTUVWXYZ

ミューテックス

AntiLib\injectcode.cpp

PDBパス

AntiLib\enableDebugPriv.cpp

PDBパス

C:\ods.log

ファイル名

YARA

以下のYARAルールを使用して、QuasarRATローダーを識別できます。

  import "pe"

  rule QuasarRAT_Loader
  {
      meta:
          description = "MenuPass/APT10 QuasarRAT Loader"

      strings:
          $rdata1 = " !\"#$%&'()*+,-
./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~" ascii
          $rdata2 = "CONOUT$" wide

      condition:
          // Has MZ header?
          uint16(0) == 0x5a4d and
          // File size less than 600KB
          filesize < 600KB and
          // Is a DLL?
          pe.characteristics & pe.DLL and
          // Contains the following sections (in order)
          pe.section_index(".text") == 0 and
          pe.section_index(".rdata") == 1 and
          pe.section_index(".data") == 2 and
          pe.section_index(".pdata") == 3 and
          pe.section_index(".rsrc") == 4 and
          pe.section_index(".reloc") == 5 and
          // Has the following export
          pe.exports("ServiceMain") and
          // Does not have the following export
          not pe.exports("WUServiceMain") and
          // Has the following imports
          pe.imports("advapi32.dll", "RegisterServiceCtrlHandlerW") and
          // Contains the following strings in .rdata
          for all of ($rdata*) : ( $ in       
  (pe.sections[pe.section_index(".rdata")].raw_data_offset..pe.sections[pe.section_index
(".rdata")].raw_data_offset+pe.sections[pe.section_index(".rdata")].raw_data_size) )
  }


以下のYARAルールは、 %WINDOWS%/Microsoft.NET/Frameworkフォルダ内に格納されている、エントロピーの高いペイロードと思われるものの検知に役立つ場合があります(こうしたファイルは通常、ファイル拡張子が2つ付いています)。 

  import "pe"
  import "math"

  rule Possible_QuasarRAT_Payload
  {
      meta:
          description = "Possible encrypted QuasarRAT payload"

      condition:
          uint16(0) != 0x5A4D and 
          uint16(0) != 0x5449 and 
          uint16(0) != 0x4947 and 
          math.entropy(0, filesize) > 7.5
  }

 

参考資料:

[1] https://github.com/quasar/QuasarRAT
[2] https://code.msdn.microsoft.com/windowsdesktop/CppHostCLR-e6581ee0
[3] https://github.com/quasar/QuasarRAT
[4] サービスインストーラ (別名:DILLJUICE)
[5] https://threatvector.cylance.com/en_us/home/cylance-vs-future-threats-the-predictive-advantage.html

Tags: