ローカル透過プロキシSSLSplitが原因で転送ループが発生する

ローカル透過プロキシSSLSplitが原因で転送ループが発生する

HTTPSを介してRPCを送信するアプリケーションをデバッグしようとしています。実際のRPCコンテンツを読むために、MITM接続アプリケーションと同じシステムでSSLSplitを試しました。これを達成するために、ルートアプリケーションから入っていないすべてのトラフィックを次のようにルーティングするiptables NATテーブルにルールを設定しました127.0.0.1:8443

iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8443

その後、SSLSplitから宛先サーバーへのアウトバウンドトラフィックがSSLSplitにリダイレクトされるのを防ぐためにsslsplit -D -k key.pem -c cert.pem -P https 127.0.0.1 8443実行しました。rootそれにもかかわらず、私は次Error 24 on listener: Too many open filesのような結果を得ます。https://github.com/droe/sslsplit/issues/93#issuecomment-96894847おそらく、あまりにも多くのソケットが開いているからです。これは、SSLSplitから送信されたトラフィックがSSLSplitにループバックする症状です。

SSLSplitがルートとして実行され、ルートトラフィックがリダイレクトルールの影響を受けないことを考慮すると、私が間違っているかどうかはわかりません。また、rootとして1回、非rootとして1回、2回カールを実行して、私のiptablesルールが正しいことを確認しました。予想通り、非ルートカールは機能しませんが(curl: (7) Failed to connect to unix.stackexchange.com port 443: Connection refused)ルートカールは完全に機能します(==> iptablesルールの影響を受けません)。

質問:

  1. SSLSplitがrootとして実行されている場合、私のiptablesルールはどのようにSSLSplitから送信されたトラフィックが独自にフィードバックされるようにループを生成できますか?

  2. 最終的に通信内容を読むには、この問題をどのように解決する必要がありますか?

アクセスしようとしたときに得られた出力の抜粋https://unix.stackexchange.com私のブラウザでSSLSplitを実行します。

SNI peek: [www.gravatar.com] [complete]
Connecting to [192.0.73.2]:443
<repeated 96 times>

SNI peek: [platform-lookaside.fbsbx.com] [complete]
SNI peek: [www.gravatar.com] [complete]
Connecting to [157.240.17.15]:443
Connecting to [192.0.73.2]:443
<repeated some more times>

SNI peek: [www.gravatar.com] [complete]
Connecting to [192.0.73.2]:443
<repeated 95 times>

SNI peek: [platform-lookaside.fbsbx.com] [complete]
SNI peek: [www.gravatar.com] [complete]
Connecting to [157.240.17.15]:443
Connecting to [192.0.73.2]:443
<repeated some more times>

Error 24 on listener: Too many open files
Main event loop stopped (reason=0).
Child pid 12445 exited with status 0

ベストアンサー1

OPを読む非常に同じリンクコメント:

インバウンド接続のみがsslsplitに送信されるように入力インターフェイスを追加します(たとえば、LAN接続インターフェイスがeth0でWAN接続インターフェイスがeth1の場合)。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

これは実行された操作ではないため、実行方法を警告する方法はありません。ユーザーはによって処理されますsslsplit

sslsplit実行時の実際のコマンドは次のとおりです。、切り替えて権限を放棄ユーザーへnobody特に設定しない限り:

/*
 * User to drop privileges to by default.  This user needs to be allowed to
 * create outbound TCP connections, and in some configurations, perform DNS
 * resolution.
 *
 * Packagers may want to use a specific service user account instead of
 * overloading nobody with yet another use case.  
[...]
 */
#define DFLT_DROPUSER "nobody"

これは、分岐した「ワーカー」サブプロセスに対して行われます。私はこれを次のように実行することに興味があるかどうかわかりません。低いポートにバインドされていない限り。

したがって、実行する必要がある作業は次のとおりです。

  • sslsplit一般ユーザーとして実行

    uid または gid は変更されず、ブロックするアプリケーションがそのユーザーとして実行されていないことを確認します。リダイレクトを次に変更します。

    iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner normaluser --dport 443 -j REDIRECT --to-port 8443
    
  • または構成SSL分割ルートとして実行する場合は、専用のユーザーおよび/またはグループを使用してください。

    バラより構成ファイルまたはオプション-uそして-mこの目的のために。私はproxyこの目的のためにこのグループを使用(または作成および使用)します。その後使用されます! --gid-owner proxy

おすすめ記事