This post is also available in: English (英語)

PlugX マルウェアは標的型攻撃での侵入時に古くから繰り返し利用されてきました。PlugX にはいまだ根強い人気があり、日本での攻撃に使われていたこともあります。このため本マルウェアについてはよくまとまった解説がすでに出回っており、その機能がほとんど網羅的にカバーされている文書もあります。JPCERTからの資料含め、参考となりそうなまとめ文書を以下にいくつか挙げておきます。

さて、こうして数多くの情報が出回っているということは、PlugX はセキュリティ ベンダーからの高い注目を集めており、検出の仕組みを提供するために多大な労力が割かれていることになります。にもかかわらず、多くの攻撃者が今もこのツールを好んで使っています。これはつまり、標的をうまく感染させたいなら、マルウェアの配布のしかたやインストールのしかたに攻撃者自身が創意工夫を凝らさなければならないことを意味しています。

本稿では、すべて同一の攻撃者が使っていると予測される1まとまりの PlugX のサンプルについて、それらがどのようにセキュリティの仕組みを回避しようとしているかを論じていきます。一連の攻撃の対象となっている会社は主にビデオゲーム産業のようですが、テレメトリで得られた範囲外にも標的が存在している可能性がありますのでご承知おきください。

これらのサンプルは、以下の部分で興味深いテクニックを使っていることがわかりました。

  • 最初の C2 (コマンド & コントロール) サーバー アドレスの名前を解決する点
  • PlugX をオープン ソース ツールと組み合わせて最初にマルウェアをロードする点
  • ディスク上での検出を回避する点
  • パロアルトネットワークス製品は以下の方法で上述サンプルからお客様環境を防御します。
    • WildFire は本稿で述べたすべてのファイルを悪意あるものとして検出します。
    • Traps 4.0 を設定すると、これらのサンプルが悪意のあるコードをロードする際悪用するプロセスを保護できます。

    パロアルトネットワークスの AutoFocus をご利用のお客様は、本稿に関連するサンプルを次のタグで追跡できます。

関連する IOC (Indicator of Compromise) は本稿の付録 A を参照してください。

物語は RTF ファイル、MSI ファイル、.NET ラッパー と 2 段階の Shellcode がバーに入るところから始まる

この攻撃の物語はある RTF ファイル「New Salary Structure 2017.doc」から始まります。この RTF ファイルは CVE-2017-0199 を悪用するものですが、悪用の仕組みはすでによい資料(英語)がありますのでここでは詳しい内容は割愛します。本文書は次の URL にアクセスして最初のペイロードをダウンロードします。

hxxp://172.104.65[.]97/Office.rtf

これは ダウンローダー スクリプトで、2 つのペイロードをダウンロードして実行しようとします。そのコードを以下に示します。

最初のペイロードは Windows Installer (MSI) ファイルです。本ファイルの動的解析から大変興味深いことがわかりました。ふるまいからしてマルウェアは PlugX なのですが、接続先の C2 サーバーのアドレスが pastebin.com の URL なのです。また Pastebin への投稿を確認しさえすれば、後で C2 サーバーのアドレスに復号されるようなテキスト部分がすぐ見つかると期待していたのですが、パッと見ただけでは C2 アドレスが確認できません。

2 つ目のファイルは PowerShell スクリプトで Rapid7 Ruby Exploitation スクリプト をもとにしているようです。このファイルを使って任意のシェルコードをロードします。このケースでは、ここでロードしたシェルコードが PlugX で、これは次に説明する MSI ファイルに含まれているシェルコードと同じ内容でした。

.NET ラッパー

メインのペイロードは、前述の MSI ファイルに含まれる Microsoft .NET Framework ファイルとして配布されます。実行すると、.NET Framework ラッパーが VMware tools のバックグラウンド稼働の有無をチェックします。このチェックには「vmtoolsd」という名前のプロセスが存在するかどうか確認するという単純な方法を使っていました。「vmtoolsd」という名前のプロセスが存在しないことを確認すると実行を継続し「MSASCuiLTasks」という名前のレジストリ エントリを HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce に作成することで自身の永続性を担保します。このレジストリ キーによってシステムの再起動ごとにマルウェアが実行されることになります。次にマルウェアは第一段階のシェルコードをメモリにコピーし、新しいスレッドを作成してその中でこのシェルコードを実行します。この処理を行うコード部分を次の図 1 に示します。このシェルコードは暗号化はされていませんが難読化はされています。

