Networking

本地透明代理 SSLSplit 導致轉發循環

  • February 27, 2022

我正在嘗試調試通過 HTTPS 發送 RPC 的應用程序。為了讀取實際的 RPC 內容,我嘗試在與應用程序相同的機器上使用 SSLSplit 來 MITM 連接。為此,我在我的 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 -D -k key.pem -c cert.pem -P https 127.0.0.1 8443root防止來自 SSLSplit(到目標伺服器)的出站流量被重定向回 SSLSplit。儘管如此,我得到Error 24 on listener: Too many open files了,根據https://github.com/droe/sslsplit/issues/93#issuecomment-96894847可以歸因於打開了太多的套接字。這可能是 SSLSplit 發送的流量被循環回 SSLSplit 的症狀。

鑑於 SSLSplit 以 root 身份執行並且 root 流量不受重定向規則的影響,我不知道我做錯了什麼。此外,我通過兩次執行 curl 來檢查我的 iptables 規則是否正確,一次以 root 身份執行,一次以非 root身份執行。正如預期的那樣,非根捲曲不起作用(curl: (7) Failed to connect to unix.stackexchange.com port 443: Connection refused),而根捲曲完美地工作(==> 不受 iptables 規則的影響)。

問題:

  1. 鑑於 SSLSplit 以 root 身份執行,我的 iptables 規則如何創建一個循環,導致從 SSLSplit 發送的流量被回饋回自身?
  2. 我該如何解決這個問題才能最終能夠閱讀通信?

嘗試在執行 SSLSplit 的瀏覽器中訪問https://unix.stackexchange.com時得到的輸出摘錄:

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

閱讀 OP 的相同連結評論

添加一個輸入介面,以便僅將入站連接發送到 sslsplit,例如,如果您面向 LAN 的介面是 eth0,而面向 WAN 的介面是 eth1,

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

這不是所做的,因此無法警告如何以root使用者身份執行是由sslsplit.

實際上,當以rootsslsplit身份執行時,該命令會通過切換到使用者來放棄特權,除非另有配置: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"

這是對分叉的“工人”子程序完成的。我不確定是否有興趣以root身份執行它,除非綁定到低埠。

所以應該做的是:

  • sslsplit以普通使用者身份執行

它不會更改 uid 或 gid,只需確保要攔截的應用程序不會以該使用者身份執行。將重定向更改為:

iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner normaluser --dport 443 -j REDIRECT --to-port 8443
  • 或配置sslsplit以在以 root 身份執行時使用專用使用者和/或組。

為此,請參閱配置文件或選項。為此,我會使用(或創建和使用)該組。然後會使用.-u-mproxy``! --gid-owner proxy

引用自:https://unix.stackexchange.com/questions/692276