Scapy 上 ICMP 的时间戳 (Python)

问题描述 投票:0回答:1

背景

(如果你熟练使用Scapy,你可能想跳过这一部分)

我的任务是做一些基本的 ICMP 包,“看起来不像假包”。 所以我开始使用 Scapy 库用 Python 编写一些代码,有点像这样:

import scapy.all as scapy
import scapy.layers.inet as inet
import scapy.fields as fields
import sys
import random
import os
import time


'''some other code...'''

def packbuilder(sec, messagechar):
    packet = inet.IP(src=configured_ips[0], dst=configured_ips[1])
    packet[inet.IP].ttl = 64
    packet[inet.IP].id = os.getpid() & 0xFFFF
    del packet[inet.IP].chksum
    packet = packet/inet.ICMP()
    packet[inet.ICMP].id = icmp_id
    packet[inet.ICMP].seq = sec
    del packet[inet.ICMP].chksum
    timestamp = int(time.time() * 10**9)
    datatime = scapy.struct.pack('<Q', timestamp)
    packet = packet / scapy.Raw(load=datatime + messagechar.encode() + b'\x00')
    return packet

问题

众所周知,Scapy 中的 ICMP 包是通过一层一层堆叠而成的,在这些层中存在所谓的 “字段”。 许多 ICMP 包中的“常见”字段确实是时间戳。正如你所看到的,在代码(我从朋友的朋友那里借来的)中,scapy 将数据时间添加到 scapy.Raw,这是 Scapy 中 Package 的最后一层(不知道是否实际上必须拥有它)最后),所以它添加了时间戳...但它没有

Actual Package seen in Wireshark

所以我开始在 Scapy 的库中查找,最终我找到了我正在寻找的另一个问题,这实际上就是整个事情的目的:

scapy.layers.inet.ICMPTimeStampField

点击此处查看实际参考

您可能会意识到,与 scapy.layers.inet.ICMP() 不同,scapy.layers.inet.ICMPTimeStampField() 不是一个数据包,而是一个字段,因此您不能像堆叠数据包那样堆叠它。

我一直在阅读Scapy Fields Simple Datatypes,但似乎这是为了制作新类型的包,而我不想制作新类型的包。 我想使用 scapy.layers.inet.ICMPTimeStampField() 制作带有时间戳字段的 ICMP,但我不知道如何使用它。我可能必须制作一种新的包(我知道......)但是至少对于我们普通的 ICMP 方法来说是这样。

import scapy.all as scapy
import scapy.layers.inet as inet
import scapy.fields as fields
import sys
import random
import os
import time


'''some other code...'''

def packbuilder(sec, messagechar):
    packet = inet.IP(src=configured_ips[0], dst=configured_ips[1])
    packet[inet.IP].ttl = 64
    packet[inet.IP].id = os.getpid() & 0xFFFF
    del packet[inet.IP].chksum
    packet = packet/inet.ICMP()
    packet[inet.ICMP].id = icmp_id
    packet[inet.ICMP].seq = sec
    del packet[inet.ICMP].chksum
    timestamp = int(time.time() * 10**9)
    datatime = scapy.struct.pack('<Q', timestamp)
    packet = packet / scapy.Raw(load=datatime + messagechar.encode() + b'\x00')
    return packet

我真正需要的是这样的:

Ideal Package

python timestamp scapy icmp
1个回答
0
投票

最终我找到了一个答案,它并不完全是我想要的,因为它没有使用我提到的函数,但它是一个可能的解决方案,可以生成时间戳。

timestamp = int(time.time())
timestampBytes = struct.pack('<Q', timestamp)

它创建一个新层,将时间戳堆叠为时间戳。 但这不必到此结束。 如果您知道如何使用 scapy.layers.inet.ICMPTimeStampField() 请回答这篇文章,因为这对于学习 scapy 的人来说非常有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.