J'ai capturé des données tcp dans Wireshark et exporté les données vers csv et maintenant j'essaie de regrouper les paquets tcp par flux, en utilisant python mais je ne sais pas comment faire. Destination, Dest Port est le même sur la ligne avant et arrière, il est considéré comme faisant partie du même flux, c'est-à-dire A-> B et B-> A
dans l'exemple ci-dessous, il y a deux flux:
No. Time Source Src Port Destination Dest Port Protocol Length Flags 37 12.045906 10.129.200.119 49298 17.248.144.77 443 TCP 54 0x010 38 12.04922 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x010 39 13.634783 10.129.200.119 49298 17.248.144.77 443 TLSv1.2 112 0x018 40 13.635868 10.129.200.119 49298 17.248.144.77 443 TLSv1.2 97 0x018 41 13.636239 10.129.200.119 49298 17.248.144.77 443 TCP 66 0x011 42 13.640724 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x010 43 13.640731 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x011 44 13.640732 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x010 45 13.640852 10.129.200.119 49298 17.248.144.77 443 TCP 66 0x011 47 14.472724 10.129.200.119 49299 17.253.37.210 80 TCP 78 0x0c2 48 14.478233 17.253.37.210 80 10.129.200.119 49299 TCP 74 0x052 50 14.478405 10.129.200.119 49299 17.253.37.210 80 TCP 66 0x010 51 14.479316 10.129.200.119 49299 17.253.37.210 80 HTTP 361 0x018 52 14.483419 17.253.37.210 80 10.129.200.119 49299 TCP 66 0x010 53 14.483425 17.253.37.210 80 10.129.200.119 49299 TCP 1514 0x010 54 14.483427 17.253.37.210 80 10.129.200.119 49299 TCP 1514 0x010 55 14.48343 17.253.37.210 80 10.129.200.119 49299 OCSP 319 0x018 56 14.48355 10.129.200.119 49299 17.253.37.210 80 TCP 66 0x010 57 14.483551 10.129.200.119 49299 17.253.37.210 80 TCP 66 0x010 58 14.486264 10.129.200.119 49299 17.253.37.210 80 TCP 66 0x011 59 14.490827 17.253.37.210 80 10.129.200.119 49299 TCP 66 0x011 60 14.490914 10.129.200.119 49299 17.253.37.210 80 TCP 66 0x010
Source Src Port Destination Dest Port 10.129.200.119 49298 17.248.144.77 443 10.129.200.119 49299 17.253.37.210 80
3 Réponses :
Je recommanderais d'exporter les données de WireShark au format .json, il existe un meilleur moyen de grouper une session tcp en utilisant des informations qui ne sont pas exportées au format csv. Pour créer un fichier json à partir de votre pcap, faites: File-> Export Packet Dissection-> AS JSON ...
Après cela, vous pouvez regarder le champ tcp.stream
, il a la même valeur pour tcp stream ("flow").
Ensuite, vous pouvez utiliser ce code pour parcourir le paquet et rechercher une valeur tcp.stream
spécifique:
import json with open('path_to_your_json.json') as json_file: packets = json.load(json_file) count = 0 for packet in packets: layers = packet["_source"]['layers'] if "tcp" in layers: if layers["tcp"]["tcp.stream"]=="11": count=count+1 print(count)
ce code par exemple, suivez tous les paquets tcp qui sont dans le flux numéro 11, et comptez-les.
Afin de travailler efficacement et de comprendre ce que vous faites, je vous recommande d'ouvrir le fichier json dans l'éditeur de texte (comme sublime), et de voir ce qu'il contient et la hiérarchie des choses. De plus, je recommanderais de lire sur json en python: w3schools python et json
J'ai modifié ma réponse précédente avec un code qui devrait répondre à votre question
Vous pouvez utiliser pandas pour ce faire. Si vous renommez vos colonnes Src Port
en Src_Port
et Dest Port
en Dest_Port
.
En supposant que la paire de ['Source', 'Src_Port', 'Destination', 'Dest_Port', 'Protocol']
est 'flow' (je ne suis en aucun cas un expert du domaine) et que vos données se trouvent dans 'wireshark_dump.csv', vous pouvez faire ce qui suit
import pandas as pd df = pd.read_csv('wireshark_dump.csv', delim_whitespace=True) flow_columns = ['Source', 'Src_Port', 'Destination', 'Dest_Port', 'Protocol'] for flow, flow_data in df.groupby(flow_columns): print(flow) print(flow_data)
Notez qu'en fonction de l'apparence de votre traitement ultérieur, vous ne voudrez peut-être pas parcourir le groupby groups car il est lent.
Peut-être que vous pouvez essayer les pandas. Ci-dessous l'extrait. regroupe les lignes de données en fonction de l'adresse IP source.
Je ne suis pas familier avec ce que vous entendez par flux. Je suppose que cela signifie en fonction des paires d'adresses IP source et de destination.
[8 rows x 9 columns] A B C D ... F G H I 0 37 12.045906 10.129.200.119 49298 ... 443 TCP 54 0x010 2 39 13.634783 10.129.200.119 49298 ... 443 TLSv1.2 112 0x018 3 40 13.635868 10.129.200.119 49298 ... 443 TLSv1.2 97 0x018 4 41 13.636239 10.129.200.119 49298 ... 443 TCP 66 0x011 [4 rows x 9 columns] A B C D E F G H I 1 38 12.04922 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x010 5 42 13.640724 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x010 6 43 13.640731 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x011 7 44 13.640732 17.248.144.77 443 10.129.200.119 49298 TCP 66 0x010
donne donc une sortie
import pandas as pd with open('data.txt') as f: lines = f.readlines() data = [] for line in lines: tokens = line.split() data.append(tokens) df = pd.DataFrame(data, columns=list("ABCDEFGHI")) print(df) grouped_df = df.groupby('C', as_index=False) for key, item in grouped_df: print(grouped_df.get_group(key), "\n\n")
poster quelques lignes du fichier csv pour avoir une idée de la structure des données
@abhilb J'ai ajouté quelques lignes des données ci-dessus