Comment capturer des paquets en utilisant Python
En général, nous utilisons l'outil Wireshark pour capturer les paquets réseau. Mais c'est un processus manuel. Dans certaines situations, nous pouvons avoir besoin de capturer les trames réseau à l'aide d'un script Python sous Linux. Dans cet article, nous allons apprendre à utiliser le script Python pour capturer les trames sur une interface Ethernet ou WLAN.
Comment préparer la configuration Linux
Il y a des prérequis pour exécuter un script Python afin de capturer les images en direct sur Linux.
1. Installez Python 3.7
Nous avons besoin de Python 3.7 pour exécuter le script de capture en direct. Par exemple : Ubuntu 18.04/20.04 n'a pas Python 3.7 par défaut. Donc, nous devons l'installer en suivant les étapes suivantes :
sudo apt update
sudo apt install python3.7Si cela ne fonctionne pas, nous devons vérifier sur Internet pour résoudre le problème ou utiliser les commandes suivantes :
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
tar -xf Python-3.7.4.tgz
cd Python-3.7.4
./configure --enable-optimizations
sudo make
sudo make install2. Installer le module PyShark pour Python 3.7
Pour effectuer la capture en direct en utilisant Python, nous devons installer le module PyShark pour Python 3.7. Sinon, nous obtenons l'erreur suivante :
Traceback (most recent call last):
File "capture.py", line 1, in <module>
import
ImportError: No module named 'pyshark'Voici l'étape pour installer PyShark :
python3.7 -m pip install pysharkDans le cas où nous recevons un message de mise à jour de pip, nous pouvons mettre à jour pip3 en utilisant la commande suivante :
sudo pip3 install --upgrade pip3. Installer TShark
Installez tshark en utilisant la commande suivante :
sudo apt install tsharkScript Python pour capturer des paquets en direct
Voici le script Python pour effectuer une capture en direct sur l'interface fournie :
import pyshark
import os
#********USER ACTION REQUIRED*********#
Please change interfaceId/name for below line as per your system.
INTERFACE_NAME="wlp2s0"
capture_size = 0
def capture_packet(time):
file = "capture.pcapng"
output = open(file, "w")
capture = pyshark.LiveCapture(interface=INTERFACE_NAME, output_file=file)
capture.set_debug()
capture.sniff(timeout=time)
output.close()
return os.path.getsize(file)
#Step1 -> Entry to code
print("****Hope you have added correct interface name into this python file****\n")
time = int(input("How long(sec) to capture traffic? [Value should be more than 20 sec]\n"))
if time < 20:
print("Timeout must be over 20 seconds.\n")
else:
print("\nCapture time is: ", time, "sec for each interface.\n\n ....Please wait....")
#Step2 -> Functions
capture_size = capture_packet(time+10) #2. Start capturing packets on provided interface
if capture_size >= 1073741824:
print("|---Total Packet size captured is => ",'{0:.2f}'.format(capture_size/(1024*1024*1024)), "GB ---|")
elif capture_size >= 1048576:
print("|---Total Packet size captured is => ",'{0:.2f}'.format(capture_size/(1024*1024)), "MB ---|")
elif capture_size >= 1024:
print("|---Total Packet size captured is => ",'{0:.2f}'.format(capture_size/1024), "KB ---|")
else:
print("|---Total Packet size captured is => ",capture_size, "bytes ---|")Ici, nous capturons en direct en utilisant la ligne suivante dans le script :
capture=pyshark.LiveCapture(interface=INTERFACE_NAME, output_file= fichier)
Entrée pour le script Python :
1) Nous devons entrer le nom de l'interface dans la ligne suivante :
INTERFACE_NAME="wlp2s0"2) Après avoir exécuté le script en utilisant la commande suivante, l'utilisateur sera invité à indiquer combien de temps il souhaite effectuer la capture en direct.
sudo python3.7 capture_using_python.pyIci, l'entrée est requise en secondes supérieures à 20.
Sortie pour le script Python :
Une fois que le script Python est exécuté :
1) Un fichier de capture est généré en sortie dans le même répertoire où se trouve le script Python. Si nous ouvrons ce fichier de capture, nous verrons les trames réseau. Exécutons le script et voyons.
2) La taille du fichier de capture de sortie est affichée dans le terminal.
Exécutez le script :
sudo python3.7 capture_using_python.py
****Hope you have added correct interface name into this python file****
How long(sec) to capture traffic? [Value should be more than 20 sec]
30
Capture time is: 30 sec for each interface.
....Please wait....Sortie :
2023-05-09 01:34:28,004 - LiveCapture - DEBUG - Creating Dumpcap subprocess with parameters: /usr/bin/dumpcap -q -i wlp2s0 -w -
2023-05-09 01:34:28,023 - LiveCapture - DEBUG - Dumpcap subprocess (pid 2902) created
2023-05-09 01:34:29,517 - LiveCapture - DEBUG - Creating TShark subprocess with parameters: /usr/bin/tshark -l -n -T pdml -w capture .pcapng -i -
2023-05-09 01:34:29,519 - LiveCapture - DEBUG - Executable: /usr/bin/tshark
2023-05-09 01:34:29,537 - LiveCapture - DEBUG - Capturing on 'wlp2s0'
2023-05-09 01:34:29,539 - LiveCapture - DEBUG - File: -
2023-05-09 01:34:29,543 - LiveCapture - DEBUG - TShark subprocess (pid 2916) created
2023-05-09 01:34:29,544 - LiveCapture - DEBUG - Starting to go through packets
2023-05-09 01:34:29,641 - LiveCapture - DEBUG - Running as user "root" and group "root". This could be dangerous.
2023-05-09 01:34:30,989 - LiveCapture - DEBUG - Capturing on 'Standard input'
2023-05-09 01:35:06,793 - LiveCapture - DEBUG - Cleanup Subprocess (pid 2902)
2023-05-09 01:35:06,852 - LiveCapture - DEBUG - Cleanup Subprocess (pid 2916)
|---Total Packet size captured is => 3.05 KB ---|Conclusion
Dans cet article, nous avons appris comment capturer les paquets réseau en direct sous Linux en utilisant un script Python. Cela nous aide à résoudre de nombreux travaux manuels. De plus, nous pouvons explorer de nombreuses autres options du package PyShark et modifier le script selon nos besoins.