0
votes

Comment regrouper des paquets TCP Wireshark par flux à l'aide de Python

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


2 commentaires

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


3 Réponses :


1
votes

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


1 commentaires

J'ai modifié ma réponse précédente avec un code qui devrait répondre à votre question



0
votes

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.


0 commentaires

0
votes

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")


0 commentaires