7

我有一个低级网络/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语言制作的。

4

3 回答 3

1

当我禁用 ip_forwarding 时,我弄清楚了为什么我没有收到任何数据包。在这里发布我的问题后,我进行了许多测试,我意识到当 ip_forwarding 被禁用时,远程主机大约每 10 秒向我发送一次非常奇怪的 TCP 数据包。

事实上,那些 TCP 数据包被wireshark 标记为“TCP 重传”数据包,这是因为远程主机向我发送了一个初始 TCP 数据包,而我没有将它重新路由到正确的网关,所以他没有得到任何回复。

在这种情况下,远程主机的默认行为是在不同的时间间隔重新发送这个数据包,这实际上是 TCP 堆栈应该表现的正常方式。但我不知道的是,在远程主机没有收到他的初始 TCP 数据包的响应之前,他不会发送任何其他数据包(仅适用于同一个应用程序)。因此,当我在远程主机的浏览器中点击“F5”时,我认为他会产生 TCP 流量,尽管他不会得到任何响应,而且我不知道 TCP 堆栈的这种特殊行为,所以我只是认为我没有得到任何答案。另一台主机(网关)的行为方式完全相同,所以我可以说我错误地认为 Linux 的堆栈阻止了远程主机数据包。

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

于 2012-03-17T21:25:22.910 回答
1

听起来您需要编写自己的 Netfilter 模块,该模块将在内核中处理您想要的行为或将其传递给用户空间进行处理。

有关此主题的更多信息,请参阅以下资源:

于 2012-03-17T21:34:48.763 回答
0

你在使用 libpcap 吗?从您的问题来看,这听起来不像您,这很有趣,因为它是与您正在做的事情相关的最知名和最常用的库?你不使用它是因为它的部分赋值条件不使用它吗?

如果您可以使用它,我会使用它并检查项目 ettercap,它支持重写实时数据包。

http://ettercap.sourceforge.net/

编辑:检查 ettercap 的过滤器模块

https://github.com/drizztbsd/ettercap/blob/master/src/ec_filter.c

特别看func_inject

于 2012-03-17T18:41:09.933 回答