
Обёртка на Python для tshark, позволяющая разбирать пакеты с помощью диссекторов Wireshark.
Python-обёртка для tshark, позволяющая выполнять разбор пакетов Python с использованием дисекторов Wireshark.
Расширенная документация: http://kiminewt.github.io/pyshark
Ищем контрибьюторов — по разным причинам мне сейчас трудно находить время на поддержку и развитие пакета. Все pull-запросы будут рассмотрены, а если кто-то заинтересован и подходит, я с радостью включу его в проект. Смело пишите мне на dorgreen1 at gmail.
Существует довольно много модулей разбора пакетов Python, но этот отличается тем, что на самом деле не разбирает пакеты, а просто использует способность tshark (утилиты командной строки Wireshark) экспортировать XML для своего разбора.
Этот пакет позволяет выполнять разбор из файла захвата или в реальном времени, используя все установленные дисекторы Wireshark. Протестировано на Windows/Linux.
Поддерживается Python 3.7+. Неподдерживаемая версия Python 2 существует в виде pyshark-legacy.
Поддерживаются все современные версии tshark / wireshark, но некоторые функции могут быть недоступны на старых версиях.
Просто выполните следующую команду для установки последней версии из pypi:
pip install pyshark
Или установите из git-репозитория:
git clone https://github.com/KimiNewt/pyshark.git
cd pyshark/src
python setup.py install
Возможно, вам потребуется установить libxml, что может быть неожиданным. Если вы получите ошибку от clang или сообщение об ошибке, связанное с libxml, выполните следующее:
xcode-select --install
pip install libxml
Вероятно, вам придётся принять лицензионное соглашение XCode, поэтому будьте готовы нажать кнопку «Принять» в графическом интерфейсе.
>>> import pyshark
>>> cap = pyshark.FileCapture('/tmp/mycapture.cap')
>>> cap
<FileCapture /tmp/mycapture.cap (589 packets)>
>>> print cap[0]
Packet (Length: 698)
Layer ETH:
Destination: BLANKED
Source: BLANKED
Type: IP (0x0800)
Layer IP:
Version: 4
Header Length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
Total Length: 684
Identification: 0x254f (9551)
Flags: 0x00
Fragment offset: 0
Time to live: 1
Protocol: UDP (17)
Header checksum: 0xe148 [correct]
Source: BLANKED
Destination: BLANKED
...
>>> capture = pyshark.LiveCapture(interface='eth0')
>>> capture.sniff(timeout=50)
>>> capture
<LiveCapture (5 packets)>
>>> capture[3]
<UDP/HTTP Packet>
for packet in capture.sniff_continuously(packet_count=5):
print('Just arrived:', packet)
>>> capture = pyshark.LiveRingCapture(interface='eth0')
>>> capture.sniff(timeout=50)
>>> capture
<LiveCapture (5 packets)>
>>> capture[3]
<UDP/HTTP Packet>
for packet in capture.sniff_continuously(packet_count=5):
print('Just arrived:', packet)
>>> capture = pyshark.RemoteCapture('192.168.1.101', 'eth0')
>>> capture.sniff(timeout=50)
>>> capture
Данные можно получить несколькими способами. Пакеты разделены на уровни: сначала нужно добраться до соответствующего уровня, а затем выбрать поле.
Всё следующее работает:
>>> packet['ip'].dst
192.168.0.1
>>> packet.ip.src
192.168.0.100
>>> packet[2].src
192.168.0.100
Чтобы проверить, присутствует ли уровень в пакете, можно использовать его имя:
>>> 'IP' in packet
True
Чтобы увидеть все возможные имена полей, используйте атрибут packet.layer.field_names (т.е. packet.ip.field_names) или автодополнение в вашем интерпретаторе.
Вы также можете получить исходные двоичные данные поля или его читаемое описание:
>>> p.ip.addr.showname
Source or Destination Address: 10.0.0.10 (10.0.0.10)
# And some new attributes as well:
>>> p.ip.addr.int_value
167772170
>>> p.ip.addr.binary_value
b'\n\x00\x00\n'
Pyshark поддерживает автоматическую расшифровку трасс с использованием стандартов WEP, WPA-PWD и WPA-PSK (WPA-PWD используется по умолчанию).
>>> cap1 = pyshark.FileCapture('/tmp/capture1.cap', decryption_key='password')
>>> cap2 = pyshark.LiveCapture(interface='wi0', decryption_key='password', encryption_type='wpa-psk')
Кортеж поддерживаемых стандартов шифрования, SUPPORTED_ENCRYPTION_STANDARDS, существует в каждом классе захвата.
>>> pyshark.FileCapture.SUPPORTED_ENCRYPTION_STANDARDS
('wep', 'wpa-pwd', 'wpa-psk')
>>> pyshark.LiveCapture.SUPPORTED_ENCRYPTION_STANDARDS
('wep', 'wpa-pwd', 'wpa-psk')
Фильтры отображения Pyshark могут быть полезны при анализе трафика, ориентированного на приложения. BPF-фильтры не обеспечивают такой гибкости, как фильтры отображения Wireshark.
>>> cap1 = pyshark.FileCapture('/tmp/capture1.cap', display_filter="dns")
>>> cap2 = pyshark.LiveCapture(interface='en0', display_filter="tcp.analysis.retransmission")
Этот проект лицензирован под MIT. Вклады в этот проект принимаются на той же лицензии.