マルウエアPlugXの新機能 (2015-01-22)
PlugXは、標的型攻撃でしばしば見られるC&Cサーバから受信した命令にしたがって動作するマルウエアです。JPCERT/CCでは、このマルウエアを2012年頃から確認しています
PlugXはこれまでも機能追加が繰り返されてきました。本報告では、2014年10月に確認したPlugXの検体で追加された新たな機能について解説します。(PlugX全般について知りたい方は、株式会社インターネットイニシアティブ(IIJ)が公開しているレポート[1]で詳細に解説されていますので、そちらをご覧ください。)
設定情報の拡張
PlugXは内部に保持する設定情報に従って動作します。2014年10月に確認したPlugXでは、この設定情報のサイズが0x36a4バイトに拡張されました(以降、「0x36a4タイプ」と記載します)。これまで中心だった0x2540バイト(2013年8月頃から確認)および0x2d58バイト(2014年6月頃から確認)のタイプと比較して、2割以上サイズが増し設定項目が大幅に追加されました。
設定情報の主な変更点は次のとおりです。設定情報の詳細については、Appendix Aをご覧ください。
- P2P通信に関する設定を追加
- 設定可能なC&Cサーバの数が16に増加
- 実行制限MACアドレス(感染端末のMACアドレスと比較し、一致する場合のみ動作する)を追加
- UAC回避を行う際に悪用するプロセスの設定が可能に
C&Cサーバとの通信機能の拡張
PlugXはC&Cサーバを複数設定できます。設定できるC&Cサーバが、これまでは4サイトのみでしたが、0x36a4タイプでは16サイトまで設定可能になりました。
また、PlugXはC&Cサーバにアクセスする際、複数の通信方式を利用できます。これまでは4種類の通信方式が用意されていましたが、0x36a4タイプでは、表 1に示すようにプロトコル番号「255番」で示される通信方式が追加されました。255番はIANAによって予約されていますが、プロトコルが指定されていない番号です。
表 1: PlugXがC&Cサーバに接続する際に使用する通信方式
順番 | IPプロトコル番号 (通信プロトコル) |
データ形式 |
1 | 6 (TCP) | バイナリデータ |
2 | 6 (TCP) | HTTPパケット |
3 | 17 (UDP) | DNS パケット |
4 | 1 (ICMP) | バイナリデータ |
5 | 255 | バイナリデータ |
P2P通信機能の追加
0x36a4タイプでは、PlugX間でP2P通信を行う機能が追加されました。端末はPlugXに感染するとローカルネットワーク内のIPアドレスに対して順番にアクセスし、接続可能な端末と通信を行います。この際、表2の4つの通信方式が用意されています。
表 2: PlugXがP2P通信に使用する通信方式
項番 | IPプロトコル番号 (通信プロトコル) |
データ形式 |
1 | 6 (TCP) | バイナリデータ |
2 | 17 (UDP) | DNS パケット |
3 | 1 (ICMP) | バイナリデータ |
4 | 255 | バイナリデータ |
この機能は、外部ネットワークに直接アクセスできない環境に侵入した場合でも、内部ネットワーク上の別のPlugX感染端末を通じて間接的にC&Cサーバと通信することを目的としていると考えられます。なお、実際にコマンドやコマンド実行結果が送受信できるかどうかは現在調査中です。
これまでJPCERT/CCで確認しているすべての0x36a4タイプによるP2P通信で、TCPまたはUDPが利用される場合にはポート番号として1357番が設定されていました。ポート番号は容易に変更できるため、必ず1357番ポートでP2P通信が行われるとは限りませんが、内部ネットワークで1357番ポートへのスキャン行為を検知することで、PlugXの感染を発見できる可能性があります。なお、設定情報でP2P通信が無効にされている事例も確認しています。
エンコード方式の変更
PlugXは、送受信するデータや設定情報、キーログファイル、内部で使用する文字列を同一の方式でエンコードしています。過去にPlugXに大きな変更が加えられた際には、このエンコード方式も同時に変更されてきました。0x36a4タイプへの改版時にもエンコード方式が変更され、これをデコードするPythonで記載したコードは次のとおりです。
def plugx_decode(data): decode_key = struct.unpack_from('<I', data, 0)[0] out = '' # キー作成時のXOR値は検体によって異なる可能性がある key1 = decode_key ^ 20140918 key2 = decode_key ^ 353 for c in data[4:]: # 加算・減算する値は検体によって異なる可能性がある key1 += 3373 key2 -= 39779 dec = int(c) ^ (((key2 >> 16) & 0xff ^ ((key2 & 0xff ^ (((key1 >> 16) & 0xff ^ (key1 - (key1 >> 8) & 0xff)) - (key1 >> 24) & 0xff)) - (key2 >> 8) & 0xff)) - (key2 >> 24) & 0xff) out = out + chr(dec) return out
おわりに
PlugXを使った攻撃は比較的頻繁に報告されており、その中で古いタイプのPlugXと新しいタイプのPlugXがともに観測されています。すなわち、現在攻撃に使用されているすべてのPlugXが0x36a4タイプであるとは限りませんし、過去に感染してすでに内部ネットワークに侵入されてしまっている場合には、古いタイプである可能性が高いとも言えます。
PlugXは今後も標的型攻撃に使われ続けることが予想されます。今回解説した情報を、マルウエア分析やAPT攻撃対策にご活用いただければ幸いです。
分析センター 朝長 秀誠
参考情報
[1] 株式会社インターネットイニシアティブ(IIJ)
Internet Infrastructure Review (IIR) Vol.21
http://www.iij.ad.jp/company/development/report/iir/021.html
Appendix A: 設定情報(0x36a4タイプ)の情報一覧
表 3: 設定情報(0x36a4タイプ)の情報一覧
オフセット | 長さ | 説明 |
0x0000 | 20 | 未使用 |
0x0014 | 4 | 自DLLをモジュール一覧から削除する処理を行うフラグ |
0x0018 | 4 | キーログ起動フラグ |
0x001c | 12 | 未使用 |
0x0028 | 4 | 停止時間の設定値 |
0x002c | 4 | 停止時間の設定値 |
0x0030 | 672 | ネットワークアクセスフラグ(15分間隔で1週間分) |
0x02d0 | 4 * 4 | DNSサーバIPアドレス 4 |
0x02e0 | 68 * 16 | コントロールサーバ情報 16 |
0x0720 | 128 * 16 | HTTPアクセスURL 16 |
0x0f20 | 196 * 4 | プロキシサーバ・認証情報 4 |
0x1230 | 4 | 常駐方法指定(サービス作成、Runキー作成) |
0x1234 | 512 | インストールフォルダの指定 |
0x1434 | 512 | サービス名の指定 |
0x1634 | 512 | サービス表示名の指定 |
0x1834 | 512 | サービスの情報名の指定 |
0x1a34 | 4 | Runキー設定で指定するレジストリ ルートキー値 |
0x1a38 | 512 | Runキー名 |
0x1c38 | 512 | Runキー値 |
0x1e38 | 4 | コード注入設定のフラグ |
0x1e3c | 512 * 4 | コード注入を行うプログラム名 4 |
0x263c | 4 | UAC 回避でのコード注入設定のフラグ |
0x2640 | 512 * 4 | UAC 回避でのコード注入を行うプログラム名 4 |
0x2e40 | 512 | C&Cサーバから受信する文字列と比較を行う文字列 |
0x3040 | 512 | システム情報と共にC&Cサーバに送信する文字列 |
0x3240 | 512 | ミューテックス名 |
0x3440 | 4 | スクリーンキャプチャ起動フラグ |
0x3444 | 4 * 5 | スクリーンキャプチャ設定値 |
0x3458 | 528 | スクリーンキャプチャ保存フォルダ名 |
0x3658 | 4 | P2P(TCP)通信起動フラグ |
0x365c | 4 | P2P(TCP)ポート番号 |
0x3660 | 4 | P2P(UDP)通信起動フラグ |
0x3664 | 4 | P2P(UDP)通信ポート番号 |
0x3668 | 4 | P2P(ICMP)起動フラグ |
0x366c | 4 | P2P(ICMP)通信ポート番号 |
0x3670 | 4 | P2P(IPプロトコル番号255)通信起動フラグ |
0x3674 | 4 | P2P(IPプロトコル番号255)ポート番号 |
0x3678 | 4 | P2Pスキャン起動フラグ |
0x367c | 4 * 4 | P2P通信先スキャン 開始IPアドレス 4 |
0x368c | 4 * 4 | P2P通信先スキャン 終了IPアドレス 4 |
0x369c | 6 | 実行制限MACアドレス値 |
0x36a2 | 2 | 未使用 |
Appendix B: 検体のSHA-256ハッシュ値
- bc65e2859f243ff45b12cd184bfed7b809f74e67e5bb61bc92ed94058d3d2515
- 93c85a8dd0becc4e396eea2dc15c0010ff58d2b873d44fd7e45711a27cfe613b
- 0ff134057a8b2e31b148fedfdd185f5b1a512149499a8c5c0915cf10b10a613e