LoginSignup
0
0

More than 5 years have passed since last update.

HTTP Proxy としての StreamRelay.NET.exe

Last updated at Posted at 2017-06-21

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 のバージョンの明示


目次へ戻る

目次というか最初の一歩

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0