Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
デシリアライズにおけるDNSリクエスト
クラス java.net.URL
は Serializable
を実装しており、これはこのクラスがシリアライズ可能であることを意味します。
このクラスには奇妙な動作があります。ドキュメントから:“2つのホストは、両方のホスト名が同じIPアドレスに解決できる場合、同等と見なされます”。
そのため、URLオブジェクトが**equals
またはhashCode
のいずれかの関数を呼び出すたびに、IPアドレスを取得するためのDNSリクエストが送信**されます。
hashCode
関数をURLオブジェクトから呼び出すのは非常に簡単で、このオブジェクトをデシリアライズされるHashMap
に挿入するだけで済みます。これは、HashMap
の**readObject
関数の最後**でこのコードが実行されるためです:
それはHashMap
内のすべての値でputVal
を実行します。しかし、より重要なのは、すべての値でhash
を呼び出すことです。これはhash
関数のコードです:
ご覧のとおり、デシリアライズする際に**HashMap
の関数hash
はすべてのオブジェクトで実行され**、hash
の実行中にオブジェクトの.hashCode()
が実行されます。したがって、URLオブジェクトを含む****HashMap
をデシリアライズすると、URLオブジェクトは**.hashCode()
を実行します**。
次に、URLObject.hashCode()
のコードを見てみましょう:
getHostAddress
がドメインに対して実行され、DNSクエリを発行します。
したがって、このクラスは悪用されてDNSクエリを発行し、デシリアライズが可能であることを示すため、または情報を抽出するために使用できます(コマンド実行の出力をサブドメインとして追加できます)。
URLDNSペイロードコードの例
ysoserialのURDNSペイロードコードはこちらで見つけることができます。ただし、理解しやすくするために、ysoserialのものを基にした独自のPoCを作成しました:
More information
元のアイデアでは、commons collectionsペイロードがDNSクエリを実行するように変更されましたが、これは提案された方法よりも信頼性が低かったです。しかし、こちらがその投稿です: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
GadgetProbeをBurp Suite App Store (Extender)からダウンロードできます。
GadgetProbeは、サーバーのJavaクラスにいくつかのJavaクラスが存在するかどうかを確認し、脆弱性があるかどうかを知ることができます。
どのように機能するか
GadgetProbeは、前のセクションのDNSペイロードを使用しますが、DNSクエリを実行する前に、任意のクラスをデシリアライズしようとします。もし任意のクラスが存在すれば、DNSクエリが送信され、GadgetProbeはこのクラスが存在することを記録します。もしDNSリクエストが送信されなければ、これは任意のクラスが正常にデシリアライズされなかったことを意味し、したがってそれは存在しないか、シリアライズ可能/悪用可能ではないということです。
GitHub内に、GadgetProbeにはいくつかのワードリストがあり、テスト用のJavaクラスが含まれています。
More Information
Java Deserialization Scanner
このスキャナーはBurp App Store (Extender)からダウンロードできます。 この拡張機能にはパッシブおよびアクティブな機能があります。
Passive
デフォルトでは、すべてのリクエストとレスポンスをパッシブにチェックし、Javaシリアライズマジックバイトを探し、見つかった場合は脆弱性警告を表示します:
Active
手動テスト
リクエストを選択し、右クリックしてSend request to DS - Manual Testing
を選択します。
次に、Deserialization Scanner Tab --> _Manual testing tab_内で挿入ポイントを選択します。そしてテストを開始します(使用されるエンコーディングに応じて適切な攻撃を選択します)。
「手動テスト」と呼ばれていますが、かなり自動化されています。それは自動的にデシリアライズが任意のysoserialペイロードに脆弱であるかどうかをチェックし、ウェブサーバー上のライブラリを確認し、脆弱なものを強調表示します。脆弱なライブラリをチェックするために、Javas Sleeps、CPU消費によるスリープ、または前述のようにDNSを使用することを選択できます。
悪用
脆弱なライブラリを特定したら、リクエストを_Exploiting Tab_に送信できます。 このタブでは、再度注入ポイントを選択し、ペイロードを作成したい脆弱なライブラリとコマンドを記入します。次に、適切な攻撃ボタンを押します。
Java Deserialization DNS Exfil情報
ペイロードを次のように実行させます:
More Information
Last updated