熱帯の海賊からの贈り物 -メールとマルウェアに隠された新しい危険な武器-

This post is also available in: English

この記事について

この記事は、当社分析チームが観測した Tropic Trooper(別称: Pirate Panda, KeyBoy)と呼ばれるサイバー攻撃者によるものと目される標的型攻撃メールを使った攻撃手法と、使用されたマルウェアについての分析レポートです。

標的型攻撃メール

攻撃者が標的の組織に対しマルウェアへの感染やアカウント窃取を狙った電子メールを送信してくることはよく知られています。我々が分析した攻撃者グループも、標的型攻撃メールの送信を攻撃手法の一つとして取り入れており、その過程においてこの攻撃者ならではの特徴的な手法が観測されました。

サンプルメール(件名 : 【重要】2022职工住房公积金的月缴比例调整)は、中国企業で働く従業員のための制度である住宅公積金に関する内容の通知を装って送付されたものです。

図1. サンプルメール本文

図2. サンプルメール参考和訳

このサンプルの攻撃メールでは、組織の従業員が必ず確認する必要がある公的の制度がおとりの内容として使われていました。

添付ファイル

メール本文から確認を促される添付ファイルがマルウェアなのですが、このマルウェアには攻撃者の様々なテクニックが使われていることが確認できました。 まず、このマルウェアはzip形式で圧縮されており、その構造は以下のようになっています。

  • 职工住房公积金缴存比例对应的月缴存额明细.xlsx.lnk(ショートカットファイル)
  • &Recycle.Bin(隠しフォルダ)
    • gongjijin.xlsx(デコイファイル)
    • McVsoCfg.dll(悪性DLLファイル)
    • NTUSER.EXE(正規実行ファイル)
    • setting.dat(BLOBファイル)

この圧縮ファイルには複数のファイルが含まれているのですが、デフォルト設定のWindows OS環境では、この圧縮ファイルを展開した際に、职工住房公积金缴存比例对应的月缴存额明细.xlsxというファイルしか表示されません。

図3. 添付ファイル展開時の表示

過去にはursnif/goziをばらまいていたサイバー攻撃者等が、.xlsx.exeや、.pdf.exeなど、実際の拡張子の前に異なる拡張子を付加した二重拡張子の形式のファイルを攻撃に利用したことがありました。Windowsの標準の設定で登録されている拡張子が表示されない状態では、後方の.exeの部分が表示されず、実行ファイルではないように見せかけられるからです。 このような攻撃手法への対応の一つとして、組織によってはファイルの拡張子を表示することで利用者が異常に気付けるようにしている場合があります。

ところが、lnkの拡張子は例外で、この設定を有効にしても拡張子が表示されません(レジストリ等で強制的に表示させることもできますがデスクトップ等のショートカットファイルにもすべて拡張子.lnkが付属し、見た目が悪くなってしまうことから、表示を有効化している組織は稀です)。

図4. エクスプローラ設定「登録されている拡張子は表示しない」

拡張子「.lnk」とはー

Windowsのショートカットファイルのことで、他のファイルやフォルダを参照する。

[MS-SHLLINK]: Shell Link (.LNK) Binary File Format | Microsoft Learn

ショートカットファイルは簡単にアイコンを変更することができ、実行するコマンドも容易に設定できることから攻撃者にとっては使いやすいツールになっています。

図5. 展開されたファイルが実行されるよう指定されたショートカットファイル

そして、攻撃者がもう一つ仕組んだテクニックがシステムファイル・システムフォルダを隠す機能の悪用です。 Windowsでは、利用者が誤って重要なファイルを消したり変更したりしないようシステムファイル・システムフォルダを表示させない機能が有効になっています。 この圧縮ファイルの中にも、&Recycle.Binという名前のフォルダがあります。このフォルダの中には、マルウェア本体や、送付されてきた内容に即した無害な偽の文書ファイルが配置されていますが、隠しフォルダの設定がされており、システムフォルダを表示させない機能が有効になっていると利用者には見た目上、フォルダの存在を確認することができません。

図6. エクスプローラ設定「隠しファイル、隠しフォルダの表示」

また、仮にフォルダが表示されるよう設定された環境であっても、ゴミ箱の本体フォルダである$Recycle.Binという名称に近しい&Recycle.Binというフォルダ名を見た利用者は、システム的なフォルダか、重要ではないフォルダだと誤認させることを狙っている可能性があります。

$Recycle.Binとはー

$Recycle.BinはWindows OSによって作成された隠しSystemvolumeフォルダであり、各ハードドライブ上のシステムが持つごみ箱のリンクフォルダ。

