如何使用 Python 对每个流的 Wireshark TCP 数据包进行分组

How to group Wireshark TCP packets per flow using Python

我在 Wireshark 中捕获了 tcp 数据并将数据导出到 csv,现在我正在尝试使用 python 对每个流的 tcp 数据包进行分组,但我不确定该怎么做。

如果源、源端口、目标、目标端口在行中向前和向后相同,则它被视为同一流的一部分,即 A->B 和 B->A

在下面的例子中有两个流程:

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

我建议将数据从 wireshark 导出为 .json 格式,有一种更好的方法可以使用未导出为 csv 格式的信息对 tcp 会话进行分组。为了从您的 pcap 中创建一个 json 文件,请执行以下操作:File->Export Packet Dissection->AS JSON...

这样做之后,您可以查看字段tcp.stream,它与tcp 流("flow") 具有相同的值。

然后您可以使用此代码遍历数据包,并搜索特定的 tcp.stream 值:

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)

以这段代码为例,跟踪所有在 11 号流中的 tcp 数据包,并对它们进行计数。

为了高效地工作并理解你在做什么,我建议你在文本编辑器(如 sublime)中打开 json 文件,看看它包含什么以及事物的层次结构。此外,我建议阅读 python 中的 json:w3schools python and json

您可以使用 pandas 来做到这一点。如果您将列 Src Port 重命名为 Src_Port 并将 Dest Port 重命名为 Dest_Port

假设['Source', 'Src_Port', 'Destination', 'Dest_Port', 'Protocol']这对是'flow'(我绝不是领域专家),而你的数据在'wireshark_dump.csv',你可以进行如下操作

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)

请注意,根据您的进一步处理方式,您可能不想迭代 groupby 组,因为它很慢。

也许你可以试试 pandas。 下面的片段。根据源 ip 地址对数据行进行分组。

我不明白你说的流量是什么意思。我假设这意味着根据源和目标 ip 对。

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

给出这样的输出

[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