Esiste un modo automatico (in tcpdump o tramite un'app helper Out There) per generare un file pcap che contiene solo intestazioni Ethernet, IP e Layer 4 (TCP nel mio caso), in modo che non vi siano dati di payload/applicazione nel pcap risultante? Ho scoperto che, poiché le dimensioni dell'intestazione variano spesso, è impossibile scegliere una dimensione di acquisizione che non catturerà alcun dato di payload.Stripping payload da un tcpdump?
risposta
È possibile togliere i payload TCP molto facilmente con il modulo di Python scapy
PRIMA
[[email protected] 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
L'esecuzione di questo come root in 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)
DOPO
[[email protected] 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
Nel tcpdump
sopra, notare i "byte XX manca!" messaggi. Questo perché abbiamo rimosso il carico utile TCP.
Se semplice troncare avrebbe funzionato per voi, è possibile utilizzare:
tcpdump -i eth0 -s 96 -w test1.pcap
In seguito è possibile analizzare con Wireshark.
La mia soluzione era la seguente. Mi piacerebbe sentire come gli altri lo fanno senza librerie esterne o troncamenti. Mi piacerebbe sapere come gli altri hanno eseguito questo, perché non sono riuscito a trovare la funzione remove_payload() nella documentazione di Scapy, rendendo questa risposta inutilizzabile.
#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)
Il problema di questo è che, se letta con tcpdump, lascia una byte mancanti! per l'IP src. Posso verificare l'infromation è ancora lì con Scapy via
pkts[_packet_num].load
Esiste un modo per rigenerare l'intera acquisizione in modo che appaia come se fosse inalterato?
Sembra più una domanda che una risposta. Forse considera [chiedendo] (http://stackoverflow.com/questions/ask) un altro. – adamdunson
Sfortunatamente l'OP è corretto, non c'è modo di prevedere in modo affidabile la lunghezza delle intestazioni TCP, a causa del campo Opzioni TCP. Per la maggior parte, questa è l'unica parte delle intestazioni IP/TCP che ha una possibilità significativa di differire in lunghezza. Un valore snaplen fisso non garantisce il troncamento del carico utile TCP nel punto corretto. –