sPortRedirecotr.exe の画面説明

# sPortRedirecotr.exe

通信経路上に配置して、通信データを編集しつつ転送できるツール

## 画面例
### アプリケーションタブ

#### Network タブ

[動作モード](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#%E5%8B%95%E4%BD%9C%E3%83%A2%E3%83%BC%E3%83%89)を参照

#### Setting タブ

##### Setting タブ1

![068.png](https://qiita-image-store.s3.amazonaws.com/0/182822/1f820001-f9d3-edd9-488d-f1298b82086c.png)

- **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

![069.png](https://qiita-image-store.s3.amazonaws.com/0/182822/1c91792d-4bb9-70d7-1422-c1c01ae72e67.png)

こちらはトラップに関する設定。
そのうち、トラップだけでタブを新設するかも。

- **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機能](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#autoresponse-%E3%82%BF%E3%83%96)を使ってもよい

##### Setting タブ3

![070.png](https://qiita-image-store.s3.amazonaws.com/0/182822/ac066831-f532-2d45-8913-7c190fa14cd6.png)

こちらは、編集画面と絡んでくる設定

説明が必要なものをいくつか・・・

- **EditIsHex** [編集画面](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#%E7%B7%A8%E9%9B%86%E7%94%BB%E9%9D%A2%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E7%94%BB%E9%9D%A2)は 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--&gt;&lt;/option&gt;&lt;/select&gt;&lt;/textarea&gt;&lt;s&gt;%M%%s%&lt;/s&gt;%81」だけど「\"\'"'`a--&gt;&lt;s&gt;%M%%s%&lt;/s&gt;」で実質なんとかなると思う。textareaタグなどは都度必要な場面で挿入すればいい。
    - 簡易判定では、この試験用文字列(特にマーキング文字列)が返却されているのかがポイントで、さらに細かく言うと、この試験用文字列の「%s%」の手前までが返却されているかどうかがポイント(変数名「%s%」は変動が大きいので、その手前まで簡易判定を実施している)。なので、「%s%」の手前に「%M%」を埋め込むと簡易判定が適切に動作する
- **簡易SQLInjection** カンマ区切りの文字列を指定すると、編集画面の**「SetSQLi」**ボタンで順番に挿入される
- **ホスト名** これは、ヘッダの書き換えなどでのマクロ「%H%」の値となる

[編集画面(トラップ画面)](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#%E7%B7%A8%E9%9B%86%E7%94%BB%E9%9D%A2%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E7%94%BB%E9%9D%A2)
といったりきたりしながら見てほしい

#### Logging タブ

![065.png](https://qiita-image-store.s3.amazonaws.com/0/182822/e26c7260-61c5-c78c-71ba-6a6d70447d74.png)

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 タブ

![066.png](https://qiita-image-store.s3.amazonaws.com/0/182822/32b3367c-7f11-7b5f-4d08-70444618a6a5.png)

今までの通信履歴を表示するサブウィンドウの設定。

主に、コネクション毎のリストのカラムの色と、HTTPレスポンスを表示するテキストボックスの右クリックメニューの外部プログラムの指定。

ただ、sPortRedirecotr.exe は GUI スレッドの負荷が大きく、History サブウィンドウは別のexeにして、.NET Remoting か匿名パイプで通信させようかどうかと思案中なので、そのようになった場合は、このタブは消えると思う。

#### ExceptionList タブ

トラップする際の例外などを指定するタブ

##### ExceptionList→拡張子 タブ

HTTPリクエスト・メッセージで、登録した拡張子はトラップしないようにする

これに応じて、レスポンスもトラップ対象から外される

![055.png](https://qiita-image-store.s3.amazonaws.com/0/182822/61baf628-60e8-200f-74ac-37e22f0389d2.png)

##### ExceptionList→ContentType タブ

HTTPレスポンス・メッセージで、登録したContent-Type ヘッダ値はトラップしないようにする

![056.png](https://qiita-image-store.s3.amazonaws.com/0/182822/447188e2-e44c-d925-7142-07e2ad7d7dea.png)

##### ExceptionList→URL タブ

HTTPリクエスト/レスポンス・メッセージで、登録したURLはトラップしないようにする。

例えば、HTMLページ内部でハートビート処理ためだけのリクエストとかを設定するとよいと思う。

![057.png](https://qiita-image-store.s3.amazonaws.com/0/182822/a8d5e1df-48bd-90bd-8eac-dc683e7a3ed0.png)

##### ExceptionList→TargetHost タブ

HTTPリクエスト/レスポンス・メッセージで、登録したTargetHostのみトラップする。

設定されていなければ、全てのホストが対象となるが、これを設定すると、設定したホストのみを対象にトラップする

![058.png](https://qiita-image-store.s3.amazonaws.com/0/182822/8cb78c9d-5125-71a0-748a-a9bdb4e97b94.png)

##### ExceptionList→DropHost タブ

HTTPリクエスト/レスポンス・メッセージで、登録したDropHostへの通信をブロックする

例えば、セキュリティ診断対象がまだ未公開/社内秘の状態なので、Webブラウザから(セキュリティベンダが多いが)他のWebサイトへ情報が漏れないようにしたい。
というときに使えると思う。

![059.png](https://qiita-image-store.s3.amazonaws.com/0/182822/a85b5938-f31e-fe8d-44b0-1fa661802f97.png)

#### Script タブ

基本的な仕組みは同じなので、[sWebMachineGun.exe Manual の Scriptタブ](https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3#script%E3%82%BF%E3%83%96)を参照

#### AutoResponse タブ

指定された URL については、Webサーバへ転送せずに、自らがレスポンスを返却する

この機能はプラグイン形式なので、拡張可能。

概ね CGI と同じような挙動(環境変数や、HTTP ヘッダの受け渡しなど)になるようにしている。

同梱の「**CgiSample.exe**」がサンプルプログラムで、環境変数などを表示する exe

##### AutoResponse→FILE

指定された URL については、指定されたファイル内容を、HTTPレスポンスとして返却する
ほぼほぼ、静的なWebサーバだと思う。

![061.png](https://qiita-image-store.s3.amazonaws.com/0/182822/7c771aa0-acf6-b9c5-c2d2-f745707f9991.png)

##### AutoResponse→DATA

指定された URL については、指定されたデータを、HTTPレスポンスとして返却する

![062.png](https://qiita-image-store.s3.amazonaws.com/0/182822/3691ed98-4948-eb86-c739-6881baf46709.png)

##### AutoResponse→PROGRAM

指定された URL については、指定されたプログラムの標準出力を、HTTPレスポンスとして返却する
ほぼほぼ CGI だと思う。

![063.png](https://qiita-image-store.s3.amazonaws.com/0/182822/ca6914ae-0c5a-7ff6-11d0-33ab2e203e1d.png)

##### AutoResponse→SCRIPT

指定された URL については、指定されたスクリプト言語で、スクリプトファイルを実行して、HTTPレスポンスとして返却する
ほぼほぼ WebApplication だと思う。

![064.png](https://qiita-image-store.s3.amazonaws.com/0/182822/37223690-dd74-704a-9de6-92baff1e9ace.png)

##### AutoResponse→AutoPilot

未稿

#### HeaderEdit タブ

HTTPリクエスト/レスポンスをホストごとに編集できる。

基本的には「Default」ボタンで、既定のリストを出して、似たようなものを、ダブルクリックで編集画面にコピーして使うというパターンが操作的に楽だと思う。

![060.png](https://qiita-image-store.s3.amazonaws.com/0/182822/08d0bbcd-aba2-00c6-74d2-6d83a16269c4.png)

# 編集画面(トラップ画面)

メニューやボタンの細かい動作は、[EditSetting](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#setting-%E3%82%BF%E3%83%963)で設定する

まずは上部のボタンたち

<dl>
<dt><b>Send</b></dt>
<dd>送信(転送)する</dd>
<dt><b>Cancel</b></dt>
<dd>送信しないで捨てる</dd>
<dt><b>CSRF</b></dt>
<dd>CSRF 試験用の HTML を生成する
<img src="https://qiita-image-store.s3.amazonaws.com/0/182822/0ff7cc2a-cb1a-1437-fd39-bc1f4914fbc1.png" alt="073.png">なウィンドウが出てくる。ここでファイル名と、送信先URLを確認して「Save」を推すと HTMLファイルができる。「XHRlv2」をチェックすると、通常のPOSTからXHRlv2で送信するようになる</dd>
<dt><b>WriteLog</b></dt>
<dd>ParameterLog にロギングする。カラム中の「sPortAuto」が「sPortEdit」になるので、診断対象のみこのボタンの押下をしておけば、後で grep すれば診断対象だけ抽出できる</dd>
<dt><b>SendAfterLog</b></dt>
<dd>「WriteLog」を押下後、すぐにSendする。つまり「WriteLog」→「Send」が「WriteLog」の押下一回で済む</dd>
<dt><b>HostMusi</b></dt>
<dd>このURLに関してはHostヘッダの自動書換を禁止する。<a href="https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#headeredit-%E3%82%BF%E3%83%96">ヘッダの自動編集機能</a>を使って「Host」ヘッダをいじっていたりすると、そもそも不正なHostヘッダはWebサーバ部でエラーと判定されるようなことがあるので、例えば(頻繁にアクセスする)ログイン画面だけはHostヘッダを自動編集しない。というような事ができる</dd>
<dt><b>TrapMusi</b></dt>
<dd>この URL を以降トラップしない。<a href="https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#exceptionlisturl-%E3%82%BF%E3%83%96">ExceptionList→URL タブ</a>に登録される
</dd>
<dt><b>NoTrapRequest/NoTrapResponse</b></dt>
<dd>トラップモードを変更(Off)する。このボタンを右クリックすると、Request/Responseを同時に変更(Off)できる</dd>
<dt><b>SetSQLi</b></dt>
<dd>目印が記憶されていない場合は、選択領域を目印にして、<a href="https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#setting-%E3%82%BF%E3%83%963">EditSetting</a>で設定したカンマ区切りの**簡易SQLInjection**を分解して、0番目、1番目、2番目と順に挿入していく<br>
たとえば「'||','%2b'」だった場合、最初は目印が無指定なので、挿入箇所の手前のイコールの前から選択して、ボタンを押せば、0番目の「'||'」がメッセージに挿入される。<br>
んで、次のリクエストでは既に前回のリクエストで目印が登録されたのでボタンを押すだけで、目印の右側に0+1=1番目の「'%2b'」が挿入される</dd>
<dt><b>JSON</b></dt>
<dd>上記の「SetSQLi」時に挿入する文字列を JSON エスケープするかどうか</dd>
<dt><b>CopyURL</b></dt>
<dd>URL と変数一覧をクリップボードにコピーする</dd>
<dt><b>CopyCB</b></dt>
<dd>メッセージをクリップボードにコピーする</dd>
<dt><b>CopyWM</b></dt>
<dd>メッセージを<a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3">sWebMachineGun.exe</a>に転送する。この<a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3">sWebMachineGun.exe</a>はsPortRedirecotr.exe内部で動作(GUIスレッドが共有)するので、スキャン前に<a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3">sWebMachineGun.exe</a>は「Reload」した方がよいぞ</dd>
<dt><b>ParamFrom</b></dt>
<dd>hクリップボードを読み込み、それをWWW-Form形式として判断して、または改行で区切られた変数名一覧として判断して、(基本的に「=」までの左側を変数名と判断する)、変数名を抽出して、メッセージ中の変数に試験用文字列を挿入する<br><a href="https://qiita.com/tomoki0sanaki/items/e2b7767551a576b1dbd3">sWebMachineGun.exe</a>でXSSを孕んでいる変数名一覧を抽出して、クリップボードへ転送。このボタンで、XSSを孕んでいる変数だけにXSS試験用文字列を一斉に与えることができる(画面キャプチャが楽になると思う)</dd>
<dt><b>EntryAP</b></dt>
<dd>AutoPilotの候補リクエストとしてエントリする。詳細は<a href="https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#autoresponseautopilot">こちら</a></dd>
</dl>

![071.png](https://qiita-image-store.s3.amazonaws.com/0/182822/67df6966-3f0a-86db-1010-8a52f2de35bc.png)

拡張された右クリックメニューは以下

![072.png](https://qiita-image-store.s3.amazonaws.com/0/182822/c818331e-d543-f230-846a-5337bfdaf5c8.png)

HTTP 系は、sWebMachingun.exe でも取り上げているので、省略

- **挿入(Ctrl+E)** 試験用文字列を挿入する(☆1)(☆2)(☆3)
- **挿入(Ctrl+R)** 試験用文字列をJSONエスケープして挿入する
- **挿入(Ctrl+W)** 試験用文字列をXMLエスケープして挿入する
- **挿入(Ctrl+Q)** 試験用文字列をHTMLエンコードして挿入する

**試験用文字列** とは、[EditSetting](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723#setting-%E3%82%BF%E3%83%963)で設定した**置換用**がソレ。

(☆1) 数字だけ選択して「Ctrl+E」すると、計算式に変化する(例えば、「11」→「12-1」)

(☆2) 選択領域がある場合、選択領域をwww-form形式だと見なして、変数名と値に分解、値へ前方埋め込みを実施する。これで連続した複数の変数に対して一斉に挿入できる。

(☆3) カーソルが文末の場合、挿入して、新変数(試験用文字列が変数名)を挿入する

# 動作モード

ベースとなっているのは、TCPフォワーダーなため、さまざまな動作モードで起動させる事ができる。

[sPortRedirecotr.exeの動作モード](https://qiita.com/tomoki0sanaki/items/5038dbba57f9c29f7e11)

# 使い方

未稿

# 利用に際して

当然ですが、本ツールは、デバグ用、開発用であり、悪用厳禁ですよ。

# インデックスへ戻る

[sWebTool Manual index](https://qiita.com/tomoki0sanaki/items/b8f571ae296a32f7b434)

# 以上