Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Hacking et Forensic
  3. Le réseau
Extrait - Hacking et Forensic Développez vos propres outils en Python (2ième édition)
Extraits du livre
Hacking et Forensic Développez vos propres outils en Python (2ième édition)
1 avis
Revenir à la page d'achat du livre

Le réseau

Introduction

Un ordinateur sans connexion à Internet n’est plus vraiment utile de nos jours, sauf dans de rares cas. Faites l’expérience de vous asseoir devant votre machine et de le déconnecter du Net : plus de recherche sur Google ou autre, plus de chat avec les amis, plus de Facebook...

Tout passe donc par une connexion et donc par les sockets.

Nous en trouvons comme définition sur Wikipédia :

« Dans le contexte des logiciels, on peut le traduire par « connecteur réseau ».

Apparu dans les systèmes UNIX, un socket est un élément logiciel qui est aujourd’hui répandu dans la plupart des systèmes d’exploitation. Il s’agit d’une interface logicielle avec les services du système d’exploitation, grâce à laquelle un développeur exploitera facilement et de manière uniforme les services d’un protocole réseau.

Il lui sera ainsi par exemple aisé d’établir une session TCP, puis de recevoir et d’expédier des données grâce à elle. Cela simplifie sa tâche car cette couche logicielle, de laquelle il requiert des services en appelant des fonctions, masque le travail nécessaire de gestion du réseau, pris en charge par le système. Le terme socket désigne en pratique chaque variable employée dans un programme...

Les sockets

1. Création d’un socket

La bibliothèque socket de Python va nous permettre d’accéder aux services voulus. S’il y a une bibliothèque réseau à connaître et à savoir utiliser, c’est bien celle-ci.

Nous verrons bien sûr par la suite d’autres bibliothèques spécifiques aux services cités en introduction, mais avec la bibliothèque socket, nous pourrons tout faire. Cela demandera quand même de connaître la norme utilisée pour les communications TCP, UDP et des différents services. Pour cela, nous vous laissons le soin d’aller lire les RFC correspondantes.

Création d’un socket et connexion à un site web : chap2_exo1.py


import socket 
print 'creation du socket ...' 
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
print 'socket fait' 
print ''connexion a l'hote distant' ' 
s.connect(('www.eni.fr',80)) 
print 'connexion faite' 
 

Nous n’avons pas ici de grandes difficultés quant à la compréhension de ce code.

La bibliothèque socket est importée dès le début du script.

Nous créons ensuite l’objet socket en lui précisant grâce à AF_INET que nous utilisons IPv4 et en lui désignant le protocole (SOCK_STREAM pour TCP et SOCK_DGRAM pour UDP).

Pour nous connecter à l’hôte distant (connect), nous devrons utiliser ce que l’on appelle un tuple, une double parenthèse, contenant l’adresse IP et le port.

Il ne se passera rien à l’exécution de ce script puisque nous établissons une connexion sans échanger de données mais nous serons bien connectés à l’hôte distant.

Pour gérer les accents avec Python, nous devons ajouter, au début du code source : # -*- coding: iso-8859-1 -*-. iso-8859-1 peut être remplacé par un autre encodage suivant celui utilisé par le système d’exploitation (utf-8, windows-1252, cp-1252). Pour un souci d’uniformité, les accents ne seront pas intégrés dans les scripts.

2. Échange de données

Quand la connexion est établie, nous pouvons envoyer et recevoir des données. 

La communication...

Création d’un serveur

1. Introduction

Il est nécessaire de passer par quatre étapes pour créer un serveur :

  • Créer le socket.

  • Donner les options au socket (optionnel).

  • Lier à un port.

  • Écouter après des connexions.

chap2_exo7.py


host=''  
port=1234  
s=socket.socket(socket.AF_INET,SOCK_STREAM)  
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  
s.bind((host,port))  
s.listen(5) 
 

Si nous ne tenons pas compte dans le code précédent des deux lignes host et port, nous retrouvons nos quatre étapes de création du serveur, une étape par ligne.

Nous ne reviendrons pas sur la création de l’objet socket qui a déjà été vue précédemment.

La ligne suivante est optionnelle et les options par défaut conviennent pour la plupart des programmes, mais voyons quand même les différentes possibilités.


s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
 

Les options

setsockopt(level,optname,value)

level : .SOL_SOCKET : on travaille avec les sockets.

