HTTP Proxy としての StreamRelay.NET.exe

HTTP Proxy として動作させることも可能

サーバとして動作させることが可能な「ローカル」と呼称される側のプロキシの「http」スキームによって、HTTP Proxy として動作させる事が可能

---
### HTTPのみの HTTP Proxy

`-LocalProxy http://`

のみでOK

つまり、

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http://`

で、8080/tcp で HTTP Prxoy として動作する

---
### 上位プロキシへ転送する HTTPのみの HTTP Proxy

「リモート」と呼称される側のストリームの転送先を指定するだけ
つまり、

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:// -RemotePort 8080 -RemoteHost 192.0.2.1`

で、8080/tcp で HTTP Prxoy として動作しつつ、全てを上位プロキシの「192.0.2.1:8080」へ転送する

---
### CONNECT メソッド(CONNECTリクエスト)の取り扱い

上位プロキシがある場合は、「CONNECT」メソッドのリクエストは、上位プロキシ側へ転送しなければ、ダメだよね。
そういう場合は、

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:// -RemotePort 8080 -RemoteHost 192.0.2.1`

192.0.2.1 は、上位のHTTPProxyとして動作している前提。

SSLの設定は特にしていないので、この場合、End-To-End(Webブラウザ⇔(StreamRelay.NET.exeはスルー)⇔Webサーバ)でSSL化される。

一方で、上位プロキシというか、転送先が Proxy ではなくて Webサーバの場合は、「CONNECT」メソッドのリクエストを転送されても困るよね。
そういう場合は、

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:///?DropConnect=true -RemotePort 443 -RemoteHost 192.0.2.2`

192.0.2.2 は、WebServerとして動作している前提。

とすると、「CONNECT」メソッドのリクエストはドロップされる(動的の場合は転送先の決定には活用されるけど)。
この場合も、SSLの設定は特にしていないので、End-To-End(Webブラウザ⇔(StreamRelay.NET.exeはスルー)⇔Webサーバ)でSSL化される。

上位が固定されないような場合は、

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:///?DropConnect=true`

とする。
動的な転送先はWebServerと想定すると「CONNECT」メソッドのリクエストはドロップした方がいいので、この例のように「DropConnect=true」オプションをつけた方がよいだろう。

---
### HTTPS(SSL over HTTP) の取り扱い(MITM な SSL)

サーバ側(接続してきた側)、クライアント側(動的でも上位固定でも転送先の側)で、それぞれSSLにするかどうか個別に柔軟に設定できる。

それが、
`AutoSSLServer`
と
`AutoSSLClient`


#### HTTPS(SSL over HTTP) の取り扱い(MITM な SSL)(サーバのみ)

上記のオプションは、「CONNECT」メソッドのリクエストを受信した際に、サーバ側またはクライアント側をSSL化するかどうかを設定する項目。

なので、

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:///?DropConnect=true^&AutoSSLServer=True^&LocalCertFile=server.crt -RemotePort 8080 -RemoteHost 192.0.2.1`

だと、(CONNECTリクエストは破棄して)サーバ側のみSSLにする。(192.0.2.1:8080間(StreamRealy.NET.exe⇔Webサーバ)はSSL化しない)

#### HTTPS(SSL over HTTP) の取り扱い(MITM な SSL)(クライアントのみ)

逆に

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:///?DropConnect=true^&AutoSSLClient=True`

だと、(CONNECTリクエストは破棄して)動的な転送先側(StreamRealy.NET.exe⇔Webサーバ)のみSSLにする。

こいつに、netcat で「GET」すれば、平文で。
または、(netcatはSSL化しないので)「CONNECT」送って、「GET」すれば、SSLで転送先に接続する。という事じゃ。

こんな感じになるので、netcat だけで SSL サーバも調査できる。

>C:\>nc.exe -nvv 127.0.0.1 8080
>(UNKNOWN) [127.0.0.1] 8080 (?) open
>HEAD http://www.ntt.com/ HTTP/1.0
>
>HTTP/1.0 403 Forbidden
>Server: AkamaiGHost
>Mime-Version: 1.0
>Content-Type: text/html
>Content-Length: 261
>Expires: Wed, 21 Jun 2017 05:50:58 GMT
>Cache-Control: max-age=0, no-cache, no-store
>Pragma: no-cache
>Date: Wed, 21 Jun 2017 05:50:58 GMT
>Connection: close
>
>sent 35, rcvd 272: NOTSOCK
>
>C:\>nc.exe -nvv 127.0.0.1 8080
>(UNKNOWN) [127.0.0.1] 8080 (?) open
>CONNECT www.ntt.com:443 HTTP/1.0
>
>HTTP/1.1 200 OK
>
>HEAD / HTTP/1.0
>Host: www.ntt.com
>
>HTTP/1.0 403 Forbidden
>Server: AkamaiGHost
>Mime-Version: 1.0
>Content-Type: text/html
>Content-Length: 259
>Expires: Wed, 21 Jun 2017 05:51:21 GMT
>Cache-Control: max-age=0, no-cache, no-store
>Pragma: no-cache
>Date: Wed, 21 Jun 2017 05:51:21 GMT
>Connection: close
>
>sent 69, rcvd 291: NOTSOCK
>
>C:\>

#### HTTPS(SSL over HTTP) の取り扱い(MITM な SSL)(クライアントとサーバの両方)

`StreamRelay.NET.exe -LocalPort 8080 -LocalProxy http:///?DropConnect=true^&AutoSSLServer=True^&LocalCertFile=server.crt^&AutoSSLClient=True`

と両方設定してあげれば、Paros とか Burp のような、MITM な SSL Proxy にする事も可能だ。
(あとはトラップして編集できる画面があれば、Parosそのままになるけども)

---
### サーバ側のオプション(SSL)

`LocalCertFile` 証明書。サーバ側には必須
`LocalCertPassword` 証明書のパスワード
`LocalUseCertRevocationList` 失効証明書リストを使うかどうか
`LocalProtocol` SSL のバージョンの明示
`NeedClientCert` クライアント証明書を提示させる

---
### クライアント側のオプション(SSL)

`RemoteCertFile` 提示するクライアント証明書。
`RemoteCertPassword` 提示するクライアント証明書のパスワード
`RemoteUseCertRevocationList` 失効証明書リストを使うかどうか
`RemoteProtocol` SSL のバージョンの明示

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)