SST連載・解説記事

  1. HOMEHOME
  2. SSTコラムSSTコラム
  3. SSTtechlog
  4. 12 MessagePack/JSON変換HTTPプロキシの紹介

(2018年3月6日公開)

SSTtechlog

はじめに

2017年の11月に、MessagePackを使ったAPIを診断する機会がありました。 調査の結果、弊社診断ツールではMessagePackに対応していないことが判明しました。 そこで MessagePack -> JSON, JSON -> MessagePack に変換するローカルHTTPプロキシを作成し、弊社診断ツールでスキャンできるよう対応したので、紹介します。

検証環境:

  • OS : Windows10Pro 64bit 日本語版
  • JDK 1.8.0_92

作成したコードは以下のGitHubリポジトリで公開していますので、詳細はそちらを御覧ください。

MessagePackとは

MessagePackとはJSONとよく似た、コンパクトで効率的なデータフォーマットです。様々なプログラミング言語向けにライブラリが開発されており、Javaでも msgpack-java を利用できます。

MessagePackの仕様は以下で参照できます。

特徴:

  • バイナリ形式である。
  • JSONより型が多い。特に整数と小数点について、符号の有無, 8/16/32/64bit, 単精度/倍精度 とC言語に近い型指定ができる。
  • 独自に型を拡張できる(ext format)。
  • データ長が可変な文字列/array/map/extでは、データ長を埋め込む必要がある。

診断対象のAPIについて

診断対象のAPIは、以下のようにHTTPリクエストボディ / レスポンスボディ共に MessagePack となっていました。

MessagePackなAPIの図

※上記通信内容は実際の診断対象ではなく、診断対象を模して作ったテスト用APIの通信内容です。Content-Type は実際の診断対象と同じですが、URLやリクエスト/レスポンスのMessagePackの内容はテスト用の値に入れ替えています。

MessagePack と脆弱性診断

MessagePackで送られるデータの中身について脆弱性診断を行うには以下のような難しさがあります。

  • バイナリ形式のため、編集に使うツール(エディタ)によってはデータが壊れてしまう。バイナリエディタを使って編集する必要がある。
  • データ長が可変な型を編集する際は、編集後のデータ長も埋め込む必要がある。
  • 人間が手動でバイナリデータ中の各フィールドを一つ一つ編集するのが非常に高コストになってしまう。

MessagePackはJSONと似ていますので、MessagePackをJSONに変換して表示・編集できるようにすれば解決できそうです。 既にサイバーディフェンス研究所の松永氏が、MessagePackをJSONに変換して表示・編集できる Burp 拡張を作って公開していました。

しかし、SSTでは脆弱性診断用のスキャナーを独自に社内開発しているため、このBurp拡張をスキャンに使うことが出来ません。

ではどうするか?ですが、SSTのツールはJSONには対応しています。 ならばMessagePackをJSONに変換するプロキシと、JSONをMessagePackに変換するプロキシとで挟み込めばJSONとしてスキャンできるのではないか?と考えました。 JSONに対応している & 上位プロキシを設定できるスキャナーなら汎用的に使えるのがメリットになります。

MessagePack/JSON変換プロキシでスキャンツールを挟み込む図

ちょうどNettyでローカルHTTPプロキシを作ってみた直後だったので、同じ技術をそのまま流用し、突貫工事で上記アイデアを実現したのがmsgpack-json-proxyになります。

msgpack-json-proxy の紹介

msgpack-json-proxy について、実際の使い方を紹介します。 Javaアプリケーションなので、使う前にJRE8以上をインストールしておいてください。 リクエスト/レスポンスボディにMessagePackを使うWebアプリケーションも必要となりますが、今回は msgpack-json-proxy に内蔵されているデモ用Webアプリを使うことにします。

  1. msgpack-json-proxy のjarファイルを以下のURLからダウンロードします。(本記事執筆時点では msgpack-json-proxy-1.0.0.jar を使用)
  2. 設定ファイルを準備します。 proxy_config.properties というファイル名で以下の内容を保存します。
    # demo web server
    demo.port.http = 8183
    demo.port.https = 8184
    # [msgpack -> json]:8181 -> burp:8080
    msgpack2json.port = 8181
    msgpack2json.upstream = localhost:8080
    msgpack2json.enable_response_conversion = true
    # bur:8008 -> [json -> msgpack]:8182 -> fiddler:8088
    json2msgpack.port = 8182
    json2msgpack.upstream = localhost:8088
    json2msgpack.enable_response_conversion = true
    
  3. プロキシとデモ用Webアプリを起動します
    java -jar msgpack-json-proxy-1.0.0.jar start proxy_config.properties
    
  4. Burpを起動し、ポート番号8080でProxyをListenするようにします。また上位プロキシにlocalhost:8182を設定します。
  5. Fiddlerも起動して8088でListenするようにします。
  6. http://localhost:8183/ にプロキシを通さずにブラウザでアクセスし、MessagePackを使ったデモ用Webアプリが動作することを確認します。
  7. localhost:8181 をプロキシに設定したブラウザで http://localhost:8183/ にアクセスし、デモ用Webアプリが動作することを確認します。

これにより、以下が可能となります。

  • MessagePack -> JSONに変換されたリクエストをBurpで確認できるようになります。
  • JSON -> MessagePackに変換されたリクエストをFiddlerで確認できるようになります。

では実際にMessagePackのリクエストをデモ用WebアプリのAPIエンドポイントに送信してみます。以下はcurlコマンドを使った例になります。

  1. 送信用のMessagePackをデモ用Webアプリから取得します。
    curl -X GET "http://localhost:8183/getpojo" --output pojo.dat
    
  2. 以下のcurlコマンドでリクエストを送信します。http://localhost:8183/echopojo ではMessagePackで受信した内容を一旦Javaのオブジェクトに変換し、それをまたMessagePackに戻してレスポンスに出力します。
    curl -x localhost:8181 -X POST -H "Content-Type: application/msgpack" "http://localhost:8183/echopojo" --data-binary @pojo.dat
    
  3. BurpのProxyを確認すると、以下のように MessagePack が JSONに変換された様子を確認できました。

MessagePackがJSONに変換されたリクエストの図

  1. Fiddlerでは以下のようにJSONがMessagePackに変換された様子を確認できました。

JSONがMessagePackに変換されたリクエストの図

図にまとめると、以下のような構成で動作確認をしたことになります。 プロキシ・スキャナーを挟み込むmsgpack-json-proxyの使い方の図

最初はこの構成でWebアプリを操作してみて、動作確認できればFiddlerは外してしまってもいいでしょう。 その場合は設定ファイルの json2msgpack.upstream の行をコメントアウトしてください。

あとはBurpのところをJSONに対応したスキャナーに置き換えて、どんどんスキャンしていくだけです。

まとめ

  • MessagePackを使ったAPIを、汎用性の高い MessagePack <> JSON 変換プロキシを作成することで効率的に診断することができました。
  • JSONと親和性のあるデータフォーマットであれば、同様のアプローチで診断を効率化できそうです。
  • 実際に msgpack-json-proxy を使ってみた感想・フィードバックなど頂ければ幸いです。

文責 : 坂本 昌彦 (研究開発部所属, 社内で使用するWebアプリケーション診断ツールの開発などに従事)

本記事に関するご意見・お問い合わせは坂本までお願いします。

今までのコラム

Webセキュリティをざっくり理解するための3つのMAP

Page Top