假设我编写了一个程序来毒害两个设备(例如A和B)的ARP缓存,这两个设备都位于本地网络中,可以从设备M成功地运行MITM。当我允许使用设备M上的sysctl net.ipv4.ip_forward=1命令进行IP转发时,可以建立从设备A到设备B的HTTP连接,并且能够看到设备M上的通信量。
但是,在我禁用设备M上的sysctl net.ipv4.ip_forward=0命令IP转发后,ARP缓存被毒害的情况一样,无法从设备A到设备B建立HTTP连接,我可以在我的程序中看到来自设备M的设备A的TCP数据包,在我的程序中接收到设备M上的SYN数据包后,我用M的MAC地址(从A的MAC地址)和dst的MAC地址(从M的MAC地址)修改数据包中的src MAC地址,并将其注入网络。我不修改从网络层开始的任何东西。我可以用新的src和TCPdump命令看到B处的数据包,这意味着数据包到达B,但是B不响应那个包,这我不明白为什么。
那么,问题是,ip_forward=1有什么特殊之处使这种MITM的情况起作用呢?澄清一下,所有的机器都是linux。在设备M上启用转发,我不需要修改数据包中的MAC地址。我只是下了毒然后一切都好起来了。
发布于 2021-11-20 10:38:55
M的内核接收到一个数据包,其目标IP地址表明它不是为M准备的,它将做什么?
当ip_forward=0的时候,它想:“我不知道为什么这封信被寄给我,我也不在乎。它会被扔到垃圾桶里!”
对于ip_forward=1,“嗯,这不是给我的。但是我知道收件人在哪里,所以我会用正确的MAC地址重新发送它。”
换句话说,使用ip_forward=1,您不必修改MAC地址,因为内核为您做了它。
发布于 2021-11-17 14:52:52
当您毒害ARP缓存时,A和B开始向M发送数据报,该M具有M的MAC-入口,但分别具有B和A的IP地址。因此,这些数据报针对第2层(以太网)中的M,而指向第3层(IP)中的其他设备。为了将这些数据报发送到第3层,接收者(根据IP地址)M必须进行IP转发。
使用net.ipv4.ip_forward=0可以禁用IP转发,使用net.ipv4.ip_forward=1可以启用它。
看看OSI模型。在那里你能找到
你的ARP中毒会影响到第二层。
如果没有ARP中毒,则将从A到B的HTTP消息包装成TCP流(指向端口80),该流与IP一起发送到B的IP地址。B的IP地址与B的以太网地址相关联,数据报直接从A到B(通过集线器或交换机),反之亦然。没有必要转发IP。
当您毒化A和B的ARP缓存以指向M时,会发生以下情况。从A到B的HTTP消息被包装成TCP流(指向端口80),该流与IP一起发送到B的IP地址。B的IP地址与M的以太网地址相关联,而流向M的数据报不是这些数据报的预定接收方。
为了使HTTP连接工作,M必须将IP数据报从A转发到B,反之亦然。这可能是通过上面设置的内核发生的,也可能是通过一个特殊的程序来侦听这些数据报并重新发送它们。
https://unix.stackexchange.com/questions/673573
复制相似问题