从tcpdump中剥离有效负载?

8 投票
3 回答
19359 浏览
提问于 2025-04-17 08:01

有没有一种自动化的方法(可以是tcpdump工具或者其他的辅助应用)来生成一个pcap文件,这个文件里只包含以太网、IP和第四层(在我这个例子中是TCP)头信息,而不包含任何负载或应用数据?我发现由于头信息的大小常常不同,所以很难选择一个捕获大小,确保不会抓到任何负载数据。

3 个回答

-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读取时,源IP会显示缺少字节! 我可以通过Scapy验证信息仍然存在,方法是

pkts[_packet_num].load

有没有办法重新生成整个捕获的数据,让它看起来像是没有被修改过一样?

1

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

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

之后你可以用wireshark来分析它。

10

你可以很简单地用Python的scapy模块来去掉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系统中以管理员身份运行这个...

#!/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)

之后的状态

[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的负载。

撰写回答