はじめまして!
百田と申します。普段は脆弱性診断を業務としています。
突然ですが、皆さんは普段 ローカルプロキシ 何を使っていますか?
私は Burp Suite を使っています。お恥ずかしながら、その他のローカルプロキシツールはほとんど使ったことがありません...。
ですが!!
あることがきっかけとなり、Fiddler および FiddlerScript を使ってみることに!
ということで、今回はそのときのことについて、のらりくらりと書き綴ります。
ざっくりと書いたことを項目にすると
- Fiddler・FiddlerScriptとは何か簡単に
- FiddlerScript を使用した理由
- FiddlerScript を使用するためにやったこと
- FiddlerScript の使用において苦労したこと
こんな感じです!
Fiddler・FiddlerScriptとは
Fiddler を使ったときのことを書くので、ざっくりと簡単に Fiddler と FiddlerScript がどんなものかを書いておきます。
Fiddler
HTTP での通信における、リクエスト/レスポンス内容の確認や改変が可能なツールです。
(それ以外にも色々できるようですが...。)
HTTP プロキシ、ローカルプロキシなどと呼ばれています。 同種のツールとして Burp Suite や OWASP ZAP がよく使われている印象です。
FiddlerScript
JScript.NET というプログラミング言語を使用して、Fiddler をカスタマイズできる機能です。
今回は HTTP での通信に対し、リクエストの内容の一部を自動で改変するという用途で使用しました。
事の発端
ある Web サイトにおいて、以下のような条件を持つファイルアップロードの機能を診断することになりました。
- ファイル名とファイルの中身が JSON に格納された状態でリクエストが発生する
- ファイルの中身は Base64 エンコードされている
- ファイルの中身が Base64 エンコードされていない場合にはエラーが発生する
※他にも細かい条件がありましたが、さまざまな理由により省略しています。
実際にリクエストで送信する JSON のイメージを以下に。
{"filename":"HelloWorld.txt","data":"U2VjdXJlIFNreSBUZWNobm9sb2d5"}
- デコードすると U2VjdXJlIFNreSBUZWNobm9sb2d5 は Secure Sky Technology
診断の際には、疑似攻撃値を挿入して、リクエストを送信します。
例として、疑似攻撃値が"Script"という文字列だった場合は、以下のようにします。
{"filename":"HelloWorld.txt","data":"U2VjdXJlIFNreSBUZWNobm9sb2d5Script"}
- data の値の末尾に"Script"を挿入している
診断業務では、さまざまな疑似攻撃値を挿入してリクエストを送信する作業に、それ専用のツールを使用しています。
ここで、ひとつ疑問が浮かびあがりました。 「ファイルの内容に疑似攻撃値を含めた状態で Base64 エンコードし、リクエストを送信したらどうなるだろうか?」
つまりこういうことですね。
Secure Sky Technology疑似攻撃値
↓ Base64 エンコード
U2VjdXJlIFNreSBUZWNobm9sb2d555aR5Ly85pS75pKD5YCk
しかし、専用のツールには疑似攻撃値を自動で Base64 エンコードして送信する機能がありません。 どうしようかなーと思っていると、ふと、あるえらいひとが度々こんなことを言っていたことを思い出しました。
????:「それ、Fiddler ならできるで!」
私は基本的に Burp Suite しか使用していないため、Fiddler のことはよく知らなかったのですが、 他のプロキシツールにもちょっとは興味がありました。
なので、今回は試しに、Fiddler および FiddlerScript を使ってみることにしました。
やったこと
まず、Fiddler をインストール(実際はインストール済みでしたが、一応記載しています。)
次に、FiddlerScript の使い方を一切知らなかったため、以下の記事を読みました。
↑の記事を読んだ結果、AutoResponder 機能 を使うことで、リクエストが特定条件に合致する場合にのみ FiddlerScript を実行させられることがわかりました。
じゃあ AutoResponder 機能も使ってみようということで、今回は以下の設定を行いました。
http://192..... は診断時の Web サイトに実装を似せたローカルの検証環境を指定しています。
この設定によって検証環境への通信に対してのみ、指定したスクリプトが実行されます。
body_mod というのが今回指定したスクリプトです。
スクリプトの内容は以下のとおりです。
(スクリプトの編集はRules -> Customize Rules、またはCtrl + Rから行えます。)
import System; import System.Windows.Forms; import Fiddler; class Handlers { public static function body_mod(oSession: Session){ // Request Bodyに何か入っている場合のみ実行 if(oSession.GetRequestBodyAsString() != ""){ // Request Body の取得 var bodyText = oSession.GetRequestBodyAsString(); // JSON中の"data"に指定された値をBase64エンコード var obj = Fiddler.WebFormats.JSON.JsonDecode(bodyText); var buf = System.Text.Encoding.UTF8.GetBytes(obj.JSONObject["data"]); var bufBase64 = Convert.ToBase64String(buf); obj.JSONObject["data"] = bufBase64; bodyText = Fiddler.WebFormats.JSON.JsonEncode(obj.JSONObject); // Request Bodyに"data"の値をBase64エンコードしたJSONを設定 oSession.utilSetRequestBody(bodyText); } } //元から存在するものは省略 }
このスクリプトはとりあえず動けばいいという感覚で書いたため、何かしらの考慮漏れがあると思います。
ここまでできたら、あとは Fiddler を通して診断対象の機能へ疑似攻撃を行うだけです。
苦労したこと
初めてやることには苦労がつきものです。
ここまでではサクッと簡単に FiddlerScript を使えたように見えますが、実際には何度もコケています。
なので、私が FidderScript を使うにあたって苦労したことをつらつらと書きます。
JScript.NET
FiddlerScript は JScript.NET というプログラミング言語を使用して書きますが、この言語で苦戦しました。
とりあえず、文字列を Base64 エンコードする方法が知りたかったので
JScript.NET Base64 エンコード
とかでググりました。
しかし、でてくるのは似て非なる JScript の記事ばかり。 そう、JScript.NET はググラビリティが低かったのです...。
では、どうやって調べたか...。
JScript.NET ということは .NET 系の機能が使えるということ。つまり、 .NET 系の他言語の記事から必要な情報が得られるかもしれない。 これに気づいてからは、JScript.NET がググりにくいことによるやりづらさが消えました。 結果として Base64 エンコードの方法については、.NET なだけあって .NET 系の他言語の記事から割と簡単に見つけられました。
今後他のことを調べる場合も .NET 系の他言語の情報にあたろうと思います。
未読資料 その1
https://www.microsoft.com/ja-JP/download/details.aspx?id=55984
上記 URL からダウンロードをクリックしてVS2005_JScript_ja-jp.pdfを選択すると、JScript.NET のドキュメントがダウンロードできます。ただ、古いうえに量が膨大すぎて欲しい情報があるか分からなかったので今回は読んでいません。
FiddlerScript
公式の資料が探しづらい。英語わからない
基本的なリクエストやレスポンスの改変は以下の記事に記載されているようです。
https://docs.telerik.com/fiddler/KnowledgeBase/FiddlerScript/ModifyRequestOrResponse
また、今回のスクリプト内で使用している Fiddler.WebFormats.JSON.JsonDecode については、公式に説明されているところを見つけられませんでした。
そのため、以下のようなフォーラムから情報収集を行っていました。
https://www.telerik.com/forums/how-to-use-fiddler-webformats-json-jsondecode
ただ、ここの内容に関しては私の調査能力にも問題がありそうなので、どこかにまとまったものがあるかもしれません。
未読資料 その2
https://fiddlerbook.com/om/html/4B4DBBEA.htm
上記 URL には Fiddler Namespace で使えるクラスの説明がまとまっているようです。
ただ、サイト内検索をかけたところ、Fiddler.WebFormats は見つけられなかったので記載がないものもありそうです。
おわりに
今回紹介した FiddlerScript
調査には少々手間取りましたが、使いこなせれば痒いところに手が届くようになる良い機能だと感じました。
調査の方も、慣れてしまえば問題はなさそうです。ただ、身近に FiddlerScript を使える方がいらっしゃる場合は、まず相談してみるのも良いかなと思います。(私の場合は Fiddler 大好きな方がすぐ近くに...。なので助言をいただきつつの作業でした。)
もし FiddlerScript に興味を持たれた方がいらっしゃいましたら、ぜひ使ってみてください!