出于测试和教育目的,我想设置一个中间人场景,如下所示:
- 主机T是要“克隆”的目标主机
- 主机 M 是中间人,具有接口
eth0
和eth1
; M 通过 与网络相连,eth0
并通过 与 T相连eth1
。
设置的要点是 T 必须能够应答某些请求(特别是通过 EAPoL 的 802.1X 身份验证,因此 M 使用 T 作为身份验证预言机)。具体来说,默认情况下,T 将连接到网络并通过 802.1X 验证自身身份,而 M 将被拒绝访问。相反,用户具有对 M 的管理访问权限,但对 T 没有管理访问权限。目的是在执行网络诊断时让 M 看起来像是 T,而 T 由于缺乏权限而无法进行网络诊断。
有两种可能的方法:
编写一个程序(例如带有 scapy 的 python 或带有 libpcap 的 C)来来回复制相关帧。
使用
ebtables
和iptables
.
这里的问题集中在 2 上,简单来说:如何实现预期的结果?
到目前为止我尝试过的
第一步是桥接eth0
和eth1
(例如将它们附加到br0
)。如果没有任何ebtables
/iptables
规则,T 对网络是可见的,就好像直接连接到它一样。然后,由于重点主要是在 IPv4 上模拟 T,因此我建立了以下规则:
ebtables -A FORWARD -p IPv4 -j DROP
此规则阻止 IPv4 流量穿过网桥。现在,要模拟 T,M 必须在第 2 层和第 3 层执行一些 NAT:
# interception of incoming packets for T:
ebtables -t nat -A PREROUTING -i eth0 -p IPv4 -d $TARGET_MAC_ADDR -j dnat --to-destination $MY_ETH0_MAC_ADDR
iptables -t nat -A PREROUTING -i eth0 -d $TARGET_IP4_ADDR -j DNAT --to-destination $MY_ETH0_IP4_ADDR
# spoofing of outgoing packets as coming from T:
ebtables -t nat -A POSTROUTING -o eth0 -p IPv4 -s $MY_ETH0_MAC_ADDR -j snat --to-source $TARGET_MAC_ADDR
iptables -t nat -A POSTROUTING -o eth0 -s $MY_ETH0_IP4_ADDR -j SNAT --to-source $TARGET_IP4_ADDR
我天真的想法是应该这样做。但事实并非如此。除了“断开”T 之外,M 的行为完全不像 T。特别是,iptables -t nat -L -v -n
表明 SNAT 规则按预期触发,但 DNAT 规则是惰性的(即 0 数据包,无论发生什么)。我在这里缺少什么?
笔记
问题类似于这个但设置不一样。
Rui 在评论中指出,某些协议在 NAT 时很容易出现问题。如果路由器伪装上游网络中的主机(也称为锥网络地址转换)。然而,这不是重点。在这种情况下,NAT 用于将 M 伪装成 T,同时对 T 进行遮蔽。M 只是丢弃 T 的数据包(请参阅第一个 ebtables 规则)
背景
802.1X(更准确地说是802.1X-2010)仅提供身份验证,但不提供后续的“通道”安全性。这就好像 TLS 握手导致 NULL 加密和身份验证 - “请求者”证明认证时它的真实性,但身份验证后的“会话”可以被劫持。
有线连接的补救措施是 MACsec(又名 802.1ae,它是 802.1X-2014 的一部分)。 MACsec 的无线吊坠是 WPA/WPA2。令人惊讶的是,即使是最便宜的硬件也可以支持 WPA2,而支持 MACsec 的高端交换机比不支持 MACsec 的高端交换机要贵得多。
除其他事项外,所描述的场景表明,没有 MACsec 的 802.1X 毫无价值。
答案1
如果您同意尝试方法 1),我刚刚写完一个 EAPOL 代理(https://github.com/kangtastic/peapod)。如果您愿意,它甚至会自动更改 eth0 的 MAC 地址以匹配您的目标,尽管我会手动执行此操作。看来您可以在 eth0 上配置静态 IPv4 地址并获得连接,这很好,因为我的代理不处理任何第 3 层内容。无论如何,根据您的描述,我确信它适合您的情况。还有一些其他 EAPOL 代理,大部分是用 Python 编写的,如果你看看的话,它们可能也能正常工作。
如果您的 EAPOL 请求者还需要在会话通过 DHCP 启动后向上游网络“注册”以获得 IPv4 连接,则事情会变得稍微复杂一些,具体取决于上游网络是否需要特定的主机名、客户端标识符等来进行连接。在 DHCP 请求中发送。最坏的情况是,您必须在 M 上配置 dhclient,以发送与 T 上的 DHCP 客户端完全相同的选项。这很烦人,但如果您足够坚持,就可以使两者相同。将请求者的 MAC 克隆到 eth0 也有帮助。
如果您选择使用 eb/iptables 的方法 2) - 抱歉,我无法提供太多帮助。我只想说默认情况下 EAPOL 不会跨越 Linux 软件网桥,因为 EAPOL 多播组地址 01-80-C2-00-00-03 不会由符合 802.1D 的网桥转发。解决这个问题的方法是:
echo 8 > /sys/class/net/brX/bridge/group_fwd_mask
(为什么是 8 而不是其他值?因为https://interestingtraffic.nl/2017/11/21/an-oddly-specific-post-about-group_fwd_mask/)
你让 T 通过你的网桥进行身份验证,所以你已经知道了,但其他人可能不知道:)
答案2
你看过中间人代理吗?https://github.com/mitmproxy/mitmproxy?它会做你所要求的一切。
wget https://github.com/mitmproxy/mitmproxy/releases/download/v2.0.2/mitmproxy-2.0.2-linux.tar.gz
或者使用画中画
pip3 install mitmproxy
然后运行它:
./mitmproxy --host
在您的浏览器中配置代理,它将中间人所有您想要的流量。