从tcpdump中剥离有效负载?

时间:2011-12-09 03:30:42

标签: python networking tcp tcpdump scapy

是否有自动方式(在tcpdump中或通过帮助应用程序Out There)生成仅包含以太网,IP和第4层(在我的情况下为TCP)标头的pcap文件,因此没有有效负载/应用程序结果pcap中的数据?我发现由于标题大小经常变化,因此无法选择不会捕获任何有效负载数据的捕获大小。

3 个答案:

答案 0 :(得分:9)

您可以使用Python的scapy模块

轻松剥离TCP有效负载

<强> BEFORE

[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

PAYLOAD STRIPPING

在linux中以root身份运行...

#!/usr/bin/env python
from scapy.all import *
INFILE = 'sample.pcap'
OUTFILE = 'stripped.pcap'
paks = rdpcap(INFILE)
for pak in paks:
    pak[TCP].remove_payload()
wrpcap(OUTFILE, paks)

<强> AFTER

[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有效载荷。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-2)

我的解决方案如下。我很想听听别人如何在没有外部库或截断的情况下做到这一点。我很想听听其他人如何执行此操作,因为我无法在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来验证信息仍然存在

pkts[_packet_num].load

有没有办法重新生成整个捕获,所以它看起来好像没有改变?