本地透明代理SSLSplit导致转发循环

本地透明代理SSLSplit导致转发循环

我正在尝试调试一个通过 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 8443asroot来防止从 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. 我该如何解决这个问题才能最终读取通信内容?

我尝试访问时得到的输出摘录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"

这是对分叉的“worker”子进程完成的。我不确定是否有兴趣将其运行为除非绑定到低端口。

所以应该做的是:

  • sslsplit以普通用户身份运行

    它不会更改 uid 或 gid,只需确保要拦截的应用程序不会以该用户身份运行。将重定向更改为:

    iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner normaluser --dport 443 -j REDIRECT --to-port 8443
    
  • 或配置SSL分裂以 root 身份运行时使用专用用户和/或组。

    配置文件或选项-u-m为了这个目的。我会使用(或创建并使用)该组proxy来实现这个目的。然后会使用! --gid-owner proxy

相关内容