PlugX マルウェアは標的型攻撃での侵入時に古くから繰り返し利用されてきました。PlugX にはいまだ根強い人気があり、日本での攻撃に使われていたこともあります。このため本マルウェアについてはよくまとまった解説がすでに出回っており、その機能がほとんど網羅的にカバーされている文書もあります。JPCERTからの資料含め、参考となりそうなまとめ文書を以下にいくつか挙げておきます。
- TR-12 – Analysis of a PlugX malware variant used for targeted attacks. (Circl)(英語)
- マルウエアPlugXの新機能 (JPCERT/CC)
- PlugX some uncovered points (Airbus)(英語)
- PlugX – The Next Generation (Sophos)(英語)
さて、こうして数多くの情報が出回っているということは、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 でおさらいしておきましょう。

要するにこの攻撃者は自身で作ったりオープンソースで提供されていたりとバラバラのコード部品を多数つなぎあわせることで 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