Maison >développement back-end >Tutoriel Python >Scanner de port de base utilisant Python
Code source cliquez ici
Il s'agit d'un outil de base de scanner de ports qui permet aux utilisateurs d'analyser l'hôte pour trouver les ports ouverts et quel service s'exécute sur le port...
Examinons d'abord le code, puis décomposons-le en morceaux pour l'analyser...
import socket from datetime import datetime import sys import os def usage(): """Prints the usage information for this script.""" usage_info = """ Tool Name: SimplePortScanner Developed by : Bharath Kumar Usage: python3 port_scanner.py [options] Options: -h, --help Show this help message and exit. -t, --target <ip> Specify the target hostname or IP address (required). -p, --port <port> Specify a port (or) range of ports to scan (e.g. -p 80 (or) -p 1-1024). Description: This script performs a port scan on a specified hostname or IP address for a specific port or a range of ports, checking which ports are open. Examples: python3 port_scanner.py -t example.com (or) 192.0.0.1 python3 port_scanner.py -t example.com (or) 192.168.1.1 -p 80 python3 port_scanner.py -t example.com (or) 192.168.1.1 --ports 1-1024 """ print(usage_info) start_time = datetime.now() def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close() def host(target): try: ip = socket.gethostbyname(target) print('_'*51) print("[#] Resolved {} to {}".format(target,ip)) return ip except: print('_'*51) print("[#] Error: Unable to resolve hostname {}".format(target)) sys.exit(1) def check_host_up(ip): ping = os.system("ping {} -c 1 > /dev/null".format(ip)) if ping == 0: print("[#] {} host is up and running".format(ip)) return True else: print("[#] {} host is down".format(ip)) print("Exiting...") exit() return False if __name__ == "__main__": target_ip = None start_port = 1 end_port = 65535 try: for i, arg in enumerate(sys.argv): if arg in ("-t", "--target"): target_ip = sys.argv[i + 1] elif arg in ("-p", "--ports"): port_range = sys.argv[i + 1] if "-" in port_range: start_port, end_port = map(int, port_range.split('-')) else: start_port = end_port = int(port_range) if target_ip is None: print("[#] Error: Target hostname or IP address is required.") usage() sys.exit(1) if start_port is None or end_port is None: print("[#] Error: Port range is required.") usage() sys.exit(1) target_ip = host(target_ip) if not check_host_up(target_ip): sys.exit(1) print(f"[#] Scanning {target_ip} from port {start_port} to {end_port}...") print("[#] Scanning started at: {}".format(start_time)) print('_'*51) for port in range(start_port, end_port + 1): scan_port(target_ip, port) except (IndexError, ValueError): print("[#] Error: Invalid arguments provided.") usage() sys.exit(1) start_time = start_time.now() - start_time print('_'*51) print("Scanning is completed in ",start_time)
Importer un socket : Un moyen pour deux nœuds (serveur, client) de communiquer entre eux.
from datetime import datetime : Est utilisé le temps de calcul consacré à l'analyse.
Import sys : est l'accès aux paramètres spécifiques au système (argv).
Import os: est utilisé pour exécuter la commande ping.
def_usage() : Imprime les informations d'utilisation pour ce script.
start_time = datetime.now() : est utilisé pour obtenir l'heure et la date actuelles afin de calculer le temps passé à numériser.
def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close()
Ce bloc de code définit la fonction scan_port(ip, port) qui vérifie si un port spécifique sur une adresse IP donnée est ouvert à l'aide d'un socket.
Création de socket : socket.socket(socket.AF_INET, socket.SOCK_STREAM) Créez un nouveau socket pour IPv4 à l'aide de TCP.
Timeout : s.settimeout(1) définit le temps de socket sur 1 seconde, si la connexion échoue dans ce délai, elle cessera d'essayer.
Test de connexion :s.connect_ex((ip, port))il essaie de connecter l'adresse IP et le port spécifiques. si cela réussit, le résultat sera 0 ; sinon, ce sera une valeur différente.
Détection de services : socket.getservbyport(int(port))essayez de détecter les services exécutés sur le port spécifié, comme HTTP pour le port 80.
Gestion des erreurs : En cas d'erreur (par exemple, aucun service sur le port), le bloc except définit le service sur "Aucun".
Sortie : Si le port est ouvert (résultat == 0), il imprime le numéro de port, l'état (« Ouvert ») et le nom du service.
Fermeture de connexion : s.close() ferme le socket pour libérer des ressources.
def host(target): try: ip = socket.gethostbyname(target) print('_'*51) print("[#] Resolved {} to {}".format(target,ip)) return ip except: print('_'*51) print("[#] Error: Unable to resolve hostname {}".format(target)) sys.exit(1)
Ce bloc de code définit la fonction host(target) qui résout une cible donnée (un nom d'hôte) en son adresse IP correspondante à l'aide de socket.gethostname()
def check_host_up(ip): ping = os.system("ping {} -c 1 > /dev/null".format(ip)) if ping == 0: print("[#] {} host is up and running".format(ip)) return True else: print("[#] {} host is down".format(ip)) print("Exiting...") exit() return False
Cette fonction check_host_up(ip) qui vérifie si un port spécifique sur une adresse IP cible donnée est actif ou inactif en utilisant la méthode ping os.system() pour l'identifier.
if __name__ == "__main__": target_ip = None start_port = 1 end_port = 65535 try: for i, arg in enumerate(sys.argv): if arg in ("-t", "--target"): target_ip = sys.argv[i + 1] elif arg in ("-p", "--ports"): port_range = sys.argv[i + 1] if "-" in port_range: start_port, end_port = map(int, port_range.split('-')) else: start_port = end_port = int(port_range)
Le tableau sys.argv contient la liste des arguments passés au script. Nous parcourons ces arguments pour vérifier l'adresse IP cible (-t ou --target) et la plage de ports (-p ou --ports).
L'adresse IP/le nom d'hôte cible est stocké dans target_ip.
La plage de ports est analysée et divisée en start_port et end_port. Si aucune plage n'est spécifiée, la valeur par défaut est d'analyser tous les ports de 1 à 65535.
import socket from datetime import datetime import sys import os def usage(): """Prints the usage information for this script.""" usage_info = """ Tool Name: SimplePortScanner Developed by : Bharath Kumar Usage: python3 port_scanner.py [options] Options: -h, --help Show this help message and exit. -t, --target <ip> Specify the target hostname or IP address (required). -p, --port <port> Specify a port (or) range of ports to scan (e.g. -p 80 (or) -p 1-1024). Description: This script performs a port scan on a specified hostname or IP address for a specific port or a range of ports, checking which ports are open. Examples: python3 port_scanner.py -t example.com (or) 192.0.0.1 python3 port_scanner.py -t example.com (or) 192.168.1.1 -p 80 python3 port_scanner.py -t example.com (or) 192.168.1.1 --ports 1-1024 """ print(usage_info) start_time = datetime.now() def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close() def host(target): try: ip = socket.gethostbyname(target) print('_'*51) print("[#] Resolved {} to {}".format(target,ip)) return ip except: print('_'*51) print("[#] Error: Unable to resolve hostname {}".format(target)) sys.exit(1) def check_host_up(ip): ping = os.system("ping {} -c 1 > /dev/null".format(ip)) if ping == 0: print("[#] {} host is up and running".format(ip)) return True else: print("[#] {} host is down".format(ip)) print("Exiting...") exit() return False if __name__ == "__main__": target_ip = None start_port = 1 end_port = 65535 try: for i, arg in enumerate(sys.argv): if arg in ("-t", "--target"): target_ip = sys.argv[i + 1] elif arg in ("-p", "--ports"): port_range = sys.argv[i + 1] if "-" in port_range: start_port, end_port = map(int, port_range.split('-')) else: start_port = end_port = int(port_range) if target_ip is None: print("[#] Error: Target hostname or IP address is required.") usage() sys.exit(1) if start_port is None or end_port is None: print("[#] Error: Port range is required.") usage() sys.exit(1) target_ip = host(target_ip) if not check_host_up(target_ip): sys.exit(1) print(f"[#] Scanning {target_ip} from port {start_port} to {end_port}...") print("[#] Scanning started at: {}".format(start_time)) print('_'*51) for port in range(start_port, end_port + 1): scan_port(target_ip, port) except (IndexError, ValueError): print("[#] Error: Invalid arguments provided.") usage() sys.exit(1) start_time = start_time.now() - start_time print('_'*51) print("Scanning is completed in ",start_time)
Une fois que nous avons une adresse IP valide, nous devons vérifier si l'hôte est joignable. La fonction host(target_ip) résout un nom d'hôte en son adresse IP et check_host_up(target_ip) vérifie si l'hôte est en ligne.
def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close()
Le cœur de la fonctionnalité d'analyse des ports se déroule à l'intérieur de la boucle :
Cette boucle parcourt la plage de ports spécifiée, et pour chaque port, la fonction scan_port(target_ip, port) sonde le port pour vérifier s'il est ouvert ou fermé.
En suivant ce guide, vous avez appris à créer un scanner de port Python simple qui accepte les arguments de ligne de commande, valide les entrées et analyse une plage de ports sur une cible donnée. Bien qu'il s'agisse d'une implémentation de base, elle jette les bases de fonctionnalités plus avancées telles que le threading ou la détection de services.
N'hésitez pas à adapter et développer ce script en fonction de vos besoins spécifiques. Bonne numérisation !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!