我希望通过拦截 HTTPS 流量来对各种设备上运行的产品进行漏洞研究,但我不想修改设备除了安装自定义证书。
它似乎SSLsplit做我想要的,因为它允许“通过网络地址转换引擎透明地拦截连接并重定向到 SSLsplit“据我了解,这些 NAT 规则不必在运行被 MITM 攻击的应用程序的设备上定义,我可以自定义iptables通过重定向路由器流量SSLsplit在运行的设备上果味 Wifi或者OpenWRT。
是SSLsplit修改 iptables 规则是否足够并且是解决这个问题的合理方法,或者我是否还必须修改 Linux 网络系统的其他部分?
笔记 :我试图构建的系统要求设备在受信任的根存储中安装证书,以“选择加入”此拦截。我并不是想构建一个系统来拦截来自不情愿设备的任意流量。
答案1
这里有两个部分:充当客户端连接的 Web 服务器的 SSLsplit,以及交换数据包中目标地址以将其重定向到 SSLsplit 服务器的 NAT。
需要在客户端设备使用的路由器上设置 NAT,将数据包的目标地址从实际目标服务器更改为 SSLsplit 服务器。
然后 SSLsplit 可以接通连接并执行其操作:连接到外部主机(在 TLS 握手中可用)并转发响应。
因此,从网络角度来看,唯一需要做的就是确保客户端获得这样的网络选项,即其默认网关指向执行 NAT 的路由器。
答案2
简而言之,是的,它可以是正确的工具,但事实上,如果你使用SSL条,SSL拆分,mitmproxy或任何其他可以完成您工作的工具,您只需要注意它的工作方式。
正如 @Quantim 提到的,如果不在路由器后面的设备中安装/拥有自定义证书/CA,这是不可能的,因为它需要自定义 CA 作为 SSL 连接的中间人,并且它需要能够生成和签署受害者可以信任的证书信托。因此,受害者必须在其信任库中拥有攻击者的根 CA 证书。解释 CA 的工作原理以及如何使用上述工具实现理想的结果超出了本答案的范围,但根据客户端的类型(桌面浏览器或移动电话),您应该注意到安装根证书略有不同。
SSLsplit 的工作原理与其他透明 SSL 代理工具(如 mitmproxy)非常相似,mitmproxy 具有更多功能,也更复杂。它充当客户端和实际服务器之间的中间人。前提是流量被重定向到 SSLsplit 正在运行并监听的服务器更改默认网关,ARP欺骗,伪造 DNS 条目或任何其他方式。换句话说,正如您可能已经猜到的那样,SSLsplit 以一种假装是客户端正在连接并愿意与之通信的实际服务器的方式获取 SSL 连接。实际上,它会动态生成证书并使用客户端必须(将要)信任的 CA 证书的私钥对其进行签名。
因此要回答你的问题“SSLsplit 是否是拦截和重新加密 wifi 路由器上的 HTTPS 流量的正确工具?“是的,这是可以的,但是你知道得足够多吗?如果是的话,那就去进行你的研究,去赢得大奖吧。
并回答“修改 iptables 规则的 SSLsplit 是否足够并且是解决此问题的合理方法,或者我是否还必须修改 Linux 网络系统的其他部分?“,我应该说,如果您已经正确配置了 IPTables 规则集和 NAT/DNAT 规则,并且您的客户端可以将 CA 证书视为可信证书,那么这就足够了 - 修改 iptables 规则集并将客户端的流量重定向到您将拦截客户端流量的服务器,如前所述。顺便说一句,您需要注意“透明的“在计算装置(过程或接口)中,用户无需意识到其存在即可运行。
原始文档摘录:
SSLsplit 支持通过 IPv4 和 IPv6 进行纯 TCP、纯 SSL、HTTP 和 HTTPS 连接。对于 SSL 和 HTTPS 连接,SSLsplit 即时生成并签署伪造的 X509v3 证书,根据原始服务器证书主体 DN 和 subjectAltName 扩展。SSLsplit 完全支持服务器名称指示 (SNI),并且能够使用 RSA、DSA 和 ECDSA 密钥以及 DHE 和 ECDHE 密码套件。根据 OpenSSL 的版本,SSLsplit 支持 SSL 3.0、TLS 1.0、TLS 1.1 和 TLS 1.2,以及可选的 SSL 2.0。 SSLsplit 还可以使用私钥可用的现有证书,而不是生成伪造的证书。SSLsplit 支持 NULL 前缀 CN 证书,可以以通用方式拒绝 OCSP 请求。对于 HTTP 和 HTTPS 连接,SSLsplit 删除了 HPKP 的响应标头,以防止公钥固定, 让 HSTS 允许用户接受不受信任的证书以及替代协议以防止切换到 QUIC/SPDY。作为一项实验性功能,SSLsplit 以通用方式支持 STARTTLS 机制。
重定向
由于 OP 需要知道如何将请求重定向到 SSLsplit,但又不想设置代理(如评论中所述),我将快速介绍如何执行此操作,希望这会有所帮助:
Scenario 1 : If SSLsplit is on the OpenWRT which you are using - i.e. if SSLsplit is set on the GateWay which victims (clients) are connecting to :
|
VICTIMS | ATTACKER
|
+-------~+ | (GATEWAY) If SSLsplit is set on the Gateway users are gonna connect to, you only need to redirect some ports to those SSLsplit is listening on
| | | SSLsplit will be running on two ports: 8080 for non-SSL TCP connections and 8443 for SSL connections.
| | ---> |
| | | sysctl -w net.ipv4.ip_forward=1
+~~~~~~~~+ | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
| \ iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443 (HTTPS)
+-------~+ | \ +~~~~~~~~+ iptables -t nat -A PREROUTING -p tcp --dport 636 -j REDIRECT --to-ports 8443 (LDAPS)
| | | \ | | iptables -t nat -A PREROUTING -p tcp --dport 587 -j REDIRECT --to-ports 8443 (MSA) Encryption = StartTLS
| | ---> | ===➤ | | iptables -t nat -A PREROUTING -p tcp --dport 465 -j REDIRECT --to-ports 8443 (SMTPS) Encryption = SSL
| | | / | | iptables -t nat -A PREROUTING -p tcp --dport 993 -j REDIRECT --to-ports 8443 (IMAPS) Encryption = StartTLS
+~~~~~~~~+ | / +~~~~~~~~+ iptables -t nat -A PREROUTING -p tcp --dport 5222 -j REDIRECT --to-ports 8080 (XMPP)
| / ...
+-------~+ |
| | |
| | ---> |
| | |
+~~~~~~~~+ |
|
|
Scenario 2 : AND IF SSLsplit is not set on the GateWay whic clients are connecting to - You will be in need of setting DNAT as the following :
VICTIMS | GATEWAY
|
+-------~+ |
| | |
| | ---> | IPTables will be like this :
| | |
+~~~~~~~~+ | SSLsplit iptables -t nat -A PREROUTING -d x.x.x.x/CIDR -p tcp -m tcp --dport 443 -j DNAT --to-destination z.z.z.z:8443
| \ iptables -t nat -A PREROUTING -d x.x.x.x/CIDR -p tcp -m tcp --dport 465 -j DNAT --to-destination z.z.z.z:8443
+-------~+ | \ +~~~~~~~~+ +~~~~~~~~+ ...
| | | \ | | | |
| | ---> | ===➤ | | ---------> | | In this scenario, all packets arriving on the router with a destination of x.x.x.x/CIDR will
| | | / | | | | depart from the router with a destination of z.z.z.z
+~~~~~~~~+ | / +~~~~~~~~+ +~~~~~~~~+
| /
+-------~+ | Redirects desired connection from somewhere
| | | to somewhere else to desired ports.
| | ---> |
| | |
+~~~~~~~~+ |
|
|
注意将 的值设置net.ipv4.ip_forward
为 1。我上面使用的命令sysctl -w
不是永久的。如果你想永久设置它,你应该编辑文件,/etc/sysctl.conf
在其中添加一行包含net.ipv4.ip_forward = 1
。
默认情况下,大多数 Linux 发行版都会禁用 IP 转发。在我看来,这是一个好主意,因为大多数人都不需要使用它,但由于您正在设置 Linux 路由器/网关 - 也可用于 VPN 服务器(pptp 或 ipsec)- 您需要启用转发。这可以通过多种方式完成,我已经向您展示了一些。
答案3
如果没有在路由器后面的设备上安装自定义证书/CA,则无法实现这一点。在其他情况下,您将能够充当任何网络服务。SSLsplit 仅生成自己的证书或使用您提供私钥的证书
SSLsplit 还可以使用私钥可用的现有证书,而不是生成伪造证书。SSLsplit 支持 NULL 前缀 CN 证书,并且可以以通用方式拒绝 OCSP 请求
在这两种情况下,没有自定义证书/CA 的客户端都会收到无效证书颁发者错误
透明拦截意味着你不需要指定要拦截的每个主机,并且可以拦截所有流量,但这仍然是对 SSL 的中间人攻击