隠しファイルや隠しフォルダを表示する設定は、利用者が重要なフォルダやファイルを誤って消してしまうことを防止する設定のため、この機能をオフにするかは慎重な検討が必要です。

マルウェアの感染フロー

では実際にどのようにマルウェアに感染させるのか。最終目標である攻撃者のコマンド&コントロールサーバ(C2サーバ)への通信成立に至るまでのテクニックを確認しましょう。

図7. 感染フロー全体図

ショートカットファイルの起動

EXCELファイルに偽装したショートカットファイルを確認すると、隠しフォルダに設定されていた&Recycle.Binフォルダ内の実行ファイルであるNTUSER.EXEを呼び出していることがわかります。

図8. ショートカットファイルのコマンド詳細

この実行ファイルがマルウェアでしょうか? このNTUSER.EXEのハッシュをVirusTotalで検索してみます。 VirusTotalは、登録されている複数のウイルス対策ソフトウェアがアップロードされたファイルをどのように判定するのか結果を表示できるサイトです。 このサイトの結果だけでマルウェアであるかどうかの判断はできませんが、過去に同様のファイルが検査されたことがあるかや、対象ファイルがもつメタ情報や実行時の挙動などの情報から、悪性なファイルかどうか判断するための手掛かりになる情報を得ることができます。 今回のNTUSER.EXEは、既に検査済のファイルであり、悪性のファイルであると判定しているセキュリティソフトウェアはありませんでした。

図9. NTUSER.EXEの各ウイルス対策ソフトの判定結果

さらに、実行ファイルのデジタル証明書の項目を確認するとMcAfee社の正規の証明書によってサインされています。 これは、McAfee社のサインに必要な情報を持っていない限り設定できず、 McAfee社の正規ファイルである可能性が非常に高いことを示しています。

図10. NTUSER.EXEのプロパティ McAfee社の証明書によるサイン

攻撃者は正規の実行ファイルを実行させようとしているのでしょうか? 実は、ここにDLL Side Loadingという攻撃テクニックが使われているのです。

このNTUSER.EXEはMcAfee社の実行ファイルですが、読み込むDLLを正当なファイルかを検証する機能がなく、結果として、ファイル名が同一であれば、どのような内容のDLLでも読み込んで実行します。 その脆弱性を悪用して、正規の実行ファイルが読み込むDLLの中にマルウェアを埋め込み実行させてしまうのです。

今回の攻撃では、NTUSER.EXEと同じフォルダ内に設置されている悪性DLLファイルMsVsoCfg.dll内のMcVsoCfgGetObject関数を呼び出し、悪性コードを読み込むよう設計されていました。

DLL Side Loading とはー

WindowsのDLL検索順序メカニズムを利用し、悪意のあるペイロードを正規のアプリケーションと同じフォルダに配置し、アプリケーションを実行したときにそのペイロードを起動させる手法。これにより、アプリケーションの正規な動作に見せかけて悪意のあるペイロードを実行させることができる。

Hijack Execution Flow: DLL Side-Loading, Sub-technique T1574.002 - Enterprise | MITRE ATT&CK®

先述のショートカットファイルは、このNTUSER.EXEを実行すると同時に、偽のファイル(デコイファイル)を表示するよう仕組まれていました。利用者は、実際に表示されると想定していた文書ファイルが開かれたため、特に異常は感じないでしょう。ところがその後ろで正規の実行ファイルがマルウェアの本体であるDLLファイルを読み込み、感染活動を開始しているのです。

マルウェア解析と動作の説明

続けて、マルウェアの動作を確認してみましょう。 NTUSER.EXEの中身を解析するとMcVsoCfg.dllを読み込んでいることがわかります。

図11. NTUSER.EXEが呼び出すライブラリとその関数

MsVsoCfg.dll内のExport関数を確認すると、先ほどNTUSER.EXE で呼び出されていたMcVsoCfgGetObject関数がExport関数として定義されていることがわかります。 Export関数とは、DLLの外でも利用ができるよう設定された関数のことで、この場合は McVsoCfgGetObjectという関数が外部からの動作を受け付けられるようになります。

図12. MsVsoCfg.dllが提供する関数

このMcVsoCfgGetObject関数がどのような動作をするのか。コードを読み進めると、Installer(感染)とLoader(読み込み)の2つの機能があることがわかりました。

Installerの動作

まず、Installerの機能を確認します。 Installerは、ファイルの設置を行う機能で、NTUSER.EXEが設置されているフォルダ内の3つのファイルをC:\Users\Public\Downloadsフォルダ配下に複製します。

