Pitone

Costruire il proprio monitor di rete con PyShark

Costruire il proprio monitor di rete con PyShark

Strumenti esistenti

Molti strumenti per l'analisi di rete esistono da un po' di tempo. Sotto Linux, ad esempio, questi sono Wireshark, tcpdump, nload, iftop, iptraf, nethogs, bmon, tcptrack così come tachimetro ed ettercap. Per una descrizione dettagliata di essi, puoi dare un'occhiata al confronto di Silver Moon [1].

Quindi, perché non utilizzare uno strumento esistente e scriverne uno personale, invece?? I motivi che vedo sono una migliore comprensione dei protocolli di rete TCP/IP, imparare a codificare correttamente o implementare solo la funzionalità specifica di cui hai bisogno per il tuo caso d'uso perché gli strumenti esistenti non ti danno ciò di cui hai effettivamente bisogno. Inoltre, anche i miglioramenti della velocità e del carico della tua applicazione/sistema possono svolgere un ruolo che ti motiva a muoverti di più in questa direzione.

In natura, esistono parecchie librerie Python per l'elaborazione e l'analisi della rete. Per la programmazione di basso livello, la libreria socket [2] è la chiave. Le librerie basate su protocollo di alto livello sono httplib, ftplib, imaplib e smtplib. Per monitorare le porte di rete e il flusso di pacchetti candidati competitivi, vengono utilizzati python-nmap [3], dpkt [4] e PyShark [5]. Sia per il monitoraggio che per la modifica del flusso di pacchetti, la libreria scapy [6] è ampiamente utilizzata.

In questo articolo, daremo un'occhiata alla libreria PyShark e monitoreremo quali pacchetti arrivano a una specifica interfaccia di rete. Come vedrai di seguito, lavorare con PyShark è semplice. La documentazione sul sito web del progetto ti aiuterà per i primi passi: con essa otterrai un risultato utilizzabile molto rapidamente. Tuttavia, quando si tratta del nocciolo, è necessaria più conoscenza more.

PyShark può fare molto di più di quanto sembri a prima vista e sfortunatamente, al momento in cui scriviamo, la documentazione esistente non lo copre completamente. Questo lo rende inutilmente difficile e fornisce una buona ragione per guardare più in profondità sotto il cofano.

Informazioni su PyShark

PyShark [8] è un wrapper Python per Tshark [10]. Usa semplicemente la sua capacità di esportare dati XML usando il suo parsing. Tshark stesso è la versione a riga di comando di Wireshark. Sia Tshark che PyShark dipendono dalla libreria Pcap che cattura effettivamente i pacchetti di rete ed è mantenuta sotto il cofano di Tcpdump [7]. PyShark è sviluppato e mantenuto continuamente da Dan (usa il nome KimiNewt su Twitter).

Per evitare possibili confusioni, esiste uno strumento dal suono simile, Apache Spark [11], che è un motore di analisi unificato per l'elaborazione di dati su larga scala. Il nome PySpark viene utilizzato per l'interfaccia Python ad Apache Spark, di cui non parleremo qui.

Installazione di PyShark

PyShark richiede l'installazione sia della libreria Pcap che di Tshark. I pacchetti corrispondenti per Debian GNU/Linux 10 e Ubuntu sono denominati libpcap0.8 e tshark e può essere impostato come segue utilizzando apt-get:

Listato 1: installazione della libreria Pcap e Tshark

# pip3 installa python-pyshark

Se non ancora installato, devono essere aggiunti anche Python3 e Pip. I pacchetti corrispondenti per Debian GNU/Linux 10 e Ubuntu sono denominati python3 e python3-pip e possono essere installati come segue utilizzando apt-get:

Listato 2: Installa Python 3 e PIP per Python 3

# apt-get install python3 python3-pip

Ora è il momento di aggiungere PyShark. Sulla base della nostra ricerca, PyShark non è ancora impacchettato per nessuna delle principali distribuzioni Linux. L'installazione viene eseguita utilizzando il programma di installazione del pacchetto Python pip3 (pip per Python 3) come pacchetto a livello di sistema come segue:

Listato 3: Installa PyShark usando PIP

# pip3 installa python-pyshark

Ora, PyShark è pronto per essere utilizzato negli script Python sul tuo sistema Linux. Si prega di notare di eseguire gli script Python di seguito come utente amministrativo, ad esempio, utilizzando sudo perché la libreria Pcap non consente di cercare i pacchetti come utente normale.

La seguente istruzione aggiunge il contenuto del modulo PyShark allo spazio dei nomi del tuo script Python:

Listato 4: importare il modulo PyShark

import pyshark

Metodi di acquisizione dei pacchetti

Fuori dalla scatola, PyShark viene fornito con due diverse modalità con cui offre la raccolta di pacchetti dall'interfaccia di rete osservata. Per la raccolta continua, usa il metodo LiveCapture() e per il salvataggio in un file locale, usa il metodo FileCapture() dal modulo PyShark. Il risultato è un elenco di pacchetti (oggetto iteratore Python) che consente di esaminare i dati acquisiti pacchetto per pacchetto. Gli elenchi di seguito mostrano come utilizzare i due metodi.

Listato 5: Usa PyShark per acquisire dalla prima interfaccia Wifi wlan0

import pyshark
cattura = pyshark.LiveCapture(interfaccia='wlan0')

Con le istruzioni precedenti, i pacchetti di rete acquisiti vengono mantenuti in memoria. La memoria disponibile potrebbe essere limitata, tuttavia, l'archiviazione dei pacchetti catturati in un file locale è un'alternativa. In uso è il formato di file Pcap [9]. Ciò consente di elaborare e interpretare i dati acquisiti anche da altri strumenti collegati alla libreria Pcap.

Listato 6: Usa PyShark per archiviare i pacchetti catturati in un file locale

import pyshark
cattura = pyshark.FileCapture('/tmp/networkpackages.cap')

Eseguendo gli elenchi 5 e 6, non avrai ancora alcun output. Il prossimo passo è restringere i pacchi da ritirare in modo più preciso in base ai criteri desiderati.

Selezione dei pacchetti

L'oggetto di acquisizione precedentemente introdotto stabilisce una connessione all'interfaccia desiderata. Successivamente, i due metodi sniff() e sniff_continuously() dell'oggetto di acquisizione raccolgono i pacchetti di rete. sniff() ritorna al chiamante non appena tutti i pacchetti richiesti sono stati raccolti. Al contrario, sniff_continuously() consegna un singolo pacchetto al chiamante non appena è stato raccolto. Ciò consente un flusso live del traffico di rete.

Inoltre, i due metodi consentono di specificare varie limitazioni e meccanismi di filtraggio dei pacchetti, ad esempio il numero di pacchetti utilizzando il parametro packet_count e il periodo durante il quale i pacchetti devono essere raccolti utilizzando il parametro timeout. Il Listato 7 mostra come raccogliere 50 pacchetti di rete, solo, come streaming live, usando il metodo sniff_continuously().

Listato 7: Raccogli 50 pacchetti di rete da wlan0

import pyshark
cattura = pyshark.LiveCapture(interfaccia='wlan0')
per pacchetto in cattura.sniff_continuously(packet_count=5):
stampa (pacchetto)

Vari dettagli del pacchetto sono visibili utilizzando l'istruzione print(packet) (vedi Figura 1).

Figura 1: contenuto della confezione

Nell'elenco 7, hai raccolto tutti i tipi di pacchetti di rete, indipendentemente dal protocollo o dalla porta di servizio. PyShark permette di effettuare filtri avanzati, utilizzando il cosiddetto filtro BPF [12]. Il Listato 8 mostra come raccogliere 5 pacchetti TCP in arrivo tramite la porta 80 e stampare il tipo di pacchetto. Le informazioni sono memorizzate nell'attributo del pacchetto più alto livello.

Listato 8: Raccolta solo di pacchetti TCP

import pyshark
cattura = pyshark.LiveCapture(interface='wlan0', bpf_filter='tcp port 80')
catturare.sniff(conta_pacchetti=5)
stampa (cattura)
per pacchetto in cattura:
stampa (pacchetto.layer_più alto)

Salva il listato 8, come file tcp-sniff.py ed esegui lo script Python. L'output è il seguente:

Listato 9: L'output del Listato 8

# python3 tcp-sniff.pi

