我有一个问题要问底层网络/Linux 专家,
我必须为我大学的安全项目构建两个工具。第一个工具是 ARP 中毒攻击者,它会毒害远程主机的 ARP 缓存,以便检索他发送到另一台主机的数据。我使用原始套接字用 C 语言编写了这个工具,它工作得很好,我能够拦截从主机 A 传输到主机 B 以及从主机 B 传输回主机 A 的数据。
当编写第二个工具时出现问题,该工具是一个嗅探器,其目的是读取/编辑/丢弃来自主机 A 或主机 B 的数据包。我想象了一个系统,当我发现来自这些主机之一的数据包时,我的程序将询问我是否要让这个数据包通过、是否要修改它或者只是想丢弃它。我在linux中使用激活IP转发
sysctl -w net.ipv4.ip_forward=1
我能够读取两台主机之间传输的所有数据。但我不知道如何编辑/删除这些数据包,因为 Linux 网络堆栈的作用是管理来自我的网络接口的数据包的输入和输出。如果你愿意的话,我只是作为一个被动的攻击者。
我的第一个想法是禁用 ip 转发并自己管理数据包的路由。但是当我禁用IP转发时,我根本无法从A或B获取任何数据,这是因为Linux的网络堆栈在内核模式下自动丢弃IP地址不是发往我的计算机的数据包。
然后我尝试激活混杂模式,但这是不必要的,因为该模式仅在物理层上运行(查看以太网接收数据包中的目标 MAC 地址是否与本地接口上的 MAC 地址匹配)。所以基本上,混杂模式帮助我们避免物理过滤器linux 的堆栈,但不是logical一(我收到的数据包中的目标 IP 地址是 B 的 IP 地址,而不是我的 IP 地址,因此 Linux 的网络堆栈只是丢弃该数据包)。
所以我的问题是,如何编辑我收到的数据包并将其发回,或者如果我愿意的话干脆丢弃它们。我知道这是一个棘手的问题,我自己做了一些研究来寻找解决方案,但没有找到令人满意的答案。
我知道有一个解决方案iptables,我们可以要求他让来自某个IP地址的一些数据包通过,但我不想要涉及第三方工具的解决方案,我想将所有内容封装在我的程序中。
供参考,开发环境是Linux/Ubuntu Kernel 3.0.0-16,一切都是使用C语言制作的。
我明白了为什么当我禁用 ip_forwarding 时我没有收到任何数据包。我在这里发布我的问题后进行了许多测试,我意识到当 ip_forwarding 被禁用时,远程主机大约每 10 秒向我发送非常奇怪的 TCP 数据包。
事实上,这些 TCP 数据包被wireshark标记为“TCP重传”数据包,这是因为远程主机向我发送了一个初始 TCP 数据包,而我没有将其重新路由到正确的网关,因此他没有得到任何响应。
在这种情况下,远程主机的默认行为是在不同的时间间隔重新发送此数据包,这实际上是 TCP 堆栈应有的正常行为方式。但我不知道的是,在远程主机没有收到对其初始 TCP 数据包的响应之前,他不会发送任何其他数据包(仅适用于同一应用程序)。因此,当我在远程主机的浏览器中按“F5”时,我认为他会生成 TCP 流量,尽管他不会得到任何响应,而且我不知道 TCP 堆栈的这种特定行为,所以我只是认为我没有得到任何答案。另一台主机(网关)的行为方式完全相同,因此我可以看出,我错误地认为 Linux 堆栈阻止了远程主机数据包。
我现在要做的只是将我想要通过的数据正确地重新路由到网关并忽略其他数据。感谢您的帮助,希望有一天这可以帮助别人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)