我正在尝试调试一个通过 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 8443
asroot
来防止从 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 规则影响)。
问题:
鉴于 SSLSplit 以 root 身份运行,我的 iptables 规则如何创建一个循环,导致从 SSLSplit 发送的流量反馈回自身?
我该如何解决这个问题才能最终读取通信内容?
我尝试访问时得到的输出摘录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”子进程完成的。我不确定是否有兴趣将其运行为根除非绑定到低端口。
所以应该做的是: