从tcpdump中剥离有效负载?
有没有一种自动化的方法(可以是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的负载。