Python

Construire votre propre moniteur réseau avec PyShark

Construire votre propre moniteur 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 speedometer et ettercap. Pour une description détaillée d'entre eux, vous pouvez jeter un oeil à la comparaison de Silver Moon [1].

Alors, pourquoi ne pas utiliser un outil existant et écrire le vôtre à la place? Les raisons que je vois sont une meilleure compréhension des protocoles réseau TCP/IP, l'apprentissage de la programmation correcte ou la mise en œuvre de 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 la vitesse et de la charge de votre application/système peuvent également jouer un rôle qui vous motive à aller davantage dans cette direction.

Dans la nature, il existe plusieurs bibliothèques Python pour le traitement et l'analyse de réseau. Pour la programmation de bas niveau, la bibliothèque de sockets [2] est la clé. Les bibliothèques basées sur des protocoles de haut niveau sont httplib, ftplib, imaplib et smtplib. Afin de surveiller les ports réseau et les candidats compétitifs du flux de paquets, python-nmap [3], dpkt [4] et PyShark [5] sont utilisés. Pour surveiller et modifier le flux de paquets, la bibliothèque scapy [6] est largement utilisée.

Dans cet article, nous examinerons la bibliothèque PyShark et surveillerons les packages qui arrivent sur 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 premiers pas - avec elle, vous obtiendrez un résultat utilisable très rapidement. Cependant, en ce qui concerne les détails, plus de connaissances sont nécessaires.

PyShark peut faire beaucoup plus qu'il n'y paraît à première vue, et malheureusement, au moment d'écrire ces lignes, la documentation existante ne couvre pas cela dans son intégralité. Cela rend la tâche inutilement difficile et fournit une bonne raison de regarder plus profondément sous le capot.

À propos de PyShark

PyShark [8] est un wrapper Python pour Tshark [10]. Il utilise simplement sa capacité à exporter des données XML en utilisant son analyse. Tshark lui-même est la version en ligne de commande de Wireshark. Tshark et PyShark dépendent tous deux 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 toute confusion possible, il existe un outil au son similaire, Apache Spark [11], qui est un moteur d'analyse unifié pour le traitement de données à grande échelle. Le nom PySpark est utilisé pour l'interface Python vers Apache Spark, dont nous ne parlons 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 à l'aide d'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 en utilisant apt-get :

Liste 2 : Installez Python 3 et PIP pour Python 3

# apt-get install python3 python3-pip

Il est maintenant temps d'ajouter PyShark. D'après nos recherches, PyShark n'est pas encore emballé pour une distribution Linux majeure. Son installation est effectuée à l'aide du programme d'installation du package Python pip3 (pip pour Python 3) en tant que package à l'échelle du système, comme suit :

Liste 3 : Installer PyShark à l'aide de PIP

# pip3 installer python-pyshark

Maintenant, PyShark est prêt à être utilisé dans les scripts Python sur votre système Linux. Veuillez noter d'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 régulier.

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

Listing 4 : importer le module PyShark

importer du pyshark

Méthodes de capture des packages

Prêt à l'emploi, 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 la collecte continue, utilisez la méthode LiveCapture(), et pour l'enregistrement dans un fichier local, utilisez la méthode FileCapture() du module PyShark. Le résultat est une liste de packages (objet itérateur Python) qui vous permet de parcourir les données capturées package par package. Les listes ci-dessous montrent comment utiliser les deux méthodes.

Listing 5: Utilisez PyShark pour capturer à partir de la première interface Wifi wlan0

importer du pyshark
capture = pyshark.Capture en direct(interface='wlan0')

Avec les instructions précédentes, les packages réseau capturés sont conservés en mémoire. La mémoire disponible peut être limitée, cependant, le stockage des packages capturés dans un fichier local est une alternative. Le format de fichier Pcap est utilisé [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 du pyshark
capture = pyshark.FileCapture('/tmp/networkpackages.casquette')

En exécutant les listes 5 et 6, vous n'aurez pas encore de sortie. L'étape suivante consiste à affiner les colis à collecter plus précisément en fonction de vos critères souhaités.

Sélection de paquets

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

De plus, les deux méthodes vous permettent de spécifier diverses limitations 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 à l'aide du paramètre timeout. Le listing 7 montre comment collecter 50 packages réseau, uniquement, en tant que flux en direct, en utilisant la méthode sniff_continuously ().

Listing 7 : Collectez 50 packages réseau de wlan0

importer du pyshark
capture = pyshark.Capture en direct(interface='wlan0')
pour le paquet en capture.sniff_continuously(packet_count=5) :
imprimer (paquet)

Divers détails du paquet sont visibles à l'aide de la déclaration print(packet) (voir Figure 1).

Figure 1 : contenu de l'emballage

Dans la liste 7, vous avez collecté toutes sortes de paquets réseau, quel que soit le protocole ou le port de service. PyShark vous permet d'effectuer un filtrage avancé, en utilisant le filtre BPF [12]. Le listing 8 montre comment collecter 5 packages TCP entrant via le port 80 et imprimant le type de paquet. Les informations sont stockées dans l'attribut de paquet high_layer.

Listing 8 : Collecte des packages TCP, uniquement

importer du pyshark
capture = pyshark.LiveCapture(interface='wlan0', bpf_filter='tcp port 80')
Capturer.renifler(packet_count=5)
imprimer (capturer)
pour le paquet en capture :
imprimer (paquet.couche_la plus élevée)

Enregistrer la liste 8, en tant que fichier tcp-sniff.py et exécutez le script Python. La sortie est la suivante :

Listing 9 : Le résultat du Listing 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Déballage des 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. Le déballage ressemble un peu à Noël - vous ne savez jamais quelles informations vous trouvez à l'intérieur jusqu'à ce que vous les ouvriez. La liste 10 montre la capture de 10 paquets réseau et la révélation de son type de protocole, à la fois le port et l'adresse source et de destination.

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

importer du pyshark
heure d'importation
# définir l'interface
networkInterface = "enp0s3"
# définir l'objet de capture
capture = pyshark.LiveCapture(interface=interface réseau)
print("écoute sur %s" % networkInterface)
pour le paquet en capture.sniff_continuously(packet_count=10) :
# sortie ajustée
essayer:
# obtenir l'horodatage
heure locale = heure.asctime(temps.heure locale (heure.temps()))
# obtenir le contenu du paquet
protocole = paquet.transport_layer # type de protocole
src_addr = paquet.ip.src # adresse source
src_port = paquet[protocole].srcport # port source
dst_addr = paquet.ip.dst # adresse de destination
dst_port = paquet[protocole].dstport # port de destination
# informations sur le paquet de sortie
imprimer ("%s IP %s:%s <-> %s:%s (%s)" % (heure locale, src_addr, src_port, dst_addr, dst_port, protocole))
sauf AttributeError en tant que e :
# ignore les paquets autres que TCP, UDP et IPv4
passe
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 et du port source, puis de l'adresse IP et du port de destination et, enfin, du type de protocole réseau.


Figure 2 : Source et destination des packages capturés

Conclusion

Construire votre propre scanner réseau n'a jamais été aussi simple que cela. Basé sur les fondations de Wireshark, PyShark vous offre un cadre complet et stable pour surveiller les interfaces réseau de votre système comme vous le souhaitez.

Liens et références

  • [1] Silver Moon : 18 commandes pour surveiller la bande passante du réseau sur le serveur Linux, https://www.marées binaires.com/linux-commands-monitor-network/
  • [2] Bibliothèque de sockets Python, https://docs.python.org/3/library/socket.html
  • [3] python-nmap, https://pypi.org/project/python3-nmap/
  • [4] dpkt, https://pypi.org/projet/dpkt/
  • [5] PyShark, https://pypi.org/projet/pyshark/
  • [6] effrayant, https://pypi.org/projet/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, Wiki Wireshark, https://gitlab.com/wireshark/wireshark/-/wikis/Development/LibpcapFileFormat
  • [10] Tshark, https://www.fil de fer.org/docs/man-pages/tshark.html
  • [11] Apache Spark, https://spark.apache.org/
  • [12] Filtre BPF, https://wiki.fil de fer.org/CaptureFilters
Vulkan pour les utilisateurs Linux
Avec chaque nouvelle génération de cartes graphiques, nous voyons les développeurs de jeux repousser les limites de la fidélité graphique et se rappro...
OpenTTD contre Simutrans
Créer votre propre simulation de transport peut être amusant, relaxant et extrêmement attrayant. C'est pourquoi vous devez vous assurer que vous essay...
Tutoriel OpenTTD
OpenTTD est l'un des jeux de simulation d'entreprise les plus populaires. Dans ce jeu, vous devez créer une merveilleuse entreprise de transport. Cepe...