在scapy中发送ICMP数据包并选择正确的接口

2024-01-10

我们可以对第 3 层 ICMP 数据包使用 srp() 函数吗?我发现当我们制作 ICMP 回显请求数据包并使用 sr() 发送/接收时,我们没有看到它从接口发送出去,因此目的地没有响应。但是,如果我们使用 srp() 函数,我们会看到相同的数据包响应。我们什么时候应该使用 sr() 以及什么时候使用 srp()?在文档中它指出 sr() 用于 L3 数据包,而 srp() 用于 L2?但就我而言,我不确定为什么 sr() 不适用于 ICMP 数据包?有专家可以帮我理解一下吗?

有人可以让我知道是否总是需要“iface”参数。如果没有这个,scapy 如何知道应该通过哪个接口发送数据包?

情况 1:以 iface 作为参数的 sr() 函数:

sr(icmp,iface="eth0")

开始发射:

WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
^C
Received 0 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

上面我没有看到来自 IP 192.168.25.1 的任何 ICMP 响应

情况 2:不使用 iface 的 sr() 函数:

sr(icmp)   
.Begin emission:
......WARNING: Mac address to reach destination not found. Using broadcast.
.Finished to send 1 packets.
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C
Received 887 packets, got 0 answers, remaining 1 packets
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>)

如果您看到上面收到的数据包更多,但我没有看到任何 ICMP 响应。

情况 3:使用 srp() 而不是 sr() 发送 ICMP 数据包:

srp(icmp,iface="eth0")
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)

这里我使用 srp() 函数而不是 sr() 函数,现在我看到 ICMP 回显请求已正确发送,并且我也收到了响应。

>>> icmp.show2()
###[ Ethernet ]###
  dst: 02:00:00:11:01:03
  src: 02:00:20:ee:64:01
  type: 0x800
###[ IP ]###
     version: 4L
     ihl: 5L
     tos: 0x0
     len: 28
     id: 1
     flags:
     frag: 0L
     ttl: 64
     proto: icmp
     chksum: 0xc78c
     src: 192.168.25.2
     dst: 192.168.25.1
     \options\
###[ ICMP ]###
        type: echo-request
        code: 0
        chksum: 0xf7ff
        id: 0x0
        seq: 0x0
>>>                  

The sr功能每官方API文档 http://www.secdev.org/projects/scapy/files/scapydoc.pdf:

sr(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0)

使用第 3 层发送和接收数据包conf.L3socket超级插座。

The srp功能:

srp(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0, iface hint=None)

Same as srp但对于在第 2 层工作conf.L2socket超级插座。

自从你的ICMP数据包也填充了第 2 层字段,如输出所示ICMP.show2(),你应该使用srp功能。如果你让它们保持原样,就像在本教程 http://thepacketgeek.com/scapy-p-06-sending-and-receiving-with-scapy/,你可以使用sr功能。


现在,关于你的问题ICMP的分类为第 2 层协议或第 3 层协议。许多人认为这是第 3 层协议,例如here http://smallbiztrends.com/2013/09/osi-model-layer-networking.html,因为它使用IP标题并“位于”其顶部。然而,其他人认为它是第 2 层协议,例如here https://stackoverflow.com/a/19218648/3903832. 这是一个问题 https://serverfault.com/q/511965关于这个问题有一些很好的答案,但请注意,它们指的是OSI模型,因此分层方案编号有点不同。这是我设法找到的最好的,来自here http://www.tenouk.com/Module43.html:

IP 本身没有建立和维护连接的机制,甚至没有包含数据作为直接有效负载的机制。互联网控制消息传递协议仅仅是IP的补充,用于承载错误、路由和控制消息和数据,并且通常被认为是网络层的协议。

编辑-我刚刚遇到这个链接 http://www.linuxchix.org/content/courses/security/icmp,并认为值得一提:

ICMP 是 TCP/IP 堆栈中的一个协议,主要用于提供控制、故障排除和错误消息。它像 TCP 和 UDP 一样在 IP 上运行,但它是像 IP 一样的网络层协议,而不是像 TCP 和 UDP 那样的传输层协议。 (是的,这有点奇怪,ICMP 被封装在 IP 中,并且与 IP 处于同一层。但是话又说回来,您也可以将 IP 封装在 IP 中。)

RFC 792 http://www.ietf.org/rfc/rfc0792.txt也非常明确:

ICMP使用IP的基本支持,就好像它是一个更高层的协议一样,然而,ICMP实际上是IP的一个组成部分。

也是如此RFC 1122 https://www.rfc-editor.org/rfc/rfc1122:

ICMP 是一种控制协议,被认为是 IP 的组成部分,尽管它在架构上分层于 IP 之上,即,它使用 IP 端到端地传送其数据,就像 TCP 或 UDP 等传输协议一样。
...
尽管 ICMP 消息封装在 IP 数据报中,但 ICMP 处理被认为是(并且通常实现为)IP 层的一部分。


关于您关于显式指定接口的最后一个问题,请参阅scapy的教程 http://www.secdev.org/projects/scapy/doc/usage.html#sending-packets:

The send()函数将在第 3 层发送数据包。也就是说,它将为您处理路由和第 2 层。这sendp()功能将在第 2 层工作。您可以选择正确的接口和正确的链路层协议。

官方API文档比较详细:

当Scapy启动时,它的路由表与主机的路由表同步。对于三层发送的报文,目的IP决定了所使用的输出接口、源地址和网关。对于二层报文,可以精确的输出接口,也可以以IP的形式给出提示来确定输出接口。如果没有给出输出接口和提示,conf.iface用来。

具体来说,iface参数用于设置输入接口(但也设置输出接口,如果iface_hint未使用):

