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

问题描述 投票:7回答:3

我对低级网络/ Linux专家有疑问,

我必须在我的大学中为安全项目构建两个工具。第一个工具是ARP Poisonning攻击者,它将攻击远程主机的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堆栈的physical filter,而不是logic堆栈(我正在接收的数据包中的目标IP地址是B的IP地址,而不是我的,所以linux的网络堆栈只是丢弃数据包)。

所以,我的问题是,如果我愿意,我该如何设法编辑接收到的数据包并将其发送回去,或者直接丢弃它们。我知道这是一个棘手的问题,我进行了一些研究以自行找到解决方案,但没有找到满意的答案。

我知道有一个使用[[iptables的解决方案,我们可以要求他让来自某个IP地址的某些数据包通过,但是我不希望涉及第三方工具的解决方案,我想封装所有内容在我的程序中。

有关信息,开发环境为Linux / Ubuntu Kernel 3.0.0-16,所有内容均使用C语言编写。
c linux arp raw-sockets
3个回答
1
投票
我弄清楚了为什么禁用ip_forwarding时没有收到任何数据包。我在此处发布问题后进行了许多测试,并且我意识到,禁用ip_forwarding时,远程主机每隔约10秒就会向我发送一次非常奇怪的TCP数据包。

实际上,这些TCP数据包被Wireshark标记为

“ TCP重传”]]数据包,这是因为远程主机向我发送了一个初始TCP数据包,而我没有将其重新路由到正确的网关,所以他没有任何回应。在这种情况下,远程主机的默认行为是在不同的时间间隔重新发送此数据包,这实际上是TCP堆栈应正常运行的方式。但是我不知道的是,直到远程主机没有收到对其初始TCP数据包的响应,他才不会发送其他任何消息(仅适用于同一应用程序)。因此,当我在远程主机的浏览器中点击“ F5”时,我以为他会生成TCP流量,尽管他不会得到任何响应,而且我也不知道TCP堆栈的这种特殊行为,所以我只是以为自己没有得到任何答案。另一个主机(网关)的行为完全相同,因此我可以认为Linux的堆栈阻止了远程主机数据包是错误的。

我现在要做的只是将要传递的数据正确地重新路由到网关,而忽略其他数据。谢谢您的帮助,希望有一天能对您有所帮助。


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

0
投票
您是否完全使用libpcap?从您的问题来看,听起来不像是您,这很有趣,因为它是与您正在做的事情有关的最著名和最常用的库?您不使用它是因为其部分分配条件不使用它?
© www.soinside.com 2019 - 2024. All rights reserved.