Python 从tcpdump上卸下有效负载?

Python 从tcpdump上卸下有效负载?,python,networking,tcp,tcpdump,scapy,Python,Networking,Tcp,Tcpdump,Scapy,是否有一种自动方式(在tcpdump中或通过帮助程序应用程序)生成只包含以太网、IP和第4层(在我的例子中是TCP)头的pcap文件,从而在生成的pcap中没有有效负载/应用程序数据?我发现,由于标头大小经常不同,因此不可能选择一个不会捕获任何有效负载数据的捕获大小。如果简单截断对您有效,您可以使用: tcpdump -i eth0 -s 96 -w test1.pcap 稍后,您可以使用wireshark对其进行分析。您可以使用Python模块非常轻松地剥离TCP负载 之前 [mpennin

是否有一种自动方式(在tcpdump中或通过帮助程序应用程序)生成只包含以太网、IP和第4层(在我的例子中是TCP)头的pcap文件,从而在生成的pcap中没有有效负载/应用程序数据?我发现,由于标头大小经常不同,因此不可能选择一个不会捕获任何有效负载数据的捕获大小。

如果简单截断对您有效,您可以使用:

tcpdump -i eth0 -s 96 -w test1.pcap

稍后,您可以使用wireshark对其进行分析。

您可以使用Python模块非常轻松地剥离TCP负载

之前

[mpenning@hotcoffee tshark_wd]$ tcpdump -n -r sample.pcap 
reading from file sample.pcap, link-type EN10MB (Ethernet)
00:25:42.443559 IP 192.168.12.237.1052 > 192.168.12.236.22: Flags [P.], 
    seq 2445372969:2445373021, ack 1889447842, win 63432, length 52
00:25:42.443607 IP 192.168.12.236.22 > 192.168.12.237.1052: Flags [.], 
    ack 52, win 65535, length 0
00:25:42.443980 IP 192.168.12.236.22 > 192.168.12.237.1052: Flags [P.], 
    seq 1:389, ack 52, win 65535, length 388
有效负载剥离

在linux中以root用户身份运行此

#/usr/bin/env python
从斯卡皮来的,都是进口货*
infle='sample.pcap'
OUTFILE='stripped.pcap'
paks=rdpcap(填充)
对于pak in paks:
pak[TCP]。删除_有效负载()
wrpcap(输出文件,paks)
之后

[mpenning@hotcoffee tshark_wd]$ tcpdump -n -r stripped.pcap 
reading from file sample.pcap, link-type EN10MB (Ethernet)
00:25:42.443559 IP truncated-ip - 52 bytes missing! 192.168.12.237.1052 
    > 192.168.12.236.22: Flags [P.], seq 2445372969:2445373021, 
    ack 1889447842, win 63432, length 52
00:25:42.443607 IP 192.168.12.236.22 > 192.168.12.237.1052: Flags [.], 
    ack 52, win 65535, length 0
00:25:42.443980 IP truncated-ip - 388 bytes missing! 192.168.12.236.22 
    > 192.168.12.237.1052: Flags [P.], seq 1:389, 
    ack 52, win 65535, length 388

在上面的
tcpdump
中,请注意“XX字节丢失!”消息。这是因为我们删除了TCP负载。

我的解决方案如下。我很想听听其他人在没有外部库或截断的情况下是如何做到这一点的。我很想听听其他人是怎么做的,因为我在Scapy文档中找不到remove_payload()函数,所以这个答案无法使用

#read pcap file 
pkts = rdpcap("packet-capture.pcap")

#write packet with payload "XXXXXXXXXX"
for pkt in pkts:
     pkt.load = "XXXXXXXXXX"

#write new pcap
wrpcap("new.pcap", pkts)
问题是,当使用tcpdump读取时,会丢失一个字节!对于src IP。我可以使用scapy via验证信息是否仍然存在

pkts[_packet_num].load

是否有办法重新生成整个捕获,使其看起来像未更改一样?

不幸的是,OP是正确的,由于TCP选项字段,无法可靠地预测TCP标头的长度。在大多数情况下,这是IP/TCP报头中唯一有可能在长度上存在差异的部分。固定的snaplen值不能保证您总是在正确的位置截断TCP负载。这听起来更像是另一个问题而不是答案。也许考虑另一个。