Как извлечь определенное расширение TLS из файла .pcapng с использованием библиотеки pyshark?

Я работаю с библиотекой <b>pyshark</b> на Python и анализирую .pcapng файл с сетевым трафиком. Мне необходимо извлечь значение расширения TLS, которое **не является первым** в списке расширений. Например, я хочу получить значение поля "tls.handshake.extension.type" для расширения "Extension: supported_versions". В данный момент выводится значение "Extension: Reserved", которое располагается первым в списке расширений. Как мне это исправить?
  • 24 февраля 2025 г. 18:14
Ответы на вопрос 2
Для извлечения определенного расширения TLS из файла .pcapng с помощью библиотеки PyShark, вам потребуется пройти через каждый пакет в вашем файле и отфильтровать необходимые данные. В случае, если расширение не является первым в списке, вам нужно будет пройти циклом через все расширения и выбрать то, которое вам нужно. 

Вот пример того, как вы можете сделать это:

```python
import pyshark

# Замените 'your_file.pcapng' на путь к вашему pcapng файлу
file_path = 'your_file.pcapng'

# Открытие файла с помощью PyShark
cap = pyshark.FileCapture(file_path, display_filter='tls.handshake.type == 1')  # Отбираем только сообщения handshake

for packet in cap:
    # Проверяем, есть ли TLS расширения в пакете
    if hasattr(packet, 'tls') and hasattr(packet.tls, 'handshake'):
        # Получаем все расширения из пакета
        extensions = packet.tls.handshake.extensions
        for extension in extensions:
            # Проверка на нужное расширение
            if 'Extension: supported_versions' in str(extension):
                # Выводим тип расширения
                print(extension.extension_type)
                break  # Выходим из цикла, если расширение найдено

# Закрытие захвата
cap.close()
```

Обратите внимание на следующие моменты в коде:

1. Мы используем `display_filter` для фильтрации только тех пакетов, которые относятся к handshake TLS. Это нужно для оптимизации.
2. Проверяем, есть ли атрибуты `tls` и `handshake` в пакете перед тем, как к ним обращаться, чтобы избежать ошибок, если пакет не содержит этих данных.
3. Проходим через все найденные расширения и ищем нужное по имени.
4. После поиска нужного расширения можем вывести его тип или любое другое требуемое значение. 

Этот пример может потребовать модификации в зависимости от конкретных данных в вашем `.pcapng` файле, но задаёт общий подход к решению вашей задачи.
Так не пойдёт? 
import pyshark

display_filter = 'tls.record.content_type == 22'
pcap = pyshark.FileCapture(file_path, display_filter=display_filter)
d = {}

for packet_number, packet in enumerate(pcap):
    for layer in packet:
        if 'Supported Version:' in str(layer):
            for line in str(layer).splitlines():
                if 'Supported Version:' in line:
                    tls_version = line.split(' ')[3]
                    if packet_number in d:
                        d[packet_number].append(tls_version)
                    else:
                        d[packet_number] = [tls_version]

print(d)

>>> {0: ['1.3', '1.2'], 1: ['1.3'], 2: ['1.3', '1.2'], 3: ['1.3'], 4: ['1.3', '1.2'], 5: ['1.3']}
Похожие вопросы