図 1 .NET ラッパー内のメインとなるコード部分。新しいスレッド内でシェルコードの配列が作成・実行される

第一段階のシェルコードが次のシェルコード ブロックを復号します。第二段階のシェルコード ブロックが続いて RtlDecompressBuffer を使ってメインの PlugX DLL をメモリ内にアンパックします。またこれが典型的な PlugX に見られるパターンなのですが、アンパック後作成された DLL には MS-DOS のマジックナンバーも NT イメージ ヘッダーも存在しません。図 2 に示すように、MZ や PE のかわりに XV が使われています。

図 2 復号された DLL ペイロードのヘッダーには MZ/PE のかわりに不正な XV が使われている

最後に第二段階のシェルコード ブロックはインポートやリロケーションの処理を行い、DLL のエントリ ポイントにジャンプします。

シェルコード内で暗号化された構成

C2 サーバーに関する情報を含むマルウェアの構成情報は第一段階の小さいシェルコード ブロック内に暗号化されておりメインとなる PlugX DLL の DIIMain 関数に引数として渡されます。この DLL 自体もローカルホストの ポート 12345 に接続するデフォルト構成を保持しています。つまり DLL を手動で展開して実行した場合、本来の C2 サーバーではなく、第一段階のシェルコードから最初の引数として DLL に渡される localhost:12345 に接続してしまいます。

構成を復号する

さて前述のとおり本当の構成データは第一段階のシェルコード内に格納されています。ただし平文でなく暗号化と圧縮をした状態で格納されています。この構成データは以前 JPCERT/CC が説明していたものと同じアルゴリズムで暗号化されていますが、使われた XOR の値は異なっています。JPCERT/CC のブログで論じていたバージョンでは 20140918 と 353 という XOR 値を使っていましたが、私たちが調査したバージョンでは 20141118 と 8389 というXOR 値を使っています。調査対象の PlugX では、このほかの文字列難読化やファイル暗号化にも適宜同じ復号ルーチンを使っていました。文字列は復号された後、さらに LZNT1 で展開する必要があります。この展開には付録 B の「Python スクリプト」に記載したスクリプトが利用できます。

文字列の復号・展開が終わると、この後は簡単に PlugX 構成の特徴を同定できるようになります。たとえば次の 3 つのプロセスのいずれか 1 つに自身を挿入することがわかります。

  • %ProgramFiles(x86)%\Sophos\AutoUpdate\ALUpdate.exe
  • %ProgramFiles(x86)%\Common Files\Java\Java Update\jusched.exe
  • %ProgramFiles(x86)%\Common Files\Adobe\ARM\1.0\armsvc.exe

アンチウイルス製品スイートに含まれるプロセスに自身を挿入しようとする点は極めて大胆といえます。

これに加え、本マルウェアは次の 4 つの PasteBin URL リンクにアクセスし、C2 サーバー アドレスをこれらのリンクから抽出します。

  • https://pastebin[.]com/eSsjmhBG
  • https://pastebin[.]com/PSxQd6qw
  • https://pastebin[.]com/CzjM9qwi
  • https://pastebin[.]com/xHDSxxMD

構成から抽出される文字列の一覧は付録 D の「抽出された PlugX 文字列」に記載していますので参照してください。

C2 サーバーアドレスを抽出する

PlugX には与えられた URL から C2 サーバーの構成を抽出する機能があります。このケースでは攻撃者は一見正当なテキストブロック内に文字列を隠すという工夫を凝らしています。Pastebin から取得した内容のサンプルを以下に示します。

