c - 在 Linux 上嗅探数据包时过滤网络堆栈中的数据包?

标签 c linux arp raw-sockets

我有一个问题要问低级网络/Linux 专家,

我必须为我大学的一个安全项目构建两个工具。第一个工具是 ARP Poisonning 攻击者,它会从远程主机中毒化 ARP 缓存,以便检索他发送到另一台主机的数据。我使用 RAW 套接字用 C 语言编写了这个工具,它工作得很好,我能够拦截从主机 A 传输到主机 B 以及从主机 B 传输回主机 A 的数据。

当编写第二个工具时出现了问题,它是一个嗅探器,其目的是读取/编辑/丢弃来自主机 A 或主机 B 的数据包。我想象一个系统,当我发现来自其中一台主机的数据包时,我的程序会询问我是否要让这个数据包通过,是否要修改它或只是想丢弃它。我使用

在 linux 中激活了 IP 转发
sysctl -w net.ipv4.ip_forward=1

而且我能够读取两台主机之间传输的所有数据。但是我不知道如何编辑/丢弃这些数据包,因为 linux 网络堆栈的作用是管理来 self 的网络接口(interface)的数据包的输入和输出。如果您愿意,我只是充当被动攻击者。

我的第一个想法是禁用 ip 转发并自己管理数据包的路由。但是当我禁用 ip 转发时,我根本无法从 A 或 B 获取任何数据,这是因为 linux 的网络堆栈在内核模式下自动丢弃 IP 地址不是我的计算机的数据包。

然后我尝试激活混杂模式,但这是不必要的,因为该模式仅在物理层上运行(查看以太网接收数据包中的目标 MAC 地址是否与本地接口(interface)上的 MAC 地址匹配)。所以基本上,混杂模式帮助我们避免了 linux 堆栈的物理过滤器,但不是逻辑过滤器(数据包中的目标 IP 地址我收到的是 B 的 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 的堆栈阻止了远程主机数据包是错误的。

我现在要做的只是将我要让其通过的数据正确地重新路由到网关,而忽略其他数据。感谢您的帮助,希望有一天这会对某人有所帮助。

关于c - 在 Linux 上嗅探数据包时过滤网络堆栈中的数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9752583/

相关文章:

command-line - 从 Windows 手动发送 ARP 请求

c - 这个算法不行

c++ - 如何在 ubuntu 12.04 中的 C/c++ 项目中链接库

r - 更快的替代 file.exists()

c - 为什么是 SIGSEGV?

linux - gdb是否临时给页面写权限?

linux - 使用 GETREGS 时,ptrace 是只获取用户空间堆栈 RSP,还是内核和用户空间 RSP 都可以?

linux - Linux 中的 ARP 创建失败条目

ubuntu - ettercap 不扫描所有主机

linux - Linux下自动调整进程优先级