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.0HTTP/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: closesent 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.0HTTP/1.1 200 OK
HEAD / HTTP/1.0
Host: www.ntt.comHTTP/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: closesent 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 のバージョンの明示