初見では気づきませんでしたが、ここではこちらの Airbus の投稿内容で論じられているものと同じテクニックが使われていました。つまりこの「RSA キー」をパースして「DZKS」、「DZJS」という魔法の値を探し、この 2 つの値の間に挟まれた内容を読み出して復号することにより、次に示す IP アドレスを生成しているのです。

この方法で暗号化された文字列を Python スクリプトを使って復号するテクニックについては付録 B の「Python スクリプト」を参照してください。

ここで本稿で取り上げたサンプルの全体的な実行の流れについて図 3 でおさらいしておきましょう。

図 3 本稿で取り上げたサンプルの全体的な実行の流れ
図 3 本稿で取り上げたサンプルの全体的な実行の流れ

要するにこの攻撃者は自身で作ったりオープンソースで提供されていたりとバラバラのコード部品を多数つなぎあわせることで PlugX をロードさせていました。使われた要素の数を考えればこの処理にはそれ相応の時間を使っていそうです。また同じマルウェアを使いつづけつつなんとか検出を逃れようとする意図もここからうかがい知れます。

ほかの PlugX サンプルをピボット検索

これまでの発見にもとづいてピボット検索し、ほかの興味深い PlugX サンプルを特定することができました。追加で見つかったサンプル群は、同じ標的組織に送付されている、攻撃者が利用しているインフラに紐づいている、見つかったサンプルに特有の配布方法をとっているなど、最初に見つかったサンプル群をもとにピボット検索することで特定に成功しました。

PlugX の「偏執狂時代」

最初のサンプルに関連して調査した PlugX サンプルの 1 つに、ディスク上で検出されることにとりわけ「偏執的に (paranoid)」気をつかっているサンプルがありました。当該サンプルは特定のフォレンジック解析回避の手順を踏むことで、ディスク上で検出されるのを防ごうとしていました。そうした偏執的なサンプルの 1 つが以下のものです。

SHA256:6500636c29eba70efd3eb3be1d094dfda4ec6cca52ace23d50e98e6b63308fdb

これは自己解凍型の RAR ファイルで、PlugX の配布の仕組みとしてよく使われます。とくに最終的なペイロードが正当な実行形式ファイルによって サイドロードされる 場合はこの形式が好んで使われます。その点でこのサンプルはとくに他のものと違っているわけではありません。というのもこのケースでも最終的なペイロードを実行するのは 署名済みの正当な Microsoft 社のバイナリ であり、このバイナリが「BlackBox.dll」という DLL をサイドロードする仕組みになっているからです。ただし、マルウェアの実行を開始するため、攻撃者はマルウェアを実行するバッチ スクリプトを使っています。そしてこのバッチ スクリプトはただマルウェアの実行を開始するだけのものではありません。マルウェアを実行した後もこのバッチ スクリプトは実行を継続し、システム上に自身が存在する痕跡をすべて消し去ります。この動作には以下が含まれます。

  • インストール中作成されたすべての初期ファイルと実行初期段階で必要とされたディスク上のすべての関連ファイルの削除
  • SFX RAR の実行に関連したすべてのレジストリ キーの削除
  • 最近実行されたアプリケーションに関連する UserAssist キー エントリの削除
  • 最近実行されたサービスに関連するすべてのレジストリ キーの削除

この PlugX を使用している攻撃者は、レジストリとファイルシステムの両方について、ディスク上のファイルが検出されることに対して偏執的になっているのが明らかです。なにしろこのバッチ スクリプトはこれら削除コマンドのほとんどを複数回実行するという念の入れようです。

このバッチ スクリプトが実行されれば、マルウェアがディスク上で実行された痕跡が跡形もなく消え去り、フォレンジック チームからすると、マルウェアがどうやってその場所に辿り着いたのかを特定するのはさらに難しくなります。つまりこのケースでは侵入を特定するにはメモリやネットワークベースの検出が必要となります。このバッチ スクリプトの全容については付録 C の「a.bat」で確認してください。

オープン ソースと PlugX の力

