首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python3 Scapy -嗅探分段IP数据包

Python3 Scapy -嗅探分段IP数据包
EN

Stack Overflow用户
提问于 2021-03-04 16:05:08
回答 1查看 778关注 0票数 2

我试图通过以下设置简化我的问题。

一个简单的netcat侦听器在端口1337上,在我的本地接口上(192.168.183.130)

  • A简单netcat客户机连接到端口1337上的侦听器(从运行在192.168.183.130

上的192.168.183.128)

  • A非常基本的替身嗅探器)

使用根权限运行的Scapy嗅探器:

代码语言:javascript
运行
复制
from scapy.all import sniff, IP, UDP

def print_package(packet):
    packet.show()


sniff(filter="ip dst host 192.168.183.130 and dst port 1337", iface="ens33", prn=print_package)

发送IP数据包/ UDP帧的限制为1500字节,它的工作原理就像符符一样,数据包将按预期的方式打印到std。一旦我完成了限制,IP协议创建了片段,嗅探器就只捕获第一个数据包(正确的标志、len等)

在下面的示例中,我从nc客户端向侦听器发送了一个简单的字符串'next消息‘为3200 * "A“,然后再用netcat发送3200 *”A“。在UDP套接字netcat使用之前,数据包被分割成三个IP包,并由堆栈正确地重新组装,所以一切都像我所期望的那样在网络上正常工作。Scapy只嗅探这三个包中的第一个,我不明白为什么会发生这种情况。

屏幕截图显示了wireshark中文本消息和三个IP片段的预期/正确处理:

下面的代码片段显示了stdout的替罪羊输出:

代码语言:javascript
运行
复制
sudo python3 scapy_test.py 
    
    ###[ Ethernet ]### 
      dst       = 00:0c:29:fa:93:72
      src       = 00:0c:29:15:2a:11
      type      = IPv4
    ###[ IP ]### 
         version   = 4
         ihl       = 5
         tos       = 0x0
         len       = 59
         id        = 18075
         flags     = DF
         frag      = 0
         ttl       = 64
         proto     = udp
         chksum    = 0x3c3
         src       = 192.168.183.128
         dst       = 192.168.183.130
         \options   \
    ###[ UDP ]### 
            sport     = 59833
            dport     = 1337
            len       = 39
            chksum    = 0xdaa0
    ###[ Raw ]### 
               load      = 'next message will be 3200 * "A"\n'
    
    ###[ Ethernet ]### 
      dst       = 00:0c:29:fa:93:72
      src       = 00:0c:29:15:2a:11
      type      = IPv4
    ###[ IP ]### 
         version   = 4
         ihl       = 5
         tos       = 0x0
         len       = 1500
         id        = 20389
         flags     = MF
         frag      = 0
         ttl       = 64
         proto     = udp
         chksum    = 0x1518
         src       = 192.168.183.128
         dst       = 192.168.183.130
         \options   \
    ###[ UDP ]### 
            sport     = 59833
            dport     = 1337
            len       = 3209
            chksum    = 0x25bd
    ###[ Raw ]### 
               load      = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'

为什么缺少其他IP片段,我如何才能嗅探到它们?,我知道会话参数在sniff中,但是我在用session=IPSession重新组装数据包方面没有任何运气。(无论如何,这不是我想要实现的,对于我的应用程序,我希望嗅探所有的片段,更改它们的部分,并将它们转发到另一个地址/套接字。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-05 16:04:49

我终于自己弄明白了,所以我要留下一个答案:

问题在于嗅探器的过滤器:

代码语言:javascript
运行
复制
sniff(filter="ip dst host 192.168.183.130 and dst port 1337", iface="ens33", prn=print_package)

第一个之后的IP片段没有UDP部分,因此没有目的地端口,因此代位筛选器不会捕获它们。为了解决这个问题,我扩展了过滤器以捕获带有偏移量的dst端口1337或片段。我偶然发现了这个样式表https://github.com/SergK/cheatsheat-tcpdump/blob/master/tcpdump_advanced_filters.txt,它为这个问题提供了一个有效的伯克利语法,并最终得到了这个过滤器(对于简化的问题)。

代码语言:javascript
运行
复制
sniff(filter="ip dst host 192.168.183.130 and ((src port 1337) or (((ip[6:2] > 0) or (ip[7] > 0)) and (not ip[6] = 64))", iface="ens33", prn=print_package)

这将检查数据包的碎片偏移量是否大于0(在第六个字节(标志)的前三位之后的任何内容或第七个字节之后的值都是>0),以及“不分段”位是否没有设置。如果这是真的,这是一个IP片段,嗅探器将嗅探它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66478735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档