TCP
TCP
TCP
OCSP
TCP
#

Unboxing dei pacchetti catturati

L'oggetto catturato funziona come una bambola Matroska russa: strato per strato, contiene il contenuto del pacchetto di rete corrispondente. L'unboxing sembra un po' come il Natale: non sai mai quali informazioni trovi all'interno finché non lo apri. Il Listato 10 mostra l'acquisizione di 10 pacchetti di rete e la rivelazione del tipo di protocollo, sia la porta e l'indirizzo di origine e di destinazione.

Listato 10: Visualizzazione dell'origine e della destinazione del pacchetto catturato

import pyshark
tempo di importazione
# definisce l'interfaccia
networkInterface = "enp0s3"
# definire l'oggetto di cattura
cattura = pyshark.LiveCapture(interfaccia=interfaccia di rete)
print("ascolto su %s" % networkInterface)
per pacchetto in cattura.sniff_continuously(packet_count=10):
# uscita regolata
provare:
# ottieni il timestamp
ora locale = ora.asctime(time.ora locale(ora.tempo()))
# ottenere il contenuto del pacchetto
protocollo = pacchetto.transport_layer # tipo di protocollo
src_addr = pacchetto.ip.src # indirizzo di origine
src_port = pacchetto[protocollo].srcport # porta sorgente
dst_addr = pacchetto.ip.dst # indirizzo di destinazione
dst_port = pacchetto[protocollo].dstport # porta di destinazione
# informazioni sul pacchetto di output
print ("%s IP %s:%s <-> %s:%s (%s)" % (localtime, src_addr, src_port, dst_addr, dst_port, protocol))
tranne AttributeError come e:
# ignora i pacchetti diversi da TCP, UDP e IPv4
passaggio
Stampa (" ")

Lo script genera un output, come mostrato in Figura 2, una singola riga per pacchetto ricevuto. Ogni riga inizia con un timestamp, seguito dall'indirizzo IP e dalla porta di origine, quindi dall'indirizzo IP e dalla porta di destinazione e, infine, dal tipo di protocollo di rete.


Figura 2: Sorgente e destinazione per i pacchetti acquisiti

Conclusione

Costruire il tuo scanner di rete non è mai stato così facile. Basato sulle basi di Wireshark, PyShark ti offre un framework completo e stabile per monitorare le interfacce di rete del tuo sistema nel modo in cui lo richiedi.

Link e riferimenti

  • [1] Silver Moon: 18 comandi per monitorare la larghezza di banda della rete su server Linux, https://www.binaritidi.com/linux-commands-monitor-network/
  • [2] Libreria socket Python, https://docs.pitone.org/3/libreria/socket.html
  • [3] python-nmap, https://pypi.org/progetto/python3-nmap/
  • [4] dpkt, https://pypi.org/progetto/dpkt/
  • [5] PyShark, https://pypi.org/progetto/pyshark/
  • [6] scapy, https://pypi.org/progetto/scapy/
  • [7] Tcpdump e libpcap, http://www.tcpdump.org/
  • [8] PyShark, sito web del progetto, http://kiminewt.github.io/pyshark/
  • [9] Formato file Libpcap, Wiki Wireshark, https://gitlab.com/wireshark/wireshark/-/wikis/Development/LibpcapFileFormat
  • [10] Tshark, https://www.wireshark.org/docs/man-pages/tshark.html
  • [11] Apache Spark, https://spark.apache.org/
  • [12] Filtro BPF, https://wiki.wireshark.org/CaptureFilters
WinMouse ti consente di personalizzare e migliorare il movimento del puntatore del mouse su PC Windows
Se vuoi migliorare le funzioni predefinite del puntatore del mouse, usa freeware WinMouse. Aggiunge più funzionalità per aiutarti a ottenere il massim...
Il tasto sinistro del mouse non funziona su Windows 10
Se stai utilizzando un mouse dedicato con il tuo laptop o computer desktop ma il il tasto sinistro del mouse non funziona su Windows 10/8/7 per qualch...
Il cursore salta o si sposta in modo casuale durante la digitazione in Windows 10
Se scopri che il cursore del mouse salta o si sposta da solo, automaticamente, in modo casuale durante la digitazione nel laptop o nel computer Window...