sPortRedirecotr.exe
通信経路上に配置して、通信データを編集しつつ転送できるツール
画面例
アプリケーションタブ
Network タブ
動作モードを参照
Setting タブ
Setting タブ1
- XMLのインポート/エクスポートは、他のツールと一緒なので、省略
- HttpCompression はプラグインから読み込まれた HTTP 圧縮機能の一覧。← HTTP圧縮機能自体あまりデバグしていない
-
HTTP は HTTP に関する設定
- HTTP/100 Continue は、リクエスト受信時、(Webブラウザからの再送を防ぐために)とにかく HTTP/100 を返すかどうか。
- AutoCalcContentLength は、HTTPボディを送信する時に Content-Lengthを計算しなおすかどうか
- AllowSendingTransferEncoding TransferEncoding状態で転送するかどうか。これがチェックされていない場合は、伝統的な HTTP1.0 でも通用するように素のHTTPボディを送る
- AllowSendingContentEncoding ContentEncoding状態で転送するかどうか。これがチェックされていない場合は、HTTP 圧縮せずに転送する
- DetectReverseProxy Host 毎に Serverヘッダを記憶し、変化があれば通知するかどうか。一つのホスト(実はリバースプロキシ)でバックエンドが複数あるようなリバースプロキシを(Serverヘッダが変化する事で)検知する事ができる
- Use HTTP 1.0 なるべく TCP 接続は使いまわそうとしない。「Connection: close」を使って、レスポンス送信後に切断するようにするかどうか
HTTP の場合、解析したりするためにきれいな素直な HTTP メッセージが欲しいので、一旦HTTPメッセージをバッファリングしてり、解凍したりしているので、AllowSendingTransferEncoding と AllowSendingContentEncoding を有効にするという事は、再度転送のために、チャンクしたり、圧縮したりする。という事です。
AllowSendingTransferEncoding と AllowSendingContentEncoding は、HTTPヘッダに該当するヘッダがあれば、ヘッダに応じた処理をするようになりますが、これらのチェックが OFF の場合は、該当するヘッダを削除して、素直な HTTP メッセージのまま転送します。
AllowSendingTransferEncoding を有効にした場合、チャンクは一つとなります。(一つのデータチャンクと一つの終了を示すヌルチャンク)
なので、あまり有効にしなきゃいけない場面はないと思う
Setting タブ2
こちらはトラップに関する設定。
そのうち、トラップだけでタブを新設するかも。
- Reverseボタン。On/Offの切り替え。例えば、Request=On,Response=Offだったら、Request=Off,Response=On になる
- AllTrapボタン。Request/Response共にOnになる
- NoTrapボタン。Request/Response共にOffになる
-
遅延トラップ
- トラップを遅延させる(リクエストのみ)。既定は回数(トラップ対象の回数)。TimeをOnにすると、秒数になる
-
文字列検索によるトラップ
- 指定された文字列があればトラップとする
遅延トラップは、例えば、DropDownListボックスで、開いた瞬間にリクエスト(①)が出る。その後の選択した時にもリクエスト(➁)がでる。んで➁をトラップしたい、という場合、最初からTrapだと①の段階でトラップされて、DropDownListが表示されない。トラップを解除するためにフォーカスをずらすと、開いたDropDownListが閉じる。
そういう場合、「回数=1」に設定すると、開いた瞬間のリクエスト(①)はバックグラウンドで普通にスルーされて、リストを選択した時のリクエストが最初にトラップされる。
という事ができる
文字列検索によるトラップは、Webブラウザのデバグ機能で、該当するJavaScriptを見つけて、それを書き換えたい場合、特徴的な文字列(メソッド名とか)を指定してあげれば、そのJavaScriptレスポンスでトラップされるので、そこで編集/書き換えができるようになる。
→
AutoResponse機能を使ってもよい
Setting タブ3
こちらは、編集画面と絡んでくる設定
説明が必要なものをいくつか・・・
- EditIsHex 編集画面は 16進数表記か、テキスト表記か
- Add/Remove Cert Loading ロード時の証明書のWindowsへの自動登録(信頼)と排除なのだけど、あまりうまく動いていないと思う(ver4.9.0.0)
- MaxLimitSize HTTPメッセージで扱う最大サイズ。このサイズ以上の HTTPメッセージは、スルーされる。ログにもHistryにも残らないし、トラップもできない。
- UrlEncodeInHttpRequestBody URLエンコードされた変数たちを簡単な URL デコードを実施する。またJSONリクエスト/レスポンスの JavaScript のエンコードもデコードする、かどうか
- StaySimpleUrlEncoded 上記の簡易URLデコードされたデータのまま転送するか、転送時に元に戻す(URLエンコードしなおす)か、どうかの設定
- SurrogatePair 上記の簡易URLデコードの際、Unicode符号化でサロゲートペアとするか、Unicodeコードポイントをそのまま使用するか、という設定
- DetectCharSet ヘッダや(実際に符号化したり)などで、文字コードを自動判定するかどうか。文字コード判定処理(既定の文字コードから始める)は重いので、既定の文字コードはヒットしやすいように診断対象毎に適切に設定しておいた方がよいぞ。
- DetectCharsetByReferer URL毎に文字コードを記憶しておき、RefererヘッダのURLから文字コードを推定するかどうか
- フォントと文字コードの指定 HTTP用にヘッダとボディの2つを指定する。まぁ、ヘッダは「UTF-8」一択でよいと思う。ver4.9.0.0現在、ヘッダの文字コードが内部的に「パス」「クエリー」「ダウンロードファイル」「クッキー」「その他ヘッダ全体」と細分化されていて、あまり意味をなしていないかもしれないけど、それらの既定の文字コードとして機能している
EditSetting はトラップした編集画面でのメニューなどの設定
- マーキング文字列 は検索しやすいように特徴的な文字列を与えておくとよい
-
置換用 がいわゆる試験用文字列となる。マクロがいくつかある
- 「%M%」 マーキング文字列
- 「%s%」 は変数名。変数と絡んで挿入する場合は、変数名に置換される。それ以外は空文字列に置換される
- ver4.9.0.0 現在のDefault値は「"'"'
a--></option></select></textarea><s>%M%%s%</s>%81」だけど「\"\'"'
a--><s>%M%%s%</s>」で実質なんとかなると思う。textareaタグなどは都度必要な場面で挿入すればいい。 - 簡易判定では、この試験用文字列(特にマーキング文字列)が返却されているのかがポイントで、さらに細かく言うと、この試験用文字列の「%s%」の手前までが返却されているかどうかがポイント(変数名「%s%」は変動が大きいので、その手前まで簡易判定を実施している)。なので、「%s%」の手前に「%M%」を埋め込むと簡易判定が適切に動作する
- 簡易SQLInjection カンマ区切りの文字列を指定すると、編集画面の**「SetSQLi」**ボタンで順番に挿入される
- ホスト名 これは、ヘッダの書き換えなどでのマクロ「%H%」の値となる
編集画面(トラップ画面)
といったりきたりしながら見てほしい
Logging タブ
HTTP 通信のロギングに関する設定
-
URL Setting おそらくログの主キーとなるであろう URI としての設定
- xxx.php/aa/bb CSV 形式で指定した文字列がURLの途上にあった場合、それ以降をxxx.php?aa=bb というように解釈する。xxx.php/aa/bbというのをエキストラパス情報という
- LastToParam URLパスの最後はクエリ文字列と見なす
- QuerySession 指定された文字列以降を URL から削除して解釈する Java の xxx.jsp;jsessionid=aaaaa 対策
- ParamToURI CSV形式で指定したクエリ文字列をURLと見なす enquete.php?action=input とか enquete.php?action=complete が別の URL としてロギングされるようにする対策
- Header URLと見なす対象をクエリストリング/フォームから、HTTPヘッダに変更する
- IgnoreCase URLと見なす場合、大/小文字は無視する
- NoValue URLと見なす場合、値は無視する enquete.php?input=xxx とか enquete.php?complete=xxxx* とかの対策。ただし、input,complete と変数名を事前に指定する必要はあるけど
-
ParameterLogging
- ParamLog URL,変数名,値をCSV形式としてロギングする≪いわゆるログログと呼んでいる≫
- Template ver4.9.0.0 のソースコード呼んでも GUI の機能しか実装していない。思い出せない。そのうち消すと思う
-
HeaderLog
- HeaderLogFile URLとヘッダを記録するファイル。例えばこの URL だけキャッシュ制御ヘッダがない、とかを後から確認できる
- HeaderName ログに記録する対象のヘッダ名を CSV 形式で指定する
- Status ログに HTTP レスポンス・ステータスコードも記録する
- Method ログに HTTPリクエストメソッドも記録する
-
JSLog
- ResponseLogFolder ログを記録するフォルダ。HTTPレスポンスごとに1つのファイル(ファイル名はURLを全角にしたようなファイル名となる)として記録するので、後で JS のソースコードとか眺められる
- ResponseLogExtention ログに記録する対象の拡張子
-
HTML Header/Comment Logging
- HTMLComment HTMLコメント(SSIとして実行しなかった残骸とか)と HTMLヘッダを記録するので、後で確認できる
History タブ
今までの通信履歴を表示するサブウィンドウの設定。
主に、コネクション毎のリストのカラムの色と、HTTPレスポンスを表示するテキストボックスの右クリックメニューの外部プログラムの指定。
ただ、sPortRedirecotr.exe は GUI スレッドの負荷が大きく、History サブウィンドウは別のexeにして、.NET Remoting か匿名パイプで通信させようかどうかと思案中なので、そのようになった場合は、このタブは消えると思う。
ExceptionList タブ
トラップする際の例外などを指定するタブ
ExceptionList→拡張子 タブ
HTTPリクエスト・メッセージで、登録した拡張子はトラップしないようにする
これに応じて、レスポンスもトラップ対象から外される
ExceptionList→ContentType タブ
HTTPレスポンス・メッセージで、登録したContent-Type ヘッダ値はトラップしないようにする
ExceptionList→URL タブ
HTTPリクエスト/レスポンス・メッセージで、登録したURLはトラップしないようにする。
例えば、HTMLページ内部でハートビート処理ためだけのリクエストとかを設定するとよいと思う。
ExceptionList→TargetHost タブ
HTTPリクエスト/レスポンス・メッセージで、登録したTargetHostのみトラップする。
設定されていなければ、全てのホストが対象となるが、これを設定すると、設定したホストのみを対象にトラップする
ExceptionList→DropHost タブ
HTTPリクエスト/レスポンス・メッセージで、登録したDropHostへの通信をブロックする
例えば、セキュリティ診断対象がまだ未公開/社内秘の状態なので、Webブラウザから(セキュリティベンダが多いが)他のWebサイトへ情報が漏れないようにしたい。
というときに使えると思う。
Script タブ
基本的な仕組みは同じなので、sWebMachineGun.exe Manual の Scriptタブを参照
AutoResponse タブ
指定された URL については、Webサーバへ転送せずに、自らがレスポンスを返却する
この機能はプラグイン形式なので、拡張可能。
概ね CGI と同じような挙動(環境変数や、HTTP ヘッダの受け渡しなど)になるようにしている。
同梱の「CgiSample.exe」がサンプルプログラムで、環境変数などを表示する exe
AutoResponse→FILE
指定された URL については、指定されたファイル内容を、HTTPレスポンスとして返却する
ほぼほぼ、静的なWebサーバだと思う。
AutoResponse→DATA
指定された URL については、指定されたデータを、HTTPレスポンスとして返却する
AutoResponse→PROGRAM
指定された URL については、指定されたプログラムの標準出力を、HTTPレスポンスとして返却する
ほぼほぼ CGI だと思う。
AutoResponse→SCRIPT
指定された URL については、指定されたスクリプト言語で、スクリプトファイルを実行して、HTTPレスポンスとして返却する
ほぼほぼ WebApplication だと思う。
AutoResponse→AutoPilot
未稿
HeaderEdit タブ
HTTPリクエスト/レスポンスをホストごとに編集できる。
基本的には「Default」ボタンで、既定のリストを出して、似たようなものを、ダブルクリックで編集画面にコピーして使うというパターンが操作的に楽だと思う。
編集画面(トラップ画面)
メニューやボタンの細かい動作は、EditSettingで設定する
まずは上部のボタンたち
- Send
- 送信(転送)する
- Cancel
- 送信しないで捨てる
- CSRF
- CSRF 試験用の HTML を生成する なウィンドウが出てくる。ここでファイル名と、送信先URLを確認して「Save」を推すと HTMLファイルができる。「XHRlv2」をチェックすると、通常のPOSTからXHRlv2で送信するようになる
- WriteLog
- ParameterLog にロギングする。カラム中の「sPortAuto」が「sPortEdit」になるので、診断対象のみこのボタンの押下をしておけば、後で grep すれば診断対象だけ抽出できる
- SendAfterLog
- 「WriteLog」を押下後、すぐにSendする。つまり「WriteLog」→「Send」が「WriteLog」の押下一回で済む
- HostMusi
- このURLに関してはHostヘッダの自動書換を禁止する。ヘッダの自動編集機能を使って「Host」ヘッダをいじっていたりすると、そもそも不正なHostヘッダはWebサーバ部でエラーと判定されるようなことがあるので、例えば(頻繁にアクセスする)ログイン画面だけはHostヘッダを自動編集しない。というような事ができる
- TrapMusi
- この URL を以降トラップしない。ExceptionList→URL タブに登録される
- NoTrapRequest/NoTrapResponse
- トラップモードを変更(Off)する。このボタンを右クリックすると、Request/Responseを同時に変更(Off)できる
- SetSQLi
- 目印が記憶されていない場合は、選択領域を目印にして、EditSettingで設定したカンマ区切りの**簡易SQLInjection**を分解して、0番目、1番目、2番目と順に挿入していく
たとえば「'||','%2b'」だった場合、最初は目印が無指定なので、挿入箇所の手前のイコールの前から選択して、ボタンを押せば、0番目の「'||'」がメッセージに挿入される。
んで、次のリクエストでは既に前回のリクエストで目印が登録されたのでボタンを押すだけで、目印の右側に0+1=1番目の「'%2b'」が挿入される - JSON
- 上記の「SetSQLi」時に挿入する文字列を JSON エスケープするかどうか
- CopyURL
- URL と変数一覧をクリップボードにコピーする
- CopyCB
- メッセージをクリップボードにコピーする
- CopyWM
- メッセージをsWebMachineGun.exeに転送する。このsWebMachineGun.exeはsPortRedirecotr.exe内部で動作(GUIスレッドが共有)するので、スキャン前にsWebMachineGun.exeは「Reload」した方がよいぞ
- ParamFrom
- hクリップボードを読み込み、それをWWW-Form形式として判断して、または改行で区切られた変数名一覧として判断して、(基本的に「=」までの左側を変数名と判断する)、変数名を抽出して、メッセージ中の変数に試験用文字列を挿入する
sWebMachineGun.exeでXSSを孕んでいる変数名一覧を抽出して、クリップボードへ転送。このボタンで、XSSを孕んでいる変数だけにXSS試験用文字列を一斉に与えることができる(画面キャプチャが楽になると思う) - EntryAP
- AutoPilotの候補リクエストとしてエントリする。詳細はこちら
拡張された右クリックメニューは以下
HTTP 系は、sWebMachingun.exe でも取り上げているので、省略
- 挿入(Ctrl+E) 試験用文字列を挿入する(☆1)(☆2)(☆3)
- 挿入(Ctrl+R) 試験用文字列をJSONエスケープして挿入する
- 挿入(Ctrl+W) 試験用文字列をXMLエスケープして挿入する
- 挿入(Ctrl+Q) 試験用文字列をHTMLエンコードして挿入する
試験用文字列 とは、EditSettingで設定した置換用がソレ。
(☆1) 数字だけ選択して「Ctrl+E」すると、計算式に変化する(例えば、「11」→「12-1」)
(☆2) 選択領域がある場合、選択領域をwww-form形式だと見なして、変数名と値に分解、値へ前方埋め込みを実施する。これで連続した複数の変数に対して一斉に挿入できる。
(☆3) カーソルが文末の場合、挿入して、新変数(試験用文字列が変数名)を挿入する
動作モード
ベースとなっているのは、TCPフォワーダーなため、さまざまな動作モードで起動させる事ができる。
使い方
未稿