Construire votre propre moniteur de réseau avec Pyshark

Construire votre propre moniteur de réseau avec Pyshark

Outils existants

De nombreux outils d'analyse de réseau existent depuis un certain temps. Sous Linux, par exemple, ce sont Wireshark, TCPDump, Nload, IfTop, Iptraf, Nethogs, Bmon, TCPTrack ainsi que le compteur de vitesse et EtterCap. Pour une description détaillée d'eux, vous pouvez jeter un œil à la comparaison de Silver Moon [1].

Alors, pourquoi ne pas utiliser un outil existant et écrire votre propre, plutôt? Les raisons que je vois sont une meilleure compréhension des protocoles de réseau TCP / IP, d'apprendre à coder correctement ou d'implémenter uniquement la fonctionnalité spécifique dont vous avez besoin pour votre cas d'utilisation car les outils existants ne vous donnent pas ce dont vous avez réellement besoin. De plus, les améliorations de vitesse et de charge à votre application / système peuvent également jouer un rôle qui vous motive à vous déplacer davantage dans cette direction.

Dans la nature, il existe de nombreuses bibliothèques Python pour le traitement et l'analyse du réseau. Pour la programmation de bas niveau, la bibliothèque de socket [2] est la clé. Les bibliothèques basées sur le protocole de haut niveau sont HTTPLIB, FTPLIB, IMAPLIB et SMTPLIB. Afin de surveiller les ports du réseau et les candidats compétitifs du flux de paquets, sont des python-nmap [3], dpkt [4] et pyshark [5]. Pour la surveillance et la modification du flux de paquets, la bibliothèque scapiscale [6] est largement utilisée.

Dans cet article, nous allons jeter un œil à la bibliothèque Pyshark et à surveiller quels packages arrivent à une interface réseau spécifique. Comme vous le verrez ci-dessous, travailler avec Pyshark est simple. La documentation sur le site Web du projet vous aidera pour les premières étapes - avec elle, vous obtiendrez un résultat utilisable très rapidement. Cependant, en ce qui concerne le Nitty-Grutty, plus de connaissances sont nécessaires.

Pyshark peut faire beaucoup plus qu'il ne semble à première vue, et malheureusement, au moment de la rédaction de cet article, la documentation existante ne couvre pas cela en totalité. Cela le rend inutilement difficile et offre une bonne raison de regarder plus profondément sous le capot.

À propos de Pyshark

Pyshark [8] est un emballage Python pour Tshark [10]. Il utilise simplement sa capacité pour exporter des données XML à l'aide de son analyse. Tshark lui-même est la version en ligne de commande de Wireshark. Tshark et Pyshark dépendent de la bibliothèque PCAP qui capture réellement les packages réseau et est maintenu sous le capot de TCPDump [7]. Pyshark est développé et maintenu en permanence par Dan (il utilise le nom Kiminewt sur Twitter).

Afin d'éviter une éventuelle confusion, il existe un outil à consonance similaire, Apache Spark [11], qui est un moteur d'analyse unifié pour le traitement des données à grande échelle. Le nom Pyspark est utilisé pour l'interface Python pour Apache Spark, dont nous ne discutons pas ici.

Installation de Pyshark

Pyshark nécessite l'installation de la bibliothèque PCAP et de Tshark. Les packages correspondants pour Debian GNU / Linux 10 et Ubuntu sont nommés libpcap0.8 et Tshark et peut être configuré comme suit en utilisant APT-GET:

Listing 1: Installation de la bibliothèque PCAP et de Tshark

# PIP3 Installer Python-Pyshark

S'il n'est pas encore installé, Python3 et PIP doivent également être ajoutés. Les packages correspondants pour Debian GNU / Linux 10 et Ubuntu sont nommés Python3 et Python3-Pip et peuvent être installés comme suit à l'aide d'APT-get:

Listing 2: Installez Python 3 et PIP pour Python 3

# apt-get install python3 python3-pip

Maintenant, il est temps d'ajouter Pyshark. Sur la base de nos recherches, Pyshark n'est pas encore emballé pour aucune distribution majeure Linux. L'installation de celui-ci est effectuée en utilisant le programme d'installation de package Python PIP3 (PIP pour Python 3) comme package à l'échelle du système comme suit:

Listing 3: Installez Pyshark en utilisant PIP

# PIP3 Installer Python-Pyshark

Maintenant, Pyshark est prêt à être utilisé dans les scripts Python sur votre système Linux. Veuillez noter pour exécuter les scripts Python ci-dessous en tant qu'utilisateur administratif, par exemple, en utilisant Sudo, car la bibliothèque PCAP ne vous permet pas de rechercher des packages en tant qu'utilisateur ordinaire.

L'instruction suivante ajoute le contenu du module Pyshark à l'espace de noms de votre script Python:

Listing 4: Importez le module Pyshark

importer pyshark

Méthodes de capture des packages

Hors de la boîte, Pyshark est livré avec deux modes différents avec lesquels il propose de collecter des paquets à partir de l'interface réseau observée. Pour une collecte continue, utilisez la méthode liveCapture () et pour enregistrer un fichier local, utilisez la méthode FileCapture () du module Pyshark. Le résultat est une liste de packages (objet Python Iterator) qui vous permet de passer par le package de données capturé par package. Les annonces ci-dessous montrent comment utiliser les deux méthodes.

Listing 5: Utilisez Pyshark pour capturer à partir de la première interface WiFi WLAN0

importer pyshark
capture = pyshark.LiveCapture (interface = 'wlan0')

Avec les déclarations précédentes, les packages réseau capturés sont conservés en mémoire. La mémoire disponible peut cependant être limitée, le stockage des packages capturés dans un fichier local est une alternative. Dans le format de fichier PCAP [9] est le format de fichier PCAP [9]. Cela vous permet de traiter et d'interpréter les données capturées par d'autres outils qui sont également liés à la bibliothèque PCAP.

Listing 6: Utilisez Pyshark pour stocker les packages capturés dans un fichier local

importer pyshark
capture = pyshark.FileCapture ('/ tmp / NetworkPackages.casquette')

Exécution des listes 5 et 6, vous n'aurez pas encore de sortie. L'étape suivante consiste à réduire les packages à collecter plus précisément en fonction de vos critères souhaités.

Sélection de paquets

L'objet Capture précédemment introduit établit une connexion à l'interface souhaitée. Ensuite, les deux méthodes sniff () et sniff_continuly () de l'objet Capture Collectez les paquets de réseau. sniff () revient à l'appelant dès que tous les paquets demandés ont été collectés. En revanche, sniff_continuly () délivre un seul paquet à l'appelant dès qu'il a été collecté. Cela permet un flux en direct du trafic réseau.

En outre, les deux méthodes vous permettent de spécifier diverses limites et mécanismes de filtrage des packages, par exemple, le nombre de packages à l'aide du paramètre Packet_Count, et la période pendant laquelle les packages doivent être collectés en utilisant le délai d'expiration du paramètre. Listing 7 montre comment collecter 50 packages réseau, seulement comme un flux en direct, en utilisant la méthode sniff_continuly ().

Listing 7: Collectez 50 packages réseau à partir de WLAN0

importer pyshark
capture = pyshark.LiveCapture (interface = 'wlan0')
pour le paquet en capture.sniff_continuly (packet_count = 5):
Imprimer (paquet)

Divers détails des paquets sont visibles à l'aide de l'impression (paquet) (voir figure 1).

Figure 1: Contenu du package

Dans Listing 7, vous avez collecté toutes sortes de paquets de réseau, quel que soit le protocole ou le port de service. Pyshark vous permet de faire un filtrage avancé, en utilisant le soi-disant filtre BPF [12]. Listing 8 montre comment collecter 5 packages TCP à venir via le port 80 et l'impression du type de paquet. Les informations sont stockées dans l'attribut de paquet Highest_Layer.