図13. MsVsoCfg.dll内のInstaller機能

ファイルの複製イメージは以下の通りです。

図14. ファイルの複製イメージ

添付のファイルの内容が確認された後、特に残しておく価値がないと判断された場合はフォルダごと利用者に消去されてしまうことがあります。 そのため、まず特定の場所にマルウェアのセットを設置していると考えられます。

今回、攻撃者はC:\Users\Public\Downloads\というフォルダにファイルを複製しています。このフォルダにマルウェアを設置した意図としては以下の可能性が推測されます。

  • 普段ユーザが使用しないフォルダのため、発見を遅らせることができる
  • Publicフォルダは同じホストを使用している複数ユーザが共有利用できるため、端末内の他アカウントでも利用できる

今回分析したマルウェアではDownloadsフォルダが複製先に使用されていましたが、その他にも似通ったC:\Users\Public\Videos\ やC:\Users\Public\Music\ もマルウェアの複製先としてよく使用されます。

また、複製の際に、NTUSER.EXEというファイル名から、AVIRA.EXEというファイル名に実行ファイルが変更されている点も攻撃者の意図が感じられます。 もともとのNTUSERというファイル名は、NTUSER.DATというユーザプロファイルを格納するファイル名を想起させます。そして、変更されたAVIRAはウイルス対策ソフトの名前を想起させます。 それぞれ、正常なシステム動作と切り分けが困難な名称ではないでしょうか?

Loaderの動作

複製が完了すると、NTUSER.EXEは、複製したAVIRA.EXEを起動します。AVIRA.EXEはNTUSER.EXEと全く同じ実行ファイルです。では、AVIRA.EXEが起動されると再びNTUSER.EXEと同じように複製の作業が始まってしまうのでしょうか? 実は、複製されたファイルが存在するかを確認する機能があり、既に複製されたファイルが存在する場合にはLoaderに動作が切り替わります。

Loaderは、暗号化されたファイルを読み込み、実行できる形式に復元して実行する機能を持っています。 複製されたファイルにsetting.datというファイルがありましたが、これが暗号化されたファイルで、このファイルをLoader機能が読み込むと復号され新たなマルウェアが動作を開始します。

図15. setting.datの読み込み処理
図16. setting.dat 復号前
図17. setting.dat 復号後

復号処理されたsetting.datのデータ冒頭に、実行ファイルのマジックナンバーである「MZ」や、実行ファイルのヘッダ内文字列である「This program cannot be run in DOS mode」、その後にはPEヘッダのマジックナンバーである「PE」という文字列が確認できます。 これらの文字列から、復号処理されたファイルがPEファイルであるということがわかります。

PEファイル とは―

Portable Executableの頭字語で、Windowsの実行ファイルのフォーマットの一つ。

PE Format - Win32 apps | Microsoft Learn

復号処理されたファイルですが、解析に慣れた人だと違和感がある部分があります。通常であればMZ以降のデータはもっとシンプルなのですが、この復号処理されたファイルにはノイズがあるように見えます。

図18. 一般的なMZヘッダ

実はこの部分は解析を困難にするために動作するShellcodeで、Reflective Loaderが呼び出され、PEヘッダのデータにそって各セクションをメモリ上に展開していき、最終的には埋め込まれているPEファイルのEntry Pointを計算し呼び出すように設計されていることがわかりました。

図19. MZヘッダ内に埋め込まれたshellcode

なぜこのShellcodeをMZヘッダ内に設置したのか理由は判然としませんが、解析を少しだけ困難にしたり、安易なパターンで実行ファイルを特定する検知を回避したり、ヘッダ領域内のプログラムに関するメタ情報を消したり、という効果を狙っているのかもしれません。

このPEファイルの実体はCobalt Strike Beaconでした。Cobalt Strikeは、正規のソフトウェアでありながら、その充実した機能から、不正規なライセンスにより攻撃者に悪用されている遠隔操作ソフトウェアです。

Cobalt Strikeとはー

サイバー攻撃を再現し、システムや組織のセキュリティ評価に使用される商用セキュリティツール。その一方で不正利用のために改変されたクラック版が出回り、悪意のある攻撃にも広く利用されている。 主な機能として、システム侵入後に対象システムにCobalt Strike Beacon(以下Beacon)と呼ばれるバックドアプログラムを埋め込み、稼働させることでBeaconを介してPowerShellスクリプトの実行や、スクリーンショットの記録、ファイルのダウンロードなどの強力な攻撃モジュールを提供する。