optname :

  • SO_BINDTODEVICE : le socket est valide pour une carte réseau spécifiée dans Value (nom de la carte).

  • SO_BROADCAST : permet la transmission et réception de paquets de broadcast. Value : booléen.

  • SO_DONTROUTE : interdit aux paquets de passer à travers les routeurs et les passerelles. Value : booléen.

  • SO_KEEPALIVE : autorise la transmission des paquets dit ’’keep­alive’’. Ces paquets permettent de savoir à chaque nœud que la connexion est toujours active quand aucune donnée n’est envoyée. Value : booléen.

  • SO_REUSEADDR : le port utilisé est immédiatement réutilisable après que le socket est fermé. Value : booléen.

La ligne suivante va permettre de lier (bind) l’adresse IP avec le port défini.


s.bind((host,port))
 

Nous n’avons toujours pas de port ouvert pour l’instant sur la machine ; dans notre exemple, le port 1234 sera lié à la carte réseau de l’hôte (host= ’ ’).

Nous pourrons définir pour host l’adresse IP de la carte souhaitée si nous avons plusieurs cartes réseau.


host = socket.gethostbyname(socket.gethostname())
 

Nous avons sélectionné...

DNS : Domain Name Server

1. Introduction

Le DNS est un serveur qui va nous permettre de transformer une adresse web (www.eni.fr) en une adresse IP (90.83.78.130).

Sans ce serveur, nous serions obligés de connaître par cœur les adresses IP de tous les sites que nous désirerions visiter.

a. Que signifie DNS ?

DNS signifie plusieurs choses :

  • Domain Name System : l’ensemble des organismes qui gèrent les noms de domaine.

  • Domain Name Service : le protocole qui permet d’échanger des informations à propos des domaines.

  • Domain Name Server : un ordinateur sur lequel fonctionne un logiciel serveur qui comprend le protocole DNS et qui peut répondre à des questions concernant un domaine.

Que se passe-t-il quand nous tapons http://www.eni.fr/index.html ?

  • Votre ordinateur demande aux serveurs DNS de votre fournisseur d’accès les adresses IP des serveurs DNS du domaine "eni.fr".

  • Votre ordinateur se connecte à un serveur DNS pour demander l’adresse IP de la machine "www".

  • Votre navigateur va se connecter à cette adresse IP sur le port 80 et demander la page "index.html" (avec le protocole HTTP).

Ce scénario n’est pas toujours vrai : la majorité des serveurs DNS et des systèmes d’exploitation vont faire office de cache et gardent en mémoire les adresses les plus souvent demandées.

b. Principaux enregistrements DNS

Lorsqu’un service génère un trafic important, celui-ci peut faire appel à la technique du DNS Round-Robin (RR ou tourniquet), qui consiste à associer plusieurs adresses IP à un nom de domaine.

Le type de RR est codé sur 8 bits, l’IANA conserve le registre des codes assignés. Les principaux enregistrements définis sont les suivants :

  • A record ou address record qui fait correspondre un nom d’hôte à une adresse IPv4 de 32 bits distribués sur quatre octets, ex : 123.234.1.2.

  • AAAA record ou IPv6 address record qui fait correspondre un nom d’hôte à une adresse IPv6 de 128 bits distribués sur seize octets.

  • CNAME record ou canonical name record qui permet de faire d’un domaine un alias vers un autre. Cet alias hérite de tous les sous-domaines de l’original.

  • MX record ou mail exchange record qui définit les serveurs de courriel...

FTP : File Transfer Protocol

1. Introduction

Le standard de la RFC est RFC959.

Vous pouvez la trouver sur www.faqs.org/rfcs/rfc959.html.

Voyons les étapes pour une connexion FTP :

  • Premièrement, le client FTP établit une demande de connexion sur le port du serveur FTP.

  • Le client s’authentifie.

  • Le client commence à écouter les données de connexion sur un nouveau port et informe le serveur que ce nouveau port est ouvert.

  • Le serveur se connecte sur le port du client.

  • Le fichier est ensuite transmis et la connexion de données est fermée.

La première approche de l’étude du FTP avec Python va être une tentative de connexion sur un serveur FTP acceptant les connexions anonymes.

Grâce aux recherches Google, vous pourrez trouver de nombreux sites sur lesquels vous pourrez tester vos programmes.

Vous pouvez aussi installer sur votre machine un serveur FTP tel que Ability Server sous Windows ou VsFtpd sous Linux.

2. FTP anonyme

chap2_exo18.py


#!/usr/bin/env python  
# --*-- coding: UTF-8 --*--  
from ftplib import FTP  
f=FTP('ftp.obspm.fr')  
print "Bonjour: ",f.getwelcome()  
f.login()  
print "CWD:",f.pwd()  
f.quit() 
 

Nous utilisons donc la bibliothèque ftplib.

Celle-ci contient une méthode FTP.

La connexion au site est assez simple, il suffit de créer un objet ftp appelé f et de lui donner en paramètre l’adresse du site désiré.

La méthode getwelcome() permet de récupérer la bannière renvoyée par le serveur FTP lors de la connexion.

La fonction login() peut prendre plusieurs paramètres tels que le nom d’utilisateur, le mot de passe. Appelée sans paramètres, elle envoie comme utilisateur ’anonymous’ et un mot de passe générique au serveur FTP.

PWD() permet de voir le répertoire courant du site FTP distant.

La méthode quit() permet de fermer proprement la connexion établie plus haut.

Résultat de chap2_exo18.py


fasm@moya:~/ENI_livre_formation/livre_python/exemples$  
./chap2_exo18.py  
Bonjour:  220 ftp.obspm.fr FTP server ready.  
CWD: /  
fasm@moya:~/ENI_livre_formation/livre_python/exemples$
 

3. Téléchargement de fichiers ASCII

Avec FTP, on peut télécharger en mode ASCII ou binaire...

Les expressions régulières

1. Introduction

Nous avons abordé au chapitre Python : les fondamentaux les expressions régulières. Nous allons reprendre en détail ces dernières en partant d’un cas complexe qu’est l’ADN.

Comprendre les mots et jongler avec ceux-ci est une chose impossible pour nos ordinateurs. Paradoxal quand on sait que ces derniers sont à l’origine conçus pour traiter l’information. Pour remédier à cela, il a fallu penser un outil, aussi puissant que les traitements sont complexes, pour comprendre des objets comme des mots et effectuer sur ceux-ci des traitements, les regex (expressions régulières).

Nous aurons besoin très souvent de filtrer les informations, de pouvoir faire ressortir l’élément important d’une page web par exemple, ou les sous-domaines définis dans la page, ou les mails des employés contenus dans une page.

Pour cela, nous aurons besoin des expressions régulières. Une expression rationnelle ou expression régulière est en informatique une chaîne de caractères que l’on appelle parfois un motif et qui décrit un ensemble de chaînes de caractères possibles, selon une syntaxe précise.

Par exemple, nous pourrions penser à l’ADN : la représentation de l’écriture ressemblerait à une suite de A, de G, de T et de C (pour représenter les bases azotées que sont l’Adénine, la Guanine, la Thymine et la Cytosine).

Ainsi pour vérifier qu’une chaîne de caractères correspond à la description d’un brin d’ADN, il faut que la chaîne vérifie la proposition « chaque caractère de cette chaîne appartient exclusivement au groupe composé des lettres A,C,G,T ».

C’est un exemple simple d’expression régulière, nous allons maintenant définir les termes utilisés. Nous parlerons d’abord de chaîne de caractères, ce qui se passe de commentaire. Nous dirons d’une chaîne de caractères qu’elle correspond ou non à une expression régulière.

« ATCGCT » correspond à notre expression régulière alors...

Le Web

1. Introduction

La « prise d’empreinte », c’est-à-dire la recherche d’informations sur une personne, une entité ou une entreprise, est l’élément primordial pour une attaque réussie. C’est la partie du travail qui va prendre le plus de temps.

Il faut connaître parfaitement sa cible. Pour cela, des outils et des sites web sont disponibles, tels que Maltego, 123people, les réseaux sociaux et autres.

Mais il arrive, et plus souvent que l’on ne peut l’imaginer, que ces outils soient trop génériques et ne correspondent pas au besoin ou que le flot d’informations reçu soit trop volumineux pour pouvoir être traité rapidement.

Il devient alors nécessaire de créer des outils. Pour la recherche d’informations sur un site web, nous allierons l’utilisation des bibliothèques pour le web telles que urllib, urllib2 et celle des expressions régulières vues précédemment.

2. Récupération d’une page source

La librairie utilisée sera urllib2.

Deux méthodes vont nous être utiles ici : Request() et urlopen().

chap2_exo25.py


#!/usr/bin/env python  
# ­­*­­ coding: UTF­8 ­­*­­  
import sys, urllib2  
req=urllib2.Request(sys.argv[1])  
fd=urllib2.urlopen(req)  
while 1:  
    data=fd.read(1024)  
    if not len(data):  
        break  
    print data 
 

Résultat sur la page de ENI


fasm@moya:~/ENI_livre_formation/livre_python/exemples$  
./chap2_exo25.py http://www.eni.fr  
<html>  
<head>  
<title>ENI groupe, professionnel de l'informatique,  
&eacute;diteurs, d&eacute;veloppement, formation, conseil</title>  
<meta name="description" content="ENI GROUPE, des professionnels  
de la formation informatique, sp&eacute;cialiste en e-learning,  
&eacute;diteurs de livre, d&eacute;veloppement, ing&eacute;nierie,  
conseil, Microsoft, formation m&eacute;tiers">  
<meta NAME="KEYWORDS" CONTENTS="formation informatique,  
bureautique, r&eacute;seaux, Formation professionelle, graphisme,  
pao, analyste-programmeur, MCPSE, IFPA, &eacute;ditions...

Analyser les pages HTML et XHTML

1. Introduction

Parfois, il est assez difficile de construire son expression régulière afin de filtrer la donnée souhaitée.

Python possède un module nommé HTMLParser qui va nous permettre de parser plus facilement nos pages web.

2. Première approche

Nous allons partir d’un document HTML simple que nous allons écrire nous-même.

Document de départ : chap2_HTML.html


<HTML> 
<HEAD> 
<TITLE> Titre du Document </TITLE> 
</HEAD> 
<BODY> 
Voici le corps du texte 
</BODY> 
</HTML>
 

Nous allons voir comment récupérer juste le titre de ce document.

chap2_exo29.py


#!/usr/bin/env python  
 
from HTMLParser import HTMLParser  
import sys  
 
class TitleParser(HTMLParser):  
        def __init__(self):  
                self.title=""  
                self.readingtitle=0  
                HTMLParser.__init__(self)  
 
        def handle_starttag(self,tag,attrs):  
                if tag=='title':  
                        self.readingtitle=1  
 
        def handle_data(self,data):  
                if self.readingtitle:  
                        self.title += data  
 
        def handle_endtag(self,tag):  
                if tag=="title":  
                        self.readingtitle=0  
 
        def gettitle(self):  
                return self.title  
 
fd=open(sys.argv[1])  
tp=TitleParser()  
tp.feed(fd.read())  
print "Le titre est : ",tp.gettitle() 
 

Résultat du script chap2_exo29.py


fasm@moya:~/ENI_livre_formation/livre_python/exemples$  
./chap2_exo29.py chap2_HTML.html  
Le titre est :   Titre du Document  
fasm@moya:~/ENI_livre_formation/livre_python/exemples$...

Le XML

1. Introduction

Le langage XML est indépendant du programme, lisible, standardisé par le W3C et sa structure est hiérarchisée. Autant de points forts qui font l’intérêt de ce langage.

Un fichier XML est un simple fichier texte comportant l’extension .xml qui permet de stocker des informations formatées suivant certains besoins.

Chaque information est stockée entre deux tags ou balises XML. L’exemple le plus connu de l’utilisation du XML est le HTML mais il est également possible d’utiliser le XML pour stocker des données brutes, il suffit ensuite de parser ce fichier pour récupérer son contenu.

2. Représentation du fichier XML


<?xml version= "1.0"?> 
      <Sommaire> 
      <!--Ceci est un exemple--> 
            <titre> programmation Python</titre> 
                  <chapitre numero= "1"> 
                        <titre> Introduction</titre> 
                        <date annee= "2012" jour="14" mois="Janvier"/> 
                        <img src="logo.jpg"/> 
                        <auteur>Ebel Franck</auteur> 
                  </chapitre> 
                  <chapitre numero= "2"> 
                        <titre> Introduction</titre> 
                        <date annee= "2012" jour="15" mois="Janvier"/> 
                        <img src="logo2.jpg"/> 
                        <auteur>Editions ENI</auteur> 
            ...

Les e-mails

1. Introduction

Les e-mails sont maintenant monnaie courante. Tout passe par eux.

Il est possible de les falsifier assez facilement dès lors que l’on connaît leur fonctionnement.

Commençons donc par forger un e-mail en utilisant l’utilitaire netcat :

Exemple 1 : e-mail forgé grâce à netcat


Bash-3.2# nc -vv smtp.free.fr 25  
smtp.free.fr [212.27.48.4] 25 (smtp) open  
220 smtp1-g19.free.fr ESMTP Postfix  
helo free  
250 smtp1-g19.free.fr  
MAIL FROM:fasm@acissi.net  
250 Ok  
RCPT TO:franck.ebel@univ-valenciennes.fr  
250 Ok  
data  
354 End data with <CR><LF>.<CR><LF>  
Subject: mail avec nc  
Date : 26 Decembre 2011  
bonjour,  
test de mail  
. 
 

Nous pouvons donc aisément forger un mail à la main, l’exemple ci-dessus nous le démontre, mais bien sûr dès réception nous pourrons voir que ce mail n’est pas complet et donc détecter la malfaçon.

Exemple 2


 #!/bin/bash  
if [[ $# != 2 ]]; then  
echo "usage: ./mail.sh mail_source mail_destination"  
exit  
fi  
{  
echo "helo smtp.univ-valenciennes.fr";  
echo "MAIL FROM:$1";  
echo "RCPT TO: $2";  
echo "data";  
echo "Message-ID: <4CDE66FB.5080406@univ-valenciennes.fr>";  
echo "Date: Thu, 27 Oct 2011 11:22:51 +0100";  
echo "From: $1";  
echo "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;  
rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6";  
echo "MIME-Version: 1.0";  
echo "To: $2";  
echo "Subject:test eni";  
echo "Content-Type: text/plain; charset=ISO-8859-1";  
echo "Content-Transfer-Encoding: 7bit";  
echo "Bonjour eni";  
echo "Test de mail";  
echo "Deuxieme lmigne";  
echo "cordialement";  
echo " ";  
echo " ";  
echo ".";  
echo " ";  
echo "QUIT";  
}| nc -vv adresse_votre_serveur_mail 25
 

Dans cet exemple nous avons forgé un mail en remplissant le maximum d’informations telles que le sujet, la date, le Message-ID.

Ce dernier mail ressemblera maintenant...

Le SSL en Python

1. Introduction

Deux modules séparés en Python offrent aux développeurs la possibilité d’incorporer SSL dans leurs applications.

Nous ne reviendrons pas ici dans l’explication du SSL ni de son fonctionnement, beaucoup d’ouvrages sur le sujet ont été publiés.

Dans la bibliothèque socket déjà vue précédemment, il existe une méthode permettant d’utiliser le SSL. L’implémentation dans socket est vraiment basique et n’est pas capable d’authentifier le client distant sur le serveur.

La seconde possibilité est d’utiliser pyOpenSSL, un autre module. C’est une interface du populaire OpenSSL, beaucoup plus puissante et complexe.

Nous utiliserons pour la suite ce dernier module.

2. Utilisation d’OpenSSL

Commençons par un exemple de script basique.

chap2_exo40.py


#!/usr/bin/env python  
#coding:utf-8  
 
import socket, sys  
from OpenSSL import SSL  
 
ctx=SSL.Context(SSL.SSLv23_METHOD)  
print "Creation du socket ...",  
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
print "socket cree\n"  
 
ssl=SSL.Connection(ctx,s)  
print "Etablissement du SSL...",  
ssl.connect(('www.openssl.org',443))  
print "connexion effectuee"  
 
print "Requete demandee...",  
ssl.sendall("GET / HTTP/1.0\r\n\r\n")  
print "Requete effectuee"  
 
while 1:  
        try:  
                buf=ssl.recv(4096)  
        except SSL.ZeroReturnError:  
                break  
        print buf  
ssl.close() 
 

Extrait du résultat du script chap2_exo40.py


fasm@moya:~/ENI_livre_formation/livre_python/exemples$  
./chap2_exo40.py  
Creation du socket ... socket cree  
 
Etablissement du SSL... connexion effectuee  
Requete demandee... Requete effectuee  
HTTP/1.1 200 OK  
Date: Sat, 14 Jan 2012 18:53:09 GMT  
Server: Apache/2.2.20 (OpenPKG/CURRENT)  
Last-Modified: Wed, 04 Jan 2012 19:42:25 GMT  
ETag: "2ef6e-3eac-4b5b903d96a40"  
Accept-Ranges: bytes  
Content-Length: 16044  
Connection:...

Utilisation de bases de données

1. Introduction

Nous allons fréquemment retrouver dans notre vie d’informaticien des bases de données, que ce soit dans des applications ou des sites web dynamiques. Il existe plusieurs types de bases de données, la base de données relationnelle la plus populaire étant MySQL.

Il existe plusieurs outils sous Python permettant de gérer ces différentes bases de données.

2. MySQLdb

a. Rappel

Pour continuer, nous aurons besoin d’un serveur MySQL dans lequel nous allons ajouter ces quelques données :


mysql -p 
CREATE DATABASE python_db; 
USE python_db; 
CREATE TABLE IF NOT EXISTS USER(id int auto_increment PRIMARY KEY, 
pseudo text); 
INSERT INTO USER (pseudo) VALUES ('FaSm'); 
INSERT INTO USER (pseudo) VALUES ('Codej'); 
INSERT INTO USER (pseudo) VALUES ('Brix'); 
INSERT INTO USER (pseudo) VALUES ('Guifort');
 

Nous possédons donc maintenant une petite base et une petite table, la base étant destinée à contenir une ou plusieurs tables.

Notre table contient deux colonnes (attributs). La première est un entier qui s’incrémente automatiquement à chaque insertion. La seconde contient le pseudonyme de l’utilisateur.

Nous insérons quatre valeurs (les id vont s’incrémenter de 1 à 4). Chaque ligne de cette table est appelée un tuple. Les principales actions que l’on peut faire sur une base de données sont les suivantes :

  • Se connecter

  • Lister les éléments d’une table (clause SELECT)

  • Ajouter un élément dans une table (clause INSERT)

  • Mettre à jour un tuple (clause UPDATE)

  • Mettre à jour une structure (clause ALTER)

  • Détruire des données ou des tables (clauses DELETE et DROP)

b. Utilisation


import MySQLdb 
lien_db=MySQLdb.connect(host= "localhost", user="root", 
passwd="", db="test")
 

Nous importons le module puis nous appelons l’une de ses fonctions avec des paramètres nommés (ce qui permet de les passer sans ordre précis).

Nous nous connectons donc à une base de données située sur la machine localhost qui correspond à la machine locale.

Nous nous connectons en tant que root avec un mot de passe vide...

Conclusion

Nous venons de faire le tour des principales bibliothèques et méthodes pour une programmation réseau. Il en existe bien d’autres telles que pycurl par exemple. Nous ne pouvons bien sûr pas étudier toutes ces bibliothèques en détail.

Une recherche personnelle et une veille constante sont nécessaires pour rester à jour en Python mais aussi et surtout dans les outils de Hacking disponibles sur le net qui, dans la majorité des cas, sont codés en Python (wapiti, hachoir...). 

Le chapitre Réseau : la bibliothèque Scapy sera complètement consacré à une bibliothèque bien particulière et qui plus est écrite par un Français.

Mais avant cela, appliquons les connaissances acquises par le biais d’exercices concrets.

Le but pour un meilleur apprentissage est de lire l’énoncé, puis d’essayer de créer le script sans regarder la correction.

Mise en pratique

1. Cas 1 : Scan de ports

Énoncé

Prérequis : socket.

But : savoir programmer un socket en Python.

Énoncé :

Vous allez créer un script Python qui scanne les ports d’un hôte distant dont vous connaissez l’adresse IP.

Les ports scannés seront les ports 21, 22, 25, 53, 80, 139, 443, 1080, 3128, 8080, 8081.

Vous afficherez à l’écran la liste des ports ouverts et la liste des ports fermés.

L’adresse IP à scanner sera demandée à l’utilisateur.

Correction

chap2_tp1.py


#!/usr/bin/env python  
#--*--coding:UTF-8--*--  
 
 
# On importe les modules  
import socket  
import errno  
 
# Creation de 3 listes : pour l'ensemble des ports a scanner, une 
# autre pour pouvoir mettre les ports ouverts et une autre pour les 
# ports fermes  
ports=[21,22,25,53,80,139,443,1080,3128,8080,8081]  
portouvert=[]  
portferme=[]  
 
#  saisie de l'adresse IP a scanner par l'utilisateur  
print "Adresse IP a scanner?"  
ip = raw_input()  
 
i = 0  
j = 0  
while i < 10:  
        # On cree le socket  
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
        retourscan = s.connect_ex((ip,ports[i]))  
        # Pour la connexion reussie  
        if retourscan == 0:  
                # on ferme la connexion  
                s.shutdown(socket.SHUT_RDWR)  
                # on ferme aussi le socket  
                s.close()  
                # on ajoute le port ouvert dans la liste  
                portouvert.append(ports[i])  
        # Pour une erreur de connexion  
        else:  
                # Erreur de connexion - Port ferme  
                if errno.errorcode[retourscan]=="ECONNREFUSED":  
          ...