Listing 8: collection de packages TCP, uniquement

importer pyshark
capture = pyshark.LiveCapture (interface = 'wlan0', bpf_filter = 'tcp port 80')
capture.sniff (packet_count = 5)
Imprimer (capture)
Pour le paquet en capture:
imprimer (paquet.Highst_layer)

Enregistrer la liste 8, comme le fichier TCP-Sniff.py, et exécutez le script python. La sortie est la suivante:

Listing 9: la sortie de la liste 8

# Python3 TCP-Sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Débrouiller les paquets capturés

L'objet capturé fonctionne comme une poupée Matroska russe - couche par couche, il contient le contenu du paquet réseau correspondant. Uncounding se sent un peu comme Noël - vous ne savez jamais quelles informations vous trouvez à l'intérieur jusqu'à ce que vous l'oubliez. Listing 10 démontre la capture de 10 paquets de réseau et la révélation de son type de protocole, à la fois le port source et de destination et l'adresse.

Listing 10: Affichage de la source et de la destination du paquet capturé

importer pyshark
heure d'importation
# Définir l'interface
NetworkInterface = "ENP0S3"
# définir l'objet Capture
capture = pyshark.LiveCapture (Interface = NetworkInterface)
Imprimer ("écouter sur% s"% NetworkInterface)
pour le paquet en capture.sniff_continuly (packet_count = 10):
# Sortie ajustée
essayer:
# Obtenez l'horodatage
Temps local = temps.Asctime (temps.Time local (temps.temps()))
# Obtenez du contenu de paquets
protocole = paquet.Transport_layer # Type de protocole
src_addr = paquet.IP.SRC # Adresse source
src_port = paquet [protocole].Port Srcport # Source
dst_addr = paquet.IP.Adresse de destination DST #
dst_port = paquet [protocole].Port de destination DSTPORT #
# Informations sur les paquets de sortie
print ("% s ip% s:% s% s:% s (% s)"% (localtime, src_addr, src_port, dst_addr, dst_port, protocole)))
sauf attributError comme e:
# ignorer les paquets autres que TCP, UDP et IPv4
passer
imprimer (" ")

Le script génère une sortie, comme le montre la figure 2, une seule ligne par paquet reçu. Chaque ligne commence par un horodatage, suivi de l'adresse IP source et du port, puis de l'adresse IP et du port de destination, et enfin, le type de protocole réseau.


Figure 2: Source et destination pour les packages capturés

Conclusion

La construction de votre propre scanner de réseau n'a jamais été aussi facile que cela. Basé sur les fondements de Wireshark, Pyshark vous propose un cadre complet et stable pour surveiller les interfaces réseau de votre système comme vous en avez besoin.

Liens et références

  • [1] Silver Moon: 18 commandes pour surveiller la bande passante du réseau sur le serveur Linux, https: // www.binaire.com / linux commands-monitor-network /
  • [2] Python Socket Library, https: // docs.python.org / 3 / bibliothèque / socket.html
  • [3] Python-nmap, https: // pyPi.org / project / python3-nmap /
  • [4] dpkt, https: // pyPi.org / project / dpkt /
  • [5] Pyshark, https: // pypi.org / project / pyshark /
  • [6] Scapy, https: // pYPI.Org / Project / Scapy /
  • [7] Tcpdump et libpcap, http: // www.tcpdump.org /
  • [8] Pyshark, site Web du projet, http: // kiminewt.github.io / pyshark /
  • [9] Format de fichier libpcap, Wireshark Wiki, https: // gitlab.com / wireshark / wireshark / - / wikis / développement / libpcapfileformat
  • [10] Tshark, https: // www.Wireshark.org / docs / man-pages / tshark.html
  • [11] Apache Spark, https: // spark.apache.org /
  • [12] Filtre BPF, https: // wiki.Wireshark.org / capturefilters