Costruire il tuo monitor di rete con Pyshark

Costruire il tuo monitor di rete con Pyshark

Strumenti esistenti

Molti strumenti per l'analisi della rete esistono da un po 'di tempo. Sotto Linux, ad esempio, questi sono Wireshark, TCPDump, Nload, IFtop, IPTraf, Nethogs, BMON, TCPTrack, nonché tachimetro. Per una loro descrizione dettagliata, potresti dare un'occhiata al confronto di Silver Moon [1].

Quindi, perché non usare uno strumento esistente e invece scrivi il tuo? I motivi che vedo sono una migliore comprensione dei protocolli di rete TCP/IP, imparando come programmare 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, i miglioramenti della velocità e del carico dell'applicazione/sistema possono anche svolgere un ruolo che ti motiva a muoverti di più in questa direzione.

In natura, esistono parecchi biblioteche 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 protocolli di alto livello sono HTTPLIB, FTPLIB, IMAPLIB e SMTPLIB. Al fine di monitorare le porte di rete e i candidati competitivi del flusso di pacchetti, sono 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 in uso.

In questo articolo, daremo un'occhiata alla biblioteca Pyshark e al monitoramo 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 esso, otterrai un risultato utilizzabile molto rapidamente. Tuttavia, quando si tratta della nitidezza, è necessaria una maggiore conoscenza.

Pyshark può fare molto di più di quanto sembri a prima vista, e sfortunatamente, al momento di questa scrittura, la documentazione esistente non lo copre per intero. Questo lo rende inutilmente difficile e fornisce un buon motivo per apparire più in profondità sotto il cofano.

Su Pyshark

Pyshark [8] è un involucro Python per Tshark [10]. Utilizza semplicemente la sua capacità di esportare i dati XML usando il suo analisi. Tshark stesso è la versione di comando di Wireshark. Sia Tshark che Pyshark dipendono dalla libreria PCAP che cattura effettivamente i pacchetti di rete ed è mantenuto sotto il cofano di TCPDump [7]. Pyshark è sviluppato e mantenuto continuamente da Dan (usa il nome Kiminewt su Twitter).

Al fine di prevenire una possibile confusione, esiste uno strumento simile al suono simile, Apache Spark [11], che è un motore di analisi unificato per l'elaborazione dei dati su larga scala. Il nome Pyspark viene utilizzato per l'interfaccia Python a Apache Spark, di cui non discutiamo 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 chiamati libpcap0.8 e tshark e può essere impostato come segue usando APT-get:

Elenco 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 usando APT-get:

Elenco 2: Installa Python 3 e PIP per Python 3

# Apt-get Installa Python3 Python3-pip

Ora è il momento di aggiungere Pyshark. Sulla base della nostra ricerca Pyshark non è ancora confezionato per alcuna importante distribuzione Linux. L'installazione viene eseguita utilizzando il pacchetto Python Installer PIP3 (PIP per Python 3) come pacchetto a livello di sistema come segue:

Elenco 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 per eseguire gli script di 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 affermazione aggiunge il contenuto del modulo Pyshark allo spazio dei nomi dello script Python:

Elenco 4: Importa il modulo Pyshark

Importa Pyshark

Metodi di cattura dei pacchetti

Out of the Box, Pyshark viene fornito con due diverse modalità con cui offre di raccogliere pacchetti dall'interfaccia di rete osservata. Per una raccolta continua, utilizzare il metodo LiveCapture () e per il salvataggio su un file locale, utilizzare il metodo FileCapture () dal modulo Pyshark. Il risultato è un elenco di pacchetti (Python Iterator Object) che consente di passare attraverso il pacchetto di dati acquisito per pacchetto. Gli elenchi seguenti dimostrano come utilizzare i due metodi.

Elenco 5: Usa Pyshark per catturare dalla prima interfaccia WiFi WLAN0

Importa Pyshark
cattura = pyshark.LiveCapture (interface = 'wlan0')

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

Elenco 6: Usa Pyshark per archiviare i pacchetti catturati in un file locale

Importa Pyshark
cattura = pyshark.FileCapture ('/TMP/NetworkPackages.Cap ')

Esegui elenchi 5 e 6, non avrai ancora alcun output. Il prossimo passo è restringere i pacchetti per essere raccolti in modo più preciso in base ai criteri desiderati.

Selezione di pacchetti

