【发布时间】:2019-11-29 13:33:36
【问题描述】:
我有一个低级网络/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语言制作的。
【问题讨论】:
-
如果你想“封装你程序中的所有东西”,你将不得不做
iptables所做的事情——告诉内核你希望接收目标IP地址的数据包。 -
好吧,我仍然不知道这是否会是更安全/更清洁的解决方案,最终这是一个选择。我还在等待其他 cmets,必须有其他选择。 iptables 这样做是因为他的目的是路由数据包,我不知道他是在内核领域还是用户领域。
-
iptables是一个与内核通信的用户态工具。实际的数据包路由决策完全在内核空间内做出。
标签: c linux arp raw-sockets