bad*_*unk 15 ssl https man-in-the-middle iptables transparent-proxy
我有一个装有 2 个网卡的 linux 机器,用于检查通过端口 80 的流量。一张网卡用于上网,另一张卡连接到网络交换机。关键是为了调试目的,能够检查连接到该交换机的设备上的所有 HTTP 和 HTTPS 流量。
我已经为 iptables 编写了以下规则:
nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337
-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
在 192.168.2.1:1337,我有一个使用 Charles ( http://www.charlesproxy.com/ ) 进行录制的透明 http 代理。
对于端口 80 一切正常,但是当我为指向端口 1337 的端口 443 (SSL) 添加类似的规则时,我通过 Charles 收到有关无效消息的错误。
我之前与 Charles ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ )在同一台计算机上使用过 SSL 代理,但由于某种原因透明地执行它没有成功。我在谷歌上搜索的一些资源说这是不可能的 - 如果有人可以解释原因,我愿意接受它作为答案。
请注意,我可以完全访问所描述的设置,包括连接到子网的所有客户端 - 因此我可以接受 Charles 的自签名证书。解决方案不必特定于 Charles,因为理论上,任何透明代理都可以。
谢谢!
编辑:在玩了一会儿之后,我能够让它为特定的主机工作。当我将 iptables 修改为以下内容时(并在 charles 中打开 1338 进行反向代理):
nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.2.1:1338
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 1338
-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
我能够得到响应,但没有目标主机。在反向代理中,如果我只是指定从 1338 开始的所有内容都转到我想要访问的特定主机,它会正确执行握手,我可以打开 SSL 代理来检查通信。
设置不太理想,因为我不想假设 1338 的所有内容都转到该主机 - 知道为什么要剥离目标主机吗?
再次感谢
Bru*_*uno 12
您看到的问题与阻止在单个 IP 地址/端口(不使用服务器名称指示)上使用多个证书的问题相同。
在纯 HTTP 中,您的透明代理可以通过查看Host标头来判断客户端想要连接到哪个主机。
当 HTTPS MITM 透明代理收到请求时,它无法知道客户端首先请求的是哪个主机名。(我什至不确定它是否可以通过这些规则获取 IP 地址,这可能至少允许它使用反向 DNS 查找进行猜测,即使它在一般情况下不太可能起作用。)
HostHTTP 消息中的标头,这只能在成功握手后发生。因此,MITM 代理在握手之前无法知道要生成哪个证书。
这可以与非透明 MITM 代理一起使用,因为您至少可以通过 HTTPCONNECT方法获得预期的主机名。
| 归档时间: |
|
| 查看次数: |
23590 次 |
| 最近记录: |