【问题标题】:Scapy packet have new DNS layer after reassembling from raw bytesScapy 数据包在从原始字节重组后具有新的 DNS 层
【发布时间】:2018-04-08 23:46:15
【问题描述】:

我正在尝试发送和接收 scapy 数据包。我这样做是通过使用 scapy 构建一个数据包,使用 scapy 提供的send 函数发送它,接收数据包 使用套接字的recvfrom 函数作为原始字节。

看起来像 scapy 的 build 函数 - 将 scapy 数据包转换为十六进制字符串,有时会在数据包中添加“新”DNS 层。

我举个例子: 当使用build 将此数据包IP()/UDP()/"hello" 转换为十六进制字符串,然后使用IP(hex_str) 重新组装它时,我收到了预期的数据包:

<IP  version=4L ihl=5L tos=0x0 len=33 id=1 flags= frag=0L ttl=64 proto=udp chksum=0x7cc9 src=127.0.0.1 dst=127.0.0.1 options=[] |<UDP  sport=domain dport=domain len=13 chksum=0xbd95 |<Raw  load='hello' |>>>

但是,当使用 build 将此数据包 IP()UDP()/"ab" 转换为十六进制字符串,然后使用 IP(hex_string) 重新组合时,我收到的数据包与预期不同:

<IP  version=4L ihl=5L tos=0x0 len=30 id=1 flags= frag=0L ttl=64 proto=udp chksum=0x7ccc src=127.0.0.1 dst=127.0.0.1 options=[] |<UDP  sport=domain dport=domain len=10 chksum=0xa00b |<DNS  id=24930 |>>>

任何帮助都将受到高度评价! 谢谢

【问题讨论】:

    标签: python dns udp ip scapy


    【解决方案1】:

    问题是,53 是 scapy implementationRFC 1035 中的 UDP 运动(源端口)和 dport(目标端口)的默认值“域名 - 实施和规范”在章节“4.2 .1. UDP 使用”:

    使用 UDP 用户服务器端口 53(十进制)发送的消息。

    因此,scapy 似乎试图将您的 hex_string 解释为 IP/TCP/DNS 数据包。更一般地说,scapy 总是试图将 hex_strings 解释为协议,它对应于端口号。

    如果您将 UDP 端口更改为例如 42

    packet = IP()/UDP(sport=42, dport=42)/"ab"
    hex_string = packet.build()
    newPacket = IP(hex_string)
    

    newPacket 的表示为:

    <IP  [some flags] |<UDP  sport=nameserver dport=nameserver len=10 chksum=0x91ab |<Raw  load='ab' |>>>
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多