マルウエア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 パケット 
1 (ICMP)   バイナリデータ
255   バイナリデータ

P2P通信機能の追加
0x36a4タイプでは、PlugX間でP2P通信を行う機能が追加されました。端末はPlugXに感染するとローカルネットワーク内のIPアドレスに対して順番にアクセスし、接続可能な端末と通信を行います。この際、表2の4つの通信方式が用意されています。

表 2: PlugXがP2P通信に使用する通信方式

 項番 IPプロトコル番号
(通信プロトコル)
データ形式 
6 (TCP)  バイナリデータ 
17 (UDP)  DNS パケット 
 1 (ICMP) バイナリデータ 
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 自DLLをモジュール一覧から削除する処理を行うフラグ 
0x0018  キーログ起動フラグ
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
≪ 前へ
トップに戻る
次へ ≫