在 MacOS 上使用 PF 将流量重定向到特定地址和端口

在 MacOS 上使用 PF 将流量重定向到特定地址和端口

我想要对移动应用程序进行渗透测试。为此,我想要拦截所有 WiFi 流量并将其转发到在虚拟机中运行的 Burp。

我在 Macbook 上启用了“Internet 共享”,这样我的手机现在就可以使用 WiFi 连接到笔记本电脑了。然后我想将所有流量转发到 Burp 代理,即 172.16.122.128:8080。

重定向到本地主机有效:

rdr pass on bridge100 inet proto tcp from any to any port {80,443} -> 127.0.0.1 port 8080

我把这条规则放在一个文件中,并用 加载它pfctl -f pf.rules。之后,我使用 列出端口 8080 nc -l -p 8080,当我在手机上浏览某个地方时,它确实连接到了 localhost。

但是,当我尝试转发到 172.16.122.128 时,它不起作用:

rdr pass on bridge100 inet proto tcp from any to any port {80,443} -> 172.16.122.128 port 8080

数据包确实进入了虚拟机(使用 Wireshark 测试),但没有建立连接。这可能是因为它们来自 192.168.2.3。我需要在某处使用 NAT 吗?如何正确配置它?

我画了一张我的网络布局图。(虚拟机实际上在我的笔记本电脑上运行,但我在这里单独画了它。) 我的网络布局

答案1

我猜,问题在于您尚未配置 2 个网络之间的转发,(1) VM 网络 (172.16.122.0/24) 和 (2) 您的 LAN (192.168.2.0/24)。要在 Mac 上配置转发,您可能需要执行以下操作(抱歉,我没有 Mac,因此无法尝试):

1) 详见https://apple.stackexchange.com/a/192183

sudo sysctl -w net.inet.ip.forwarding=1
sudo sysctl -w net.inet.ip.fw.enable=1

2)如果需要,向两个网络添加静态路由(我想你已经有了,因为你可以通过 nc 从你的 Mac 连接到 VM)

最后,另一个选项(无需将 Mac 配置为路由器)是使用虚拟化软件设置 NAT 并将端口转发到 VM。如果您使用 VMware Fusion,请查看这里或者这里

然后,不要将流量转发到虚拟机上的端口,而是将其转发到 vmnet8 接口上的转发端口:

rdr pass on bridge100 inet proto tcp from any to any port {80,443} -> 172.16.122.1 port 8080

(VMware Fusion 应将 vmnet8 上的端口 8080 转发到虚拟机上的端口 8080)

答案2

以下 PF 规则有效:

nat on vmnet8 from bridge100:network to any -> (vmnet8)
rdr pass on bridge100 inet proto tcp from any to any -> 172.16.122.128 port 8080 

这会将所有请求转发到 172.16.122.128,同时在其间进行 NAT。

需要 NAT 来转换两个网络的地址,即 192.168.2.0/24 和 172.16.122.0/24。转发部分已经工作(如我的问题所述),但数据包被转发时使用了错误的源地址。NAT 将该源地址更改为 172.16.122.1,这样 VM 就知道将数据包发送回我的 MacBook,然后 MacBook 再次将它们转发到手机。

答案3

如果虚拟机是 Linux 虚拟机,则需要对传入流量进行 Nat 和处理。即:

  1. 来自 192.168.2.3 的传入数据包被接受
  2. 将数据包的目标地址更改为172.16.122.128(mangle)
  3. 将数据包提交给linux路由层

防火墙命令

# Enable forward
sudo sysctl -w net.ipv4.ip_forward=1

# FLUSH ALL RULES
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Forward
sudo iptables -A FORWARD -i eth0 -j ACCEPT


# Mangling rule. I think you can add the port right after the dest ip
sudo iptables -t nat -A POSTROUTING -s 192.168.2.3/32  -j SNAT --to  172.16.122.128

相关内容