TL;DR:我觉得通过使用 sslsplit 的接口镜像我已经非常接近做到这一点,但我遇到了一个问题,即内核没有回复 sslsplit 在镜像接口上发送的 ARP 请求。
我想拦截我在计算机中运行的程序的 SSL/TLS 连接,并在wireshark 中查看解密的内容。看来 sslsplit 的界面镜像正是我所需要的,所以我一直在尝试设置它。
此命令正确设置拦截,无需镜像,只需将一些信息输出到标准输出:
sudo sslsplit -D -l /dev/stdout -c ca.crt -k ca.key tcp 192.168.10.1 9090 ssl 192.168.10.1 9091
192.168.10.0/24
是 veth 链路上的子网。我将 veth 的一端放入新的网络命名空间中,并将另一端设置为该命名空间中的默认路由。编辑2:换句话说,我做了:
ip link add veth0a type veth peer veth0b
ip address add 192.168.10.1/24 dev veth0a
ip netns add sslsplitns
ip link set veth0b netns sslsplitns
ip netns exec sslsplitns ip address add 192.168.10.2/24 dev veth0b
ip link set veth0a up
ip netns exec sslsplitns ip link set veth0b up
ip netns exec sslsplitns ip route add default via 192.168.10.1
这个想法是运行我想要在该网络命名空间(即ip netns exec sslsplitns $cmd
)中拦截其连接的程序。我发现这个设置是必要的,因为 sslsplit 使用 NAT 引擎工作,并且似乎它无法接收数据包,除非它们通过 INPUT 链。
无论如何,要使用网络镜像,我显然选择了要镜像的接口-I
。然而,sslsplit 说这-I
取决于-T
:
-T 地址将连接内容作为模拟数据包镜像到 -I 指定的接口上的目标地址 addr。目前仅支持 IPv4 目标地址。如果 SSLsplit 是在没有镜像支持的情况下构建的,则此选项不可用。
编辑 4:我想这意味着如果我向 1.2.3.4 发出 HTTPS 请求,sslsplit 将对我为此选项提供的任何内容发出等效的 HTTP 请求。有人,如果我误解了这一点,请纠正我,因为我不完全确定这是如何工作的。 sslsplit 真的能够使用这个提供的地址作为源和目标 IP 吗?它能否确保没有其他程序在实际监听时接收这些镜像数据包?如果我向 sslsplit 提供实际的物理链路和另一台物理计算机的 IP,此镜像将如何工作?这些镜像数据包实际上是用来接收的,而不仅仅是由wireshark或tcpdump等工具来检查吗?
所以我制作了一个虚拟接口 ( ip link add dummy0 type dummy
),给它一个地址并将该地址提供给 sslplit 的-T
。
编辑:这是命令:
sudo sslsplit -D -l /dev/stdout -T 192.168.12.2 -I veth1a -c ca.crt -k ca.key tcp 192.168.10.1 9090 ssl 192.168.10.1 9091
通过wireshark,在准备查看解密的SSL数据包时,我看到sslsplit发送ARP请求来查询我给它的IP地址的硬件地址。经过各种尝试,sslsplit
最终还是带着这条消息而死failed to lookup target ether
。我想,也许内核不会回复,因为它与发送的地址相同,所以它太傻了,不能认真对待。因此,我创建了另一个 veth 链接,在同一 /24 子网中为两端提供了不同的地址,并将其中一个提供给 sslsplit 的-T
.它正确地使用另一个地址来 ARP 查询我给它的 IP 的硬件地址,但内核仍然不会回复 ARP 请求。
我已经尝试激活sysctl
与 ARP 相关的所有选项,并且rp_filter
基于这个答案。
顺便说一句,我知道各种程序都支持使用SSLKEYLOGFILE
环境变量在wireshark中查找解密的SSL,但我想要拦截其连接的程序不支持该环境变量。
这是带有 ARP 请求的wireshark 的图片。当这些失败时,我还会看到 SSDP 数据包,但我不知道它们是什么,而且它们似乎无关紧要:
编辑3:作为记录,以下是 的一些输出ip link
,其中显示了内核应回复的以太网地址:
46: veth1b@veth1a: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 4a:36:55:f8:e1:d2 brd ff:ff:ff:ff:ff:ff
答案1
我无法解决你的问题,但希望能为你提供一点帮助。
如您所知,镜像需要参数-I
和。-T
参数-I
指定用作分析器(捕获镜像数据包的某个节点)的接口,参数-T
指定镜像数据目标的 IPv4 地址。
SSLsplit 实际上确实从提供的接口和 IPv4 地址解析 MAC 地址(L2 标头)。 SSLsplit 从接口查找源 MAC 地址,下一步在接口上发送针对目标 IPv4 地址的 ARP 请求。 SSLsplit 等待包含目标 MAC 地址的 ARP 响应,以便让所有地址填充数据包。
如果您提供 SSLsplit 虚拟接口,它无法解析目标 MAC 地址。这就是你拥有 的原因failed to lookup target ether
。
-X
在这种情况下,使用参数将流量记录到.pcap
文件中并且您不必解决解决问题不是更好吗?