私たちは 2017 年前半、攻撃者が PlugX を改良して「偏執的」なバージョンを作り出す様子を目にしてきました。いまやシステム感染後メモリ内にのみ存在するというだけでは不十分で、彼らはネットワークを防御する側が使うアプリケーション ホワイトリストというテクニックをもバイパスしようとしています。この目標にむけ、攻撃側はオープン ソースのテクニックを組み込みはじめています。なかでもとりわけ好んで使われているテクニックが GitHub ユーザー SubTeeが作成した一覧です。たとえば、次のサンプルは msbuild.exe を使って .NET Framework プロジェクト内のシェルコードとしてマルウェアをロードすることでまんまとアプリケーション ホワイトリスト テクニックをバイパスしています。

SHA256: 822b313315138a69fc3e3f270f427c02c4215088c214dfaf8ecb460a5418c5f3

このサンプルはここにパブリッシュされている GIST の内容をほぼ踏襲していますが、自身で作成したとみられるコードを追加しています。この追加コードはシェルコードをロードする際のヘルパーとしてふるまいます。そのシェルコード部分は最初に取り上げたサンプル同様、べつの PlugX ペイロードです。

まだべつのケースで攻撃者は SubTee の GitHub プロジェクトから拝借した別のコード スニペットを使い、完全にテンプレート化された .NET アプリケーション ホワイトリスト バイパス ファイルに必要項目を書き入れて済ませています。

SHA256: 3e9136f95fa55852993cd15b82fe6ec54f78f34584f7689b512a46f0a22907f2:

このケースでは攻撃者自身では自分でコードを書く必要すらなく、直接テンプレート(GitHubリンク)にシェルコードをペーストするだけで PlugX を信頼されたアプリケーションの子プロセスとして起動させています。

これまでのまとめと緩和策

PlugX はセキュリティ コミュニティで長年深く研究されてきたマルウェアですが、攻撃者はこのマルウェアを愛用しつづけています。なぜでしょうか。この理由として考えられるのは次のようなものでしょう。

  • マルウェアの利用者が既存の慣れ親しんだマルウェアを信頼しており変化を求めていないから
  • PlugX をパッケージングする方法にはたけているが PlugX のように完全に機能するマルウェアを書くことには慣れていないから
  • PlugX ほど複雑なマルウェアを作り直す労力はそうした労力を払わずとも防御側をバイパスできるのであれば割に合わないから

本マルウェアが継続利用される背後にはこれら 3 つの要素が組み合わさった理由があると推測されます。多くの PlugX を使った攻撃者はマルウェアをロードするにあたり比較的ありふれたテクニックを使い続ける傾向があります。この場合、防御側がマルウエアを特定し、その実行を阻止することは容易です。ただしそんな攻撃者ばかりとは限りません。検出を逃れるため、新しく興味深いテクニックを応用する攻撃者も存在しています。

とくに本稿で取り上げた攻撃者はオープン ソースのツールを活用してマルウェアをパッケージングし、独自のラッパー アプリケーションを書いてペイロードを実行させる技術を持っていました。セキュリティ業界では、攻撃の成功率を下げるため、アプリケーションのホワイトリスト登録を効果的な方法としてまず案内することが多いことと思います。しかしながら公開されたテクニックを応用してそうした規制はバイパスすることが可能です。

自組織がアプリケーション ホワイトリストに依存している場合は SubTee のブログ に説明されているバイパスを防ぐ推奨事項が役に立つでしょう。ここで述べられている緩和策に加え、Traps 4.0 をお使いのお客様は、本稿に説明した方法で .NET プロセスが悪用されることがないよう設定をすることができます。

パロアルトネットワークス製品は以下の方法で上述サンプルからお客様環境を防御します。

  • WildFire は本稿で述べたすべてのファイルを悪意あるものとして検出します。
  • Traps 4.0 を設定すると、これらのサンプルが悪意のあるコードをロードする際悪用するプロセスを保護できます。

パロアルトネットワークスの AutoFocus をご利用のお客様は、本稿に関連するサンプルを次のタグで追跡できます。

関連する IOC (Indicator of Compromise) は本稿の付録 A を参照してください。

 付録 A – 関連するIOC

