我对低级网络/ 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语言编写的。
答案 0 :(得分:1)
我弄明白为什么在禁用ip_forwarding时我没有收到任何数据包。我在这里发布问题之后运行了很多测试,并且我意识到当禁用ip_forwarding时,远程主机每隔约10秒发送一个非常奇怪的TCP数据包。
事实上,那些TCP数据包被wireshark标记为“TCP重传”数据包,这是因为远程主机向我发送了一个初始TCP数据包而我没有将其重新路由到正确的网关,所以他没有得到任何回应。
在这种情况下,远程主机的默认行为是以不同的时间间隔重新发送此数据包,这实际上是TCP堆栈的正常行为方式。但我不知道的是,在远程主机没有得到对他的初始TCP数据包的响应之前,他不会发送任何其他数据(仅针对同一个应用程序)。因此,当我在远程主机的浏览器中点击“F5”时,我认为他会生成TCP流量,虽然他不会得到任何响应,我不知道TCP堆栈的这种特殊行为所以我只是觉得我没有得到任何答案。另一个主机(网关)的行为方式完全相同,所以我可以说我错误认为Linux的堆栈阻塞了远程主机数据包。
我现在要做的只是将我想要通过的数据正确地重新路由到网关,而忽略其他数据。谢谢你的帮助,希望有一天这可能对某人有所帮助。
答案 1 :(得分:1)
听起来您需要编写自己的Netfilter模块,该模块将在内核中处理您想要的行为或将其传递给用户空间进行处理。
有关此主题的更多信息,请参阅以下资源:
答案 2 :(得分:0)
你在使用libpcap吗?从你的问题来看,它听起来并不像你,这很有趣,因为它是最知名的和使用过的图书馆,用于与你正在做的事情相关的任何事情?你没有使用它,因为它的部分条件是不使用它吗?
如果你可以使用它,我会使用它并检查项目ettercap,它支持重写实时数据包。
http://ettercap.sourceforge.net/
编辑:在
中查看ettercap的过滤器模块https://github.com/drizztbsd/ettercap/blob/master/src/ec_filter.c
特别关注func_inject