Cobalt Strike Beaconには内部に設定データ(以下malware config)が埋め込まれており、1バイトのXORでエンコードされているのが一般的です。本検体も0x2EでXORされたmalware configが埋め込まれており、公開されているツール(GitHub - Sentinel-One/CobaltStrikeParser)で該当データを抜き出すと下図の結果を得ることができました。

図20. Cobalt Strike Beaconのmalware config

攻撃者のミス?

この検体を分析していく過程で奇妙なことに気づきました。マルウェアを常に動作させるための設定である永続化の設定がされていないのです。これでは、利用者が端末を再起動してしまったら、マルウェアは再度動作しません。 これは、攻撃者のミスなのか、C2サーバへの通信が発生したら攻撃者がすぐに遠隔操作をして新たなマルウェアを埋め込む、または永続化の設定を投入する等の予定だったかは解析からは判明しませんでした。

アクター

マルウェアの特徴、攻撃手法、利用されているインフラなどの情報からこのサイバー攻撃の背後にはどのようなアクターがいることが想定されるのでしょうか。 我々の分析では、この一連の攻撃は、Tropic Trooper(別称: Pirate Panda, KeyBoy)と呼ばれるグループによるものである可能性が高いと推定しています。 追加の調査の結果、我々はこの攻撃者グループと関連性が高いと思われる別の検体の入手にも成功しています。それらの検体の分析に関する詳細を2023年10月にロンドンで開催されるVB2023(Virus Bulletin :: Unveiling activities of Tropic Trooper 2023: deep analysis of Xiangoop Loader and EntryShell payload)にて発表すると同時に、このブログで記事にする予定です。

防御策

この標的型攻撃に対して組織はどのような対策をとるべきか、いくつか管理策を例示します。

  • メール セキュリティ
    • スパムフィルタを使用してショートカットファイル(.lnkの拡張子を持つファイル)の添付を拒否する
      ※単なる添付ファイルだけでなく、zip形式の圧縮ファイル内を探査して同様のルールを適用できる製品でなければならない
  • エンドポイント セキュリティ
    • Publicフォルダ内へのファイル生成を監視する
      ※ソフトウェアのインストールのノイズはあるが、その他の不正なソフトウェア導入の監視という意味でも有効
    • メモリ内のマルウェアをスキャンできる製品を導入する
      ※暗号化された状態ではファイル検知できないため動作しているメモリから異常を見つけ出す
  • ネットワーク セキュリティ
    • 普段使用しない宛先ポートへの外部アクセスを遮断し監視する

IoCs

Cobalt Strike Beaconの通信先 (C2 サーバ)

38.54.40[.]178 (port 2433)

各ファイル詳細
ファイル名 種別 MD5 SHA1 SHA256
职工住房公积金缴存比例对应的月缴存额明细.zip zip 477064c3182a8eec3c048fb76d939ca4 edb4a995eca1b65f7d588dca0f2d22487614ff96 89a71c796b86aec5f12e48524e044d427629438b4e573e4c9d7353b08eb0d7de
职工住房公积金缴存比例对应的月缴存额明细.xlsx.lnk lnk ea5d6c5912e25cec49d0eca7cd5dbfca 553b3a5450ece97410a32a0319f202ac6c501708 95a3850ef6f727ce84aff3295e8f05c8e47856390d8b0091f60fc705b675b719
&Recycle.Bin/ gongjijin.xlsx decoy 327fed79e399a98b4036799408235b34 730510f4c7f06ff2f96a1ac804defd9276654a5c 75447462e748956009d1528ba6e960784b56360dccfcf689f7bff093a0da55bf
&Recycle.Bin/ McVsoCfg.dll loader 4006dcb60b94f22e313138d836f6692f ba6fb4bad430efe434f614ba8c7a71b69f8f0462 acf4422360ca41bb1318a46b2386c5e5458666e951faf19dcf48f0ab3abd5900
&Recycle.Bin/ NTUSER.EXE legitimate exe c214cc5b78616b44918ce62c8a2aa773 aa0018ef4bc398cf3e7c6b2dd9109c173d12b368 563d732c54221fcdd5625bfceaefbe10937c6c62823b4a6ceca5f7ed6c81d890
&Recycle.Bin/ setting.dat BLOB 84b6a4044b6a505c1d24f4cceba294d0 c7e04e6a03be8b32519fd7eec578ba1c651f8cb5 af9408a97f414cc6165de8f9f47d1a6ca3d596e3c999f86caa3841098766b514