直接関連するもの:

45.248.84[.]7
172.104.65[.]97

SHA256 備考
5909c1dcfb3270b2b057513561b2ab1613687a0af0072c51244ff005b113888b PlugX
6804be0689bbfbb180bb384ebc316f50cb87e65553d0c3597d6e9b6b6dd8dd3f PlugX
8ea275eee557037ab6626d15c0107bdcf20b45a8307a0dc3baa85d49acc94331 PlugX
e6020eb997715c4f627b6e6a16947861bce310aa31fcf58448a5beba11626d36 PlugX
4554aa6c2fdd58dfddebdb786c5d23cd6277025ab0355ffb5d8967c3976e8659 PlugX
3817388a983d5ee1604a8eec621b5eb251cb8bdeab9c8591fe5e8c90cd99ed49 CVE-2017-0199
45513f942b217def56a1eac82a4b5edca65ebdd5e36c7a8751bf0350d5ebea39 CVE-2017-0199
64d7d4846c5dd00a7271fe8a83aebe4317d06abad84d44ffd6f42b1004704bd5 PlugX
07d94726a1ae764fa5322531f29fe80f0246dd40b4d052c98f269987a3ee4515 PowerShell PlugX
4622f8357846f7a0bea3ce453bb068b443e21359203dfa2f74301c7a79a408c2 Downloader for PS PlugX ++ MSI PlugX
49baf12f50fec772fdfe56c49005efb306b72a312a7dbdad98066029a191bfaf CVE-2017-0199

https://pastebin[.]com/eSsjmhBG
https://pastebin[.]com/PSxQd6qw
https://pastebin[.]com/CzjM9qwi
https://pastebin[.]com/xHDSxxMD

類似した標的から関連の推測されるもの

SHA256 ファミリ
6e5864faf4312bf3787e79e432c1acacf2a699ecb5b797cac56e62ed0a8e965c Idicaf
6b455714664a65e2a4af61b11d141467f4554e215e3ebd02e8f3876d8aa31954 Idicaf
df58962a3a065f1587f543a501d0e3f0ca05ebac51fc35d4bb4669d8eac9d8c1 Idicaf
52fee36c647ca799e21cd75db1f425ccf632b28c27e67b8578ff6dd30ca62af7 Idicaf
90e45c7b3798433199d6d917a4847a409dbdc101b210d9798f8c78ee43abf6d8 Idicaf
5ff788efd079eb2987b03d98e0c8211ac97ae6479274bade36a170b5a396f72b Idicaf
535abe8cd436d6b635c5687db0ae8d47c7c3679e4f5e2b4d629276b41fca0578 Idicaf
ef85896426a0a558ab17346a67f108045d142a2d2a21f7702bfb8be50542726d Idicaf
d41e2bbc8ea10dd7543d5f4cb02983e2b1ad5d47cc3ce5fa95189501c019fdac Idicaf
208bd18054134909e2ad680c0096477c48a58e8754a9439002e6523f71e66d47 PlugX
3e9136f95fa55852993cd15b82fe6ec54f78f34584f7689b512a46f0a22907f2 PlugX
5deab61f83e9afe13a79930eda1bdcb6c867042a1ce0e5c44e4209a60ab3327d PlugX
6500636c29eba70efd3eb3be1d094dfda4ec6cca52ace23d50e98e6b63308fdb PlugX
8e07c7636be935e0a6184db8a85fd8b607e6c48bb07d34d0138432f7c697bc99 PlugX

ドメイン

kbklxpb.imshop.in
serupdate.wicp.net
msfcnsoft.com
micros0ff.com
msfcnsoft.com
microsoff.net
msffncsi.com
A781195.gicp.net
upgradsource.com
B781195.vicp.net
kbklxp.eicp.net

付録 B – Python スクリプト

LZNT1 の復元用スクリプト。Windows 環境でのみ動作

PlugX 構成復号用スクリプト

Pastebin の C2 サーバー アドレス復号スクリプト

 付録 C – a.bat

 Appendix D – PlugX Extracted strings

Enlarged Image