L'oggetto di acquisizione precedentemente introdotto stabilisce una connessione all'interfaccia desiderata. Successivamente, i due metodi sniff () e sniff_continuously () dell'oggetto cattura raccolgono i pacchetti di rete. sniff () ritorna al chiamante non appena sono stati raccolti tutti i pacchetti richiesti. Al contrario, sniff_continuove () fornisce 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 meccanismo 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 timeout dei parametri. La lista 7 dimostra come raccogliere 50 pacchetti di rete, solo, come streaming live, utilizzando il metodo sniff_continuove ().

Elenco 7: raccogli 50 pacchetti di rete da WLAN0

Importa Pyshark
cattura = pyshark.LiveCapture (interface = 'wlan0')
per il pacchetto in cattura.sniff_continuovely (packet_count = 5):
Stampa (pacchetto)

Vari dettagli del pacchetto sono visibili utilizzando la stampa dell'istruzione (pacchetto) (vedi Figura 1).

Figura 1: contenuto del pacchetto

Nell'elenco 7, hai raccolto tutti i tipi di pacchetti di rete indipendentemente dal protocollo o dalla porta di servizio. Pyshark ti consente di eseguire il filtro avanzato, utilizzando il cosiddetto filtro BPF [12]. Listato 8 dimostra come raccogliere 5 pacchetti TCP in arrivo tramite porta 80 e stampare il tipo di pacchetto. Le informazioni sono archiviate nell'attributo pacchetto più alto_layer.

Elenco 8: raccolta di pacchetti TCP, solo

Importa Pyshark
cattura = pyshark.LiveCapture (interface = 'wlan0', bpf_filter = 'tcp porta 80')
catturare.sniff (packet_count = 5)
Stampa (cattura)
per il pacchetto in cattura:
Stampa (pacchetto.più alto_layer)

Salva elenco 8, come file tcp-sniff.Py, ed esegui la sceneggiatura Python. L'output è il seguente:

Elenco 9: l'output di Listato 8

# Python3 TCP-Sniff.Py

TCP
TCP
TCP
OCSP
TCP
#

Unboxing i pacchetti catturati

L'oggetto catturato funziona come una bambola matroska russa - livello per livello, contiene il contenuto del pacchetto di rete corrispondente. Unboxing sembra un po 'come il Natale - non sai mai quali informazioni trovi dentro fino a quando non l'hai aperta. Listato 10 dimostra l'acquisizione di 10 pacchetti di rete e rivelando il suo tipo di protocollo, sia la porta di origine che l'indirizzo di destinazione.

Elenco 10: Mostrare l'origine e la destinazione del pacchetto catturato

Importa Pyshark
tempo di importazione
# Definisci interfaccia
NetworkInterFace = "enp0s3"
# Definisci oggetto Cattura
cattura = pyshark.LiveCapture (Interface = NetworkInterface)
Stampa ("Ascolta su % s" % NetworkInterface)
per il pacchetto in cattura.sniff_continuovely (packet_count = 10):
# output regolato
Tentativo:
# ottieni il timestamp
LocalTime = Time.asctime (tempo.tempo locale (ora.tempo()))
# Ottieni il contenuto dei pacchetti
Protocollo = pacchetto.Transport_layer # Tipo di protocollo
src_addr = pacchetto.IP.SRC # Indirizzo di origine
src_port = packet [Protocollo].porta sorgente di srcport #
dst_addr = pacchetto.IP.Indirizzo di destinazione DST #
dst_port = pacchetto [protocollo].Porta di destinazione DSTPORT #
# 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 pacchetti diversi da TCP, UDP e IPv4
passaggio
stampa (" ")

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


Figura 2: fonte e destinazione per i pacchetti catturati

Conclusione

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

Collegamenti e riferimenti

  • [1] Silver Moon: 18 comandi per monitorare la larghezza di banda di rete su Linux Server, https: // www.binarie.com/linux-comands-monitor-network/
  • [2] Libreria Python Socket, 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/Project/Scapy/
  • [7] TCPDump e libpcap, http: // www.tcpdump.org/
  • [8] Pyshark, sito Web del progetto, http: // kiminewt.github.io/pyshark/
  • [9] Formato file LibpCap, Wireshark Wiki, https: // gitlab.com/wireshark/wireshark/-/wikis/sviluppo/libpapfileformat
  • [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