Annonce

Réduire
Aucune annonce.

Apprendre a créer son propre scanner de port en python

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Tutoriel Apprendre a créer son propre scanner de port en python

    hers hackcademiciens vous avez déjà rencontré plusieurs scanner de ports dans ce forum et j'avoue que j'ai du baver un peu pour comprendre certains(et je ne suis pas seul ) et je me suis demandé pourquoi pas faire un tuto pour apprendre au vrai novice a comprendre les bases d'un scanner de ports. Bien sur ce que je m’apprête a vous montré est un Basic de chez Basic. pour conclure ce petit introduction, j’essaierai donc de vous montrer comment établir des connexion réseau avec python en construisant un scanner de base de port en utilisant les socket(IP/PORT)

    commençons déjà par les bases en se connectant au serveur ssh qui écoute sur le port 22

    Code:
    import socket
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect(("127.0.0.1",22))
    bannière=sock.recv(1024)
    print bannière
    SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
    nous importons d'abord le module socket et appelons la fonction connect() de la classe socket pour se connecter a l'adresse IP donné et le numéro de port. Ceci permettra d’établir une connexion TCP( SYN / SYN-ACK/ ACK le fameux handshake) .on peut envoyer les données a la socket avec la fonction send() et recevoir avec la fonction recv() comme nous l'avons fait avec bannière= sock.recv(1024) pour recevoir le message de bienvenu du serveur ssh. Bien sur la socket relève une exception si le port est fermé.

    Code:
    Sock.connect((« 127.0.0.1 »,23))
    
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        sock.connect(("localhost",23))
      File "/usr/lib/python2.7/socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    error: [Errno 111] Connection refused
    on peut exploité cet exception de différents façons .pour l'instant (puisqu'on fait dans la simplicité) nous allons utiliser un moyen tres simple : utiliser un bloc try/except qui vas capturer l’exception et nous éviter ainsi les détails sur ce qui s'est passé

    Code:
    try :
        sock.connect((« 127.0.0.1 »,23))
    except : pass
    formidable si on arrive a se connecter tant mieux sinon on fait la soude d'oreille
    j'avoue que je parle trop continuons ;vous connaissez tous comment fonctionne la boucle for en python : demonstration

    Code:
    for port in range(20,25) :
        print « [+] port : »+str(port)
    port : 20
    port : 21
    port : 22
    port : 23
    port : 24
    port : 25
    utilisons ça avec ce que je vous ai montré plus haut et ca donne

    Code:
    for port in range(20,25) :
        try :
            print « [+] connexion a 127.0.0.1 : »+str(port)
    	sock.connect((« 127.0.0.1 »,port))
    	bannière= sock.recv(1024)
    	if bannière :
    	    print « [+] Port « +str(port)+ » ouvert : »+banniere
        except:pass
        finally :
    	sock.close()
    "[+] Port 21 ouvert : FTP server (Version 6.4/OpenBSD/Linux-ftpd-0.17) ready"
    "[+] Port 22 ouvert : 'SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2"
    simple le code norh. nous démontrons l'utilisation de base de try/except pour passé l 'exception lancé par la socket lorsque le port est fermé. Nous montrons aussi comment exploiter une instruction conditionnelle de base avec "si" pour tenter seulement d'imprimer ouvert si le port a répondu a notre demande de connexion. Une autre façon de créer un scanner de port serait de définir un liste de ports que vous aimeriez numérisées avec un tableau ensuite bouclé le tableau.

    Je sais que vous avez compris mais ça me coûte quoi de vous montrer le principe

    Code:
    ports = [21,22,23,445,80,111,8080,3306]
    for port in ports :
        print port
    si ça vous inspire faites en bon usage

    si nous voulions gérer plusieurs hôtes a la fois on s'apuierai simplement sur une boucle imbriquée. La première pour gérer les hôtes et la deuxième pour gérer les différents ports. Un exemple de base de la façon donc imbriquer une boucle for peut être mis a profit pour faire un scanner légèrement plus complexe(bien sur qui reste Basic)

    Code:
    hosts = ['10.0.0.2', '10.0.0.7', '10.0.0.78']
    ports = [21, 22, 23, 443, 111,3306]
    for host in hosts:
        for port in ports:
            try:
                print "[+] Connexion a "+host+":"+str(port)
               sock.connect((host, port))
               banniere = sock.recv(1024)
               if banniere:
                   print "[+] Port "+str(port)+" ouvert: "+banner
            except:pass
    	finally :
    		sock.close()
    
    [+] Connexion a 127.0.0.1:21
    [+] Port 21 ouvert : FTp
    [+] Connexion a 127.0.0.1:22
    [+] Port 22 ouvert: OpenSSH
    [+] Connexion a 127.0.0.1:443
    [+] Connexion a 127.0.0.1:111
    [+] Connexion a 127.0.0.1:3306
    [+] Connexion a 127.0.0.7:21
    [+] Connexion a 127.0.0.7:22
    [+] Connexion a 127.0.0.7:443
    [+] Connexion a 127.0.0.7:111
    [+] Connexion a 127.0.0.7:3306
    [+] Connexion a 127.0.0.78:21
    [+] Connexion a 127.0.0.78:22
    [+] Connexion a 127.0.0.78:443
    [+] Connexion a 127.0.0.78:111
    [+] Connexion a 127.0.0.78:3306
    Comme vous pouvez le voir par la sortie, il boucle le tableau des hôtes et tente chaque port dans le tableau des ports passe ensuite à l'hôte suivant. Pour le scanner de port final, vous voudrez peut-être modifier vos états d'impression vers les ports d'impression seulement qui sont ouverts.

    Je vous l'avez dis du basic de chez basic ; ce tuto etait la juste pour vous permettre de comprendre comment fonctionne un scanner de port(port TCP pour notre cas) et si vous avez fait de recherche sur les scanners de ports vous saurez que nmap est encore une bien meilleur option pour le balayage de port et si vous tenez a concevoir le votre je vous conseille le module scapy qui est tres riche en options.
    Bon je crois que c'est la fin de ce tuto n'esitez pas a utiliser ces concepts pour élaborer de scanner plus sophistiqué et surtout j'attends des remarques, des ajouts ou des inquiétudes(bien que qu'il n y ai eu rien de difficile dans ce tuto).

    Comme on dis chez nous Le lion a beau avoir quatre pattes, il ne peut emprunter deux chemins à la fois.

  • #2
    Merci c'est gentil, mais essais de prendre les bons gestes pour 3.4 dès maintenant, car 2.7 commence à dater et encore quelques années, il sera totalement obsolète.

    Aussi, vérifie la fonctionalité du programme que tu recopie :
    J'ai essayé vite fait de rectifier la pluspart des erreurs. Mais je suis sûre que si fred passe dans le coin, il en trouvera d'autres.
    Code:
    import socket
    hosts = ['10.0.0.2', '10.0.0.7', '10.0.0.78']
    ports = [21, 22, 23, 443, 111,3306]
    sock = socket.socket()
    for host in hosts:
        for port in ports:
            try:
                print ("[+] Connexion a "+host+":"+str(port))
                sock.connect((host, port))
                banniere = sock.recv(1024)
                if banniere:
                    print ("[+] Port "+str(port)+" ouvert: "+banner)
            except:pass
            finally :
                sock.close()
    Exemple : Importer la lib socket, définir sock ,indentation non-respecté,...
    Dernière modification par DreAmuS, 28 septembre 2015, 17h14.

    Commentaire


    • #3
      tu a raison Dreamus j'avoue avoir avoir omis des trucs entre le script dans mon IDE et libreOffice(une erreur certainement) merci de l'avoir constaté comme je suis bete

      Commentaire

      Chargement...
      X