iface:仅在提供的界面上收听答案

用于暗示output接口、使用iface_hint对于第 2 层功能:

还有一个附加参数,iface_hint,这给出了可以帮助选择正确的输出接口的提示。默认情况下,如果没有指定iface, conf.iface被选中。该提示采用第 2 层数据包可能的目的地 IP 的形式。 Scapy 路由表 (conf.route) 用于确定使用哪个接口来访问此 IP。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在scapy中发送ICMP数据包并选择正确的接口 的相关文章

随机推荐

  • hasNext 不适用于 javascript 中的集合

    我在 javascript 中有以下代码 它检索两行 var raceCursor RacesCollection find eventId e1 var race while raceCursor hasNext race raceCur
  • LibXtract 的 Android.mk

    有人可以帮我为 LibXtract 编写 Android mk 或为我指出正确的方向吗 这是 lib 的来源 https github com jamiebullock LibXtract git https github com jami
  • 在 Google App Engine Python 中存储值的最简单方法?

    我很懒 我只想存储一个字符串值 就这样 我可以跳过任何类型的建模并只存储一个值吗 据我所知 DataStore 是 App Engine 上唯一可用的存储 然而 即使你很懒 代码也不是很多 确保导入db module from google
  • jupyter 笔记本中的 PYSPARK_PYTHON 设置被忽略

    我一直在尝试从 jupyter 笔记本 使用 jupyter 实验室 设置 PYSPARK PYTHON 以使用特定的 conda env 但我找不到使其工作的方法 我找到了一些使用的示例 import os os environ PYSP
  • 如何在 cookie 中存储字符串并检索它

    我想将用户名存储在 cookie 中 并在用户下次打开网站时检索它 是否可以创建一个在浏览器关闭时不会过期的 cookie 我正在使用 asp net c 创建网站 我怎样才能阻止浏览器提供保存用户名和密码 写一个cookie HttpCo
  • GDB 7.6 STL 漂亮的打印与 gcc-4.8 和 mac os 10.9

    我正在努力获得所描述的漂亮印刷品here https sourceware org gdb wiki STLSupport在我的 Mac 上运行 gdb 我通过 macports 下载了最新的 gdb 并使用gcc 4 8 我加载了 gdb
  • 在 TypeScript 中设置所需的函数参数

    在下面的代码中 type NoArg void type OneArg x number void let noArg NoArg x number gt let oneArg OneArg gt 只有第一个赋值才会产生编译器错误 我理解为
  • 在 React.js 中的 render return() 中显示获取结果

    我的问题是关于如何在渲染 return 中显示数组结果 我提取了 API 现在得到的结果存储在数组中 我需要显示这个结果 但我尝试在返回值中使用 for 但它不起作用 我还尝试了 map 和map is undefined fetch ur
  • 即使设置 SameSite=None 后,Safari 也不发送 cookie;安全的

    我们的应用程序使用 cookie 来记住用户登录 我们进行的每次身份验证 API 调用 浏览器都会将服务器设置的 HTTPonly cookie 附加到 API 请求并获得身份验证 Mojave 发布后 这种行为似乎在 Safari 中被打
  • java: TreeSet 顺序

    通过这段代码我得到这个输出 TreeSet
  • 如何获取文件名的路径部分?

    我想在 MATLAB 中获取文件名的路径部分 例如dirname http en wikipedia org wiki Dirname and basename http en wikipedia org wiki Basename在Lin
  • 有什么方法可以解决 FileSystemInfo.Fullname 有时抛出的 PathTooLongException 吗?

    我的硬盘上有一些文件会引发PathTooLongException当我访问Fullname的财产FileSystemInfo目的 有什么办法可以解决这个问题 不包括重命名文件 这不是一个选项 http msdn microsoft com
  • 如何在 Puppeteer 中重新加载页面?

    每当页面无法正确加载或遇到问题时 我想重新加载页面 我试过page reload 但它不起作用 for const sect of sections Now collect all the URLs const appUrls await
  • JavaScript 作用域和闭包

    我正在尝试解决闭包问题 某处有一个笑话 我遇到了这个 function do cool stuff 这是如何运作的 将函数放在括号中的目的是什么 为什么后面的括号是空的 这样做的要点是 在很酷的东西中声明的任何变量都不会在全局命名空间中创建
  • 如何使用Entity Framework Code-First执行CRUD?

    我在更新和删除与 EF Code first 的多对多关系时遇到了很大的困难 我有一个相当简单的模型 public class Issue Key public int IssueId get set public int Number g
  • Colspan + 删除多列后单元格宽度相等

    附言 如果可能的话 我更喜欢用 CSS 来解决这个问题 但如果没有办法 我也可以使用 JQuery 但没有其他库 好的 这是一个扩展我之前的问题 https stackoverflow com questions 9115878 equal
  • 为什么不提供一个操作员? :在斯卡拉[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 子域的索引文件

    我终于能够设置子域 但现在当我尝试单独访问子域时遇到问题 例如 当我访问 sub domain com 时 我收到页面未找到错误 但是 当我访问 sub domain com index php 时 我会看到我的页面 我的理论是 当我访问
  • logcat 警告“ 下的未知元素:元数据”是什么意思?

    在运行新安装的应用程序时 我发现这个Warninglogcat 中的消息 W PackageManager 1233 Couldn t remove dex file for package at location data app xx
  • 在scapy中发送ICMP数据包并选择正确的接口

    我们可以对第 3 层 ICMP 数据包使用 srp 函数吗 我发现当我们制作 ICMP 回显请求数据包并使用 sr 发送 接收时 我们没有看到它从接口发送出去 因此目的地没有响应 但是 如果我们使用 srp 函数 我们会看到相同的数据包响应