我如何在 pcap 中创建一个 tcp 数据包

How do i create a tcp packet in a pcap

我想创建(不是发送或嗅探)tcp 数据包并将它们放入创建的 pcap 中。

我正在尝试 scapy,但很多文档都是用于发送数据包或嗅探现有网络流量的。我想在 pcap

中使用自定义 headers 和 put/create 创建 tcp 数据包和会话

如果您需要的话,您可以使用 wrpcap 函数将数据包写入 pcap 文件。在这个小脚本中,我制作了三个 SYN TCP 以目标端口 80 为目标并写入 pcap 文件的数据包:

from scapy.all import IP, TCP, wrpcap

for ip in [
        '8.8.8.8',
        '151.101.65.69',
        '104.244.42.129'
]:
    p = IP(dst=ip)/TCP(dport=80, flags='S')
    wrpcap('packets.pcap', p, append=True)

然后可以使用 wireshark 等打开输出 packets.pcap 文件。

[编辑] 然后您可以制作数据包并模拟 TCP 会话。你只需要 请注意 IP 地址、TCP 端口、标志和序列号。

例如,在该脚本中,我模拟了一个 TCP 连接 1.1.1.1:10000(客户端)和 2.2.2.2:80(服务器)。握手后, 客户端发送单词 GET,服务器用 DATA 回答。 然后断开连接。

Wireshark 似乎对生成的 pcap 文件很满意。

#!/usr/bin/env python3

from scapy.all import IP, TCP, wrpcap

src = '1.1.1.1'  # source IP
dst = '2.2.2.2'  # destination IP
sport = 10_000   # source port
dport = 80       # destination port

packets = [
    ##### TCP 3-way handshake
    # 1.1.1.1:10000 --SYN--> 2.2.2.2:80
    IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='S'),
    # 2.2.2.2:80 --SYN,ACK--> 1.1.1.1:10000
    IP(src=dst, dst=src)/TCP(sport=dport, dport=sport, flags='SA'),
    # 1.1.1.1:10000 --ACK--> 2.2.2.2:80
    IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='A'),
    #####

    ##### data exchange
    # 1.1.1.1:10000 --GET--> 2.2.2.2:80
    IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='', seq=1)/'GET',
    # 2.2.2.2:80 --ACK=4--> 1.1.1.1:10000     (4 = 1 + len('GET'))
    IP(src=dst, dst=src)/TCP(sport=dport, dport=sport, flags='A', seq=1, ack=4),
    # 2.2.2.2:80 --DATA--> 1.1.1.1:10000
    IP(src=dst, dst=src)/TCP(sport=dport, dport=sport, flags='', seq=1)/'DATA',
    # 1.1.1.1:10000 --ACK=5--> 2.2.2.2:80     (5 = 1 + len('DATA'))
    IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='A', ack=5),
    #####

    ##### TCP disconnection
    # 1.1.1.1:10000 --FIN--> 2.2.2.2:80
    IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='F', seq=4),
    # 2.2.2.2:80 --FIN,ACK--> 1.1.1.1:10000
    IP(src=dst, dst=src)/TCP(sport=dport, dport=sport, flags='FA', seq=5),
    # 1.1.1.1:10000 --ACK--> 2.2.2.2:80
    IP(src=src, dst=dst)/TCP(sport=sport, dport=dport, flags='A')
    #####
]

wrpcap('packets.pcap', packets)