我有一个低级网络/Linux 大师的问题,
我必须为我大学的一个安全项目构建两个工具。第一个工具是 ARP 中毒攻击者,它会从远程主机毒化 ARP 缓存,以检索他发送到另一台主机的数据。我使用 RAW 套接字在 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 堆栈的物理过滤器,而不是逻辑过滤器(我收到的数据包中的目标 IP 地址是 B 的 IP 地址而不是我的,所以 linux 的网络堆栈只是丢弃数据包)。
所以我的问题是,我怎样才能设法编辑我收到的数据包并将它们发回,或者如果我愿意的话就简单地丢弃它们。我知道这是一个棘手的问题,我已经进行了一些研究以自己找到解决方案,但我没有找到令人满意的答案。
我知道iptables有一个解决方案,我们可以要求他让来自某个 IP 地址的一些数据包通过,但我不想要涉及第三方工具的解决方案,我想将所有内容封装在我的程序中。
供参考,开发环境是Linux/Ubuntu Kernel 3.0.0-16,一切都是用C语言制作的。