Annonce

Réduire
Aucune annonce.

Mon simple scanner en python

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

  • Mon simple scanner en python

    hello,

    après une longue absence , je suis de retour pour partager un petit script dérivé d'un exercice python d'un de mes cours.

    voila donc c'est un petit scanner de ports avec quelques options.(soyez indulgent je suis toujours débutant ^^)

    voila le script:

    Code:
    #This script (-VESISC-)  is only for localhost ,and under conditions webscan
    #WEBSCAN (scanning websites) only with autorisation of administrator/owner
    #The usage of this tool is under your own responsability
    
    #for some modules you fist need to install them
    #EX: sudo pip install ipwhois (needs to be installed via terminal)
    
    #This work is licensed under the Creative Commons Attribution-NonCommercial 4.0 International
    #To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/
    #For more informations contact [email protected]
    
    #(c) cc nc 4.0 Christian HEINTZ
    
    from socket import *
    from ipwhois import IPWhois
    import dns.resolver
    import urllib2
    from pprint import pprint
    import sys
    
    
    def scanner(ip,alpha, omega):
        print ""
        print ""
        print "Begin to scan..."
        print "--------------
        count_o = 0
        count_c = 0
        for ports in range(alpha, omega):
            try:
                print "Scanning port :%d" % (ports,)
                s = socket(AF_INET, SOCK_STREAM)
                s.settimeout(3)
                s.connect((ip, ports))
                s.settimeout(3)
                print "Port %d: is OPEN" % (ports,)
                count_o = count_o + 1            
                s.close()
            except:
                print "Port %d: is CLOSED" % (ports,)
                count_c = count_c + 1
                s.close()
        print "Scanning finished !"
        print "---------------
        print ""
        print "Found %d OPEN ports" % (count_o,)
        print "And %d CLOSED ports" % (count_c,)
    
    def whois(ip):
        print ""
        print "WHOIS: %s" % (address,)
        print "----- + "-" * len(address)
        who = IPWhois(ip)
        results = who.lookup(get_referral=True)
        pprint (results)
    
    def banner(address):
        print ""
        print "BANNER:"
        print "-----
        address1 = "http://www."+address
        header = urllib2.urlopen(address1).info()
        print(str(header))
        
    def nslookup(address):
        rd4 = None
        print ""
        print "NSLOOKUP:"
        print "-------
        ns_l = dns.resolver.query(address, "MX")
        ns_2 = dns.resolver.query(address, "NS")
        ns_3 = dns.resolver.query(address, "A")
        ns_4 = dns.resolver.query(address, "SOA")    
        print "MX (mail exchange)"
        print "----------------
        for rdata in ns_l:      
            print (rdata)
        print "NS (name server)"
        print "--------------
        for rdata in ns_2:      
            print (rdata)
        print "A (address)"
        print "---------
        for rdata in ns_3:      
            print (rdata)
        print "SOA (start of authority)"
        print "----------------------
        print "The SOA record includes the following details:"
        print "The primary name server for the domain, which is xxx.xxxxxxx.com"
        print "or the first name server in the vanity name server list for vanity name servers."
        print "The responsible party for the domain, which is xxx.xxxxxxx.com."
        print "A timestamp that changes whenever you update your domain."
        print "The number of seconds before the zone should be refreshed."
        print "The number of seconds before a failed refresh should be retried."
        print "The upper limit in seconds before a zone is considered no longer authoritative."
        print "The negative result TTL (for example, how long a resolver should consider a"
        print "negative result for a subdomain to be valid before retrying)."
        print "--------------------------------------------------------------------------- 
        for rdata in ns_4:
            print (rdata)    
        
    def choice():
        if address == "localhost":
            scanner(ip,alpha,omega)
        else:
            whois(ip)
            banner(address)        
            nslookup(address)
            scanner(ip,alpha,omega)
            
    print "--------------------------
    print "-VESISC- very simple scanner"
    print "--------------------------
    print ""
    print "This script (-VESISC-)  is only for localhost ,and under conditions webscan"
    print "WEBSCAN (scanning websites) only with autorisation of administrator/owner !!"
    print "The usage of this tool is under your own responsability !"
    print ""
    print "This work is licensed under "
    print "the Creative Commons Attribution-NonCommercial 4.0 International License."
    print "To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/."
    print "For more informations contact [email protected]"
    print ""
    address = raw_input("Enter address (or localhost): ")
    alpha = int(raw_input("Port (min):"))
    omega = int(raw_input("Port (max):"))
    try:
        ip = gethostbyname(address)
        host = gethostbyaddr(ip)
        print ""
        print "%s has the IP: %s" % (address, ip,)
        print "HOST :",host[0]
        print ""
        choice()
    except:
        print "Address %s unreachable" % (address,)
    et voici quelques resultats: (localhost)

    Code:
    ---------------------------
    -VESISC- very simple scanner
    ---------------------------
    
    This script (-VESISC-)  is only for localhost ,and under conditions webscan
    WEBSCAN (scanning websites) only with autorisation of administrator/owner !!
    The usage of this tool is under your own responsability !
    
    This work is licensed under 
    the Creative Commons Attribution-NonCommercial 4.0 International License.
    To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/.
    For more informations contact [email protected]
    
    Enter address (or localhost): localhost
    Port (min):70
    Port (max):90
    
    localhost has the IP: 127.0.0.1
    HOST : localhost
    
    
    
    Begin to scan...
    ----------------
    Scanning port :70
    Port 70: is CLOSED
    Scanning port :71
    Port 71: is CLOSED
    Scanning port :72
    Port 72: is CLOSED
    Scanning port :73
    Port 73: is CLOSED
    Scanning port :74
    Port 74: is CLOSED
    Scanning port :75
    Port 75: is CLOSED
    Scanning port :76
    Port 76: is CLOSED
    Scanning port :77
    Port 77: is CLOSED
    Scanning port :78
    Port 78: is CLOSED
    Scanning port :79
    Port 79: is CLOSED
    Scanning port :80
    Port 80: is OPEN
    Scanning port :81
    Port 81: is CLOSED
    Scanning port :82
    Port 82: is CLOSED
    Scanning port :83
    Port 83: is CLOSED
    Scanning port :84
    Port 84: is CLOSED
    Scanning port :85
    Port 85: is CLOSED
    Scanning port :86
    Port 86: is CLOSED
    Scanning port :87
    Port 87: is CLOSED
    Scanning port :88
    Port 88: is CLOSED
    Scanning port :89
    Port 89: is CLOSED
    Scanning finished !
    -------------------
    
    Found 1 OPEN ports
    and 19 CLOSED ports
    2eme un petit test sur google:

    Code:
    ---------------------------
    -VESISC- very simple scanner
    ---------------------------
    
    This script (-VESISC-)  is only for localhost ,and under conditions webscan
    WEBSCAN (scanning websites) only with autorisation of administrator/owner !!
    The usage of this tool is under your own responsability !
    
    This work is licensed under 
    the Creative Commons Attribution-NonCommercial 4.0 International License.
    To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/.
    For more informations contact [email protected]
    
    Enter address (or localhost): google.com
    Port (min):79
    Port (max):82
    
    google.com has the IP: 216.58.208.206
    HOST : par10s21-in-f14.1e100.net
    
    
    WHOIS: google.com
    -----------------
    {'asn': '15169',
     'asn_cidr': '216.58.208.0/24',
     'asn_country_code': 'US',
     'asn_date': '2012-01-27',
     'asn_registry': 'arin',
     'nets': [{'abuse_emails': '[email protected]',
               'address': '1600 Amphitheatre Parkway',
               'cidr': '216.58.192.0/19',
               'city': 'Mountain View',
               'country': 'US',
               'created': '2012-01-27T00:00:00',
               'description': 'Google Inc.',
               'handle': 'NET-216-58-192-0-1',
               'misc_emails': None,
               'name': 'GOOGLE',
               'postal_code': '94043',
               'range': '216.58.192.0 - 216.58.223.255',
               'state': 'CA',
               'tech_emails': '[email protected]',
               'updated': '2012-01-27T00:00:00'}],
     'query': '216.58.208.206',
     'raw': None,
     'raw_referral': None,
     'referral': None}
    
    BANNER:
    -------
    Date: Sun, 28 Jun 2015 10:19:55 GMT
    Expires: -1
    Cache-Control: private, max-age=0
    Content-Type: text/html; charset=ISO-8859-1
    P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
    Server: gws
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1435486795:LM=1435486795:V=1:S=09AhYjBsABeBUXDB; expires=Tue, 27-Jun-2017 10:19:55 GMT; path=/; domain=.google.fr
    Set-Cookie: NID=68=TCcBPXG60lnXOWv6uBWxeppYgk4BkPPNQRfGcLtrKObhLav7tSYvcDL60AbQP4-_5FxoM7OuHMQu9uQ6lOuVJPwOW00IHtsUDEBod4FfneFT19hu-XmMI78DSiiYPVnf; expires=Mon, 28-Dec-2015 10:19:55 GMT; path=/; domain=.google.fr; HttpOnly
    Alternate-Protocol: 80:quic,p=0
    Accept-Ranges: none
    Vary: Accept-Encoding
    Connection: close
    
    
    NSLOOKUP:
    ---------
    MX (mail exchange)
    ------------------
    20 alt1.aspmx.l.google.com.
    30 alt2.aspmx.l.google.com.
    10 aspmx.l.google.com.
    50 alt4.aspmx.l.google.com.
    40 alt3.aspmx.l.google.com.
    NS (name server)
    ----------------
    ns2.google.com.
    ns4.google.com.
    ns1.google.com.
    ns3.google.com.
    A (address)
    -----------
    216.58.208.238
    SOA (start of authority)
    ------------------------
    The SOA record includes the following details:
    The primary name server for the domain, which is xxx.xxxxxxx.com
    or the first name server in the vanity name server list for vanity name servers.
    The responsible party for the domain, which is xxx.xxxxxxx.com.
    A timestamp that changes whenever you update your domain.
    The number of seconds before the zone should be refreshed.
    The number of seconds before a failed refresh should be retried.
    The upper limit in seconds before a zone is considered no longer authoritative.
    The negative result TTL (for example, how long a resolver should consider a
    negative result for a subdomain to be valid before retrying).
    --------------------------------------------------------------------------------
    ns1.google.com. dns-admin.google.com. 4294967295 7200 1800 1209600 300
    
    
    Begin to scan...
    ----------------
    Scanning port :79
    Port 79: is CLOSED
    Scanning port :80
    Port 80: is OPEN
    Scanning port :81
    Port 81: is CLOSED
    Scanning finished !
    -------------------
    
    Found 1 OPEN ports
    And 2 CLOSED ports

    "ATTENTION: L'usage de cet outil est strictement réservé a un usage LEGAL
    c'est a dire tout scan devra avoir l'autorisation du propriétaire/admin
    du site web en question."


    Toutes critiques constructives sont bien sur les bien venues ^^

    ps: maintenant je devrais m'attaquer au multithreading (prochain exercice ^^),pour le scanner de ports (et la c'est une autre histoire ....)

    ps2: Merci a fred pour m'avoir fait goutter python ^^

    Passez une bonne journée

    Salut.
    Dernière modification par blend, 28 juin 2015, 13h01.

  • #2
    Salutation,

    Il manque pas mal de fermeture de double quote dans le code.

    -Attention, tu ne vérifies aucun de tes paramètres d'entrée. Ce qui fait crasher le programme si l'utilisateur ne rentre pas les informations attendues. (IP, Portmin, Portmax).

    -Ensuite je te conseille de créer ta propre syntaxe pour le scan de ports:
    Si par exemple je veux scanner les ports 1 et 21 et 80 et la plage entre 1000 et 2000, hummm pas vraiment pratique le système de min/max.

    Voilà je pense que tu devrais voir les deux points que je t'ai indiqués avant de passer a la suite.

    Commentaire


    • #3
      hello Erenox ,

      merci d'avoir jeté un coup d’œil a mon petit script .

      je ne voit pas ou j'ai oublie de fermer des doubles quotes , pourrait tu m'indiquer ou ?
      oui effectivement ce script n'est pas encore aboutit , je vais ajouter quelques if/else et try/except au fur et a mesure
      pour tester les entrées ip et port min/max entre autres.
      je n'ai pour l'instant pas encore ajoute d'option pour entrer une ip (ce que je vais prévoir aussi), pour l'instant il ne fonctionne qu'avec des url

      -Ensuite je te conseille de créer ta propre syntaxe pour le scan de ports:
      Si par exemple je veux scanner les ports 1 et 21 et 80 et la plage entre 1000 et 2000, hummm pas vraiment pratique le système de min/max.
      pas bien compris ta question la par contre ^^

      ps: je viens de vérifier la différence entre le script sur mon pc et le copie/colle ici,apparemment il y aurait eu un problème (effectivement manque la fermeture de doubles quotes ici , mais pas sur mon pc )
      bizarre !!

      ps2: après un deuxième copie/colle certain doubles quotes sont toujours pas colles ici !!!! je ne comprends pas , parce que comme dit chez moi elles sont bien toutes la ^^

      ps3: même après avoir recolle mon script et avoir ajoute les double quotes a la main , elles ne sont toujours pas affichées !!

      merci de pour tes conseils ^^
      Dernière modification par blend, 28 juin 2015, 13h25.

      Commentaire


      • #4
        Poste ton code sur pastebin, ça sera mieux de toute façon.

        Une option de vérification asynchrone des ports serait bien aussi, pour ne pas attendre les connexions qui pourraient prendre du temps.

        Commentaire


        • #5
          @blend,

          L'essentiel est que... ça fonctionne !!!

          Pour le reste, niveau syntaxe,
          1. Trop de print tue le print, utilises les triples quotes !
          2. Les modules gèrent les erreurs, pourquoi vouloir les remplacer avec des try-except, alors qu'ils renvoient des messages suffisamment explicite avec une documentation complète ?
          3. Utilise format à la place de %s ou %d, qui est obsolète avec la version 3.x
          4. Éviter les print ou pprint dans les fonctions


          Ce qui m'amène au pire, la conception,

          Ces print, prouve un gros problème de conception, ce genre de code est difficilement maintenable dans le sens où le moindre grain de sable s'insère dans la machine et ça pète !

          Il faudrait refaire ! et c'est pour ça que j'en reviens à ma conclusion du départ, l'essentiel c'est que ça fonctionne !!!

          @Erenox,

          -Attention, tu ne vérifies aucun de tes paramètres d'entrée. Ce qui fait crasher le programme si l'utilisateur ne rentre pas les informations attendues. (IP, Portmin, Portmax).
          Je vois pas, pourquoi ne pas laisser le module socket et IPWhois le faire pour toi ?

          Si par exemple je veux scanner les ports 1 et 21 et 80 et la plage entre 1000 et 2000, hummm pas vraiment pratique le système de min/max.
          C'est un des problèmes liés à la conception, malheureusement, ça va être dur... Faut repenser son code et une fois créé, c'est difficile de s'en sortir sans recommencer.

          J'aurais conseillé de travailler avec argparse, pour analyser les différentes options du scanner par exemple.
          Dernière modification par fred, 28 juin 2015, 19h24.

          Commentaire


          • #6
            Je vois pas, pourquoi ne pas laisser le module socket et IPWhois le faire pour toi ?
            A contrario , je ne vois pas pourquoi cela serait au module de gérer les erreurs que normalement le développeur doit savoir prévoir et corriger.

            De même pour la gestion des erreurs (try-except), qui pour moi devrait être utilisé uniquement en dernier recours et dans de rares cas.
            Il vaut mieux prévoir que l'erreur va arriver et agir en conséquence plutôt que la laisser se produire et ensuite la gérer.
            Dernière modification par Erenox, 29 juin 2015, 05h49.

            Commentaire


            • #7
              De même pour la gestion des erreurs (try-except), qui pour moi devrait être utilisé uniquement en dernier recours et dans de rares cas.
              Eh bien c'est là dessus que je veux en venir, éviter le try except c'est laisser gérer les erreurs par les modules utilisés.

              Il vaut mieux prévoir que l'erreur va arriver
              Le problème est toujours le même, si avec une documentation bien faîte, l'utilisateur ne sait pas utiliser correctement un programme, on peut pas faire grand chose pour lui.

              Pourquoi là prévoir ? Si message d'erreur il y a, il se prend la documentation à lire sur l'écran, c'est comme ça que fonctionne 95% des programmes Unix par exemple. Il n'y a aucun problème de sécurité qu'un utilisateur se trompe et s'il rentre une IP non conforme, le message d'erreur géré par un module ipwhois ou socket sera parfaitement faire comprendre l'erreur

              Maintenant on peut gérer les erreurs, mais dans ce cas, conceptuellement il faut être logique, et les placer à bon escient dans les fonctions bien choisies.

              Commentaire


              • #8
                Hello,

                Merci a tous encore d'avoir pris le temps de regarder mon petit script ^^,
                non ça ne me dérange pas du tout de recommencer ce script (j’étais bien partit de 5 pauvres lignes au départ) et j'ai du le recommencer au moins une bonne 15 aine de fois ...
                comme je l'ais dit c'est un de mes premiers code et je suis déjà content qu'il fonctionne , mais je vais bien sur créer encore et encore des versions sûrement différentes sur la base de tous vos conseils
                la base de ce script n'est bien sur que le scanner , le reste n'est que options que j'ai ajoute pour simplement savoir et tester comment ça fonctionne , et c'est sur cette fonction que je me baserait pour les prochaines versions !!

                Je vous explique aussi quels problèmes j'ai rencontre comme débutant en python et sans avoir commence les modules networking dans mes différents cours ..

                Alors , un de mes problèmes que j'avais rencontre pour la fonction scanner et que j'avais du mal même en cherchant sur google etc...c'est que sans les try/except ca ne fonctionnait que en localhost,mais en voulant scanner un site il restait bloque sur le premier port indéfiniment... comme dit je n'ai pas encore commencé les différents modules networking , juste fait cet essai grâce a Google ,stackoverflow et pas mal de tests ..)

                En tout cas merci pour vos commentaire et conseils
                je vais tacher de le modifier et de revenir vers vous a nouveau ^^
                bien sur ce ne sera que la fonction scanner()


                Blend.
                Dernière modification par blend, 29 juin 2015, 10h37.

                Commentaire


                • #9
                  Il faut bien faire attention à ce que doit retourner cette fonction scanner, c'est très important, dans ton cas seulement les ports ouverts sont intéressants, car on sait logiquement interprété les ports fermés.

                  Dans ton cas, ça exprime l'ouverture ou la fermeture d'un port à partir d'une IP, la partie données est reçu grâce à l'utilisateur, c'est pour ça que la partie analyse des options est importante.

                  Code:
                  IP = ''
                  PORT_MINI = 1
                  PORT_MAXI = 2**16
                  
                  # code pour analyser la ligne de commande
                  # alpha si donné par l'utilisateur
                  # omega si donné par l'utilisateur
                  
                  def scanner(..., alpha=PORT_MINI, omega=PORT_MAXI):
                      # code pour scanner
                      if ouvert:
                          yield port
                  
                  # Utilisation de la fonction scanner
                  
                  for port in scanner(myIP, ..., ...):
                      print "Le port n°{} est OUVERT".format(port)
                  Bref c'est le principe, qui est que, la fonction scanner doit retourner tous les ports ouverts...
                  Dernière modification par fred, 29 juin 2015, 10h50. Motif: fautes orthographes

                  Commentaire


                  • #10
                    vais tenter quelques modification
                    Dernière modification par blend, 03 juillet 2015, 15h02.

                    Commentaire


                    • #11
                      scanner v2

                      hello,

                      j'ai tente une nouvelle version de ce scanner ( sûrement pas le dernière )

                      par contre après avoir regarde différents scripts sur le net , je n'arrive toujours pas a le faire sans try/except (mais vais continuer mes recherches et tests pour trouver un moyen)

                      j'ai prevu de faire un menu ou il sera possible de choisir entre une liste de ports saisis par l'utilisateur et mon systeme de range

                      voila la v2:


                      Code:
                      from socket import *
                      ip = []
                      port = []
                      print """
                      ----------------------------
                      -VESISC- very simple scanner
                      ----------------------------
                      
                      This script (-VESISC-)  is only for localhost ,and under conditions webscan
                      WEBSCAN (scanning websites) only with autorisation of administrator/owner !!
                      The usage of this tool is under your own responsability !
                      """
                      address = raw_input("\nEnter address (or localhost): ")
                      alpha = int(raw_input("Port (min):"))
                      omega = int(raw_input("Port (max):"))
                      
                      
                      def scanner_co(ip,ports):
                          
                          try:        
                              s = socket(AF_INET, SOCK_STREAM)
                              s.settimeout(.9)
                              s.connect((ip, ports))
                              s.settimeout(.9)
                              print "Port {} is         --OPEN.format(ports,)                    
                              s.close()
                          except:
                              print "Port {}: is CLOSED".format(ports)        
                              s.close()
                              
                      
                      def scanner_po(ip,ports):
                          ports = range(alpha,omega)
                          
                          
                          try:
                              ip =gethostbyname(address)
                              host = gethostbyaddr(ip)
                              print "\nHOST: {}".format(host[0])
                              print "{0} has the IP: {1}\n".format(address, ip)
                          except:
                              print "Host {} is unreacheable/unknow :".format(address)       
                              
                         
                              
                          for port in ports:
                              print "Scanning port :{}".format(port)
                              scanner_co(ip,port)
                      
                              
                              
                      def main():
                          scanner_po(ip,port)
                          
                      if __name__ == "__main__":
                          main()


                      avec comme resultat:

                      Code:
                      ----------------------------
                      -VESISC- very simple scanner
                      ----------------------------
                      
                      This script (-VESISC-)  is only for localhost ,and under conditions webscan
                      WEBSCAN (scanning websites) only with autorisation of administrator/owner !!
                      The usage of this tool is under your own responsability !
                      
                      
                      Enter address (or localhost): xx-xxx.org
                      Port (min):79
                      Port (max):82
                      
                      HOST: xxxx.xxxx.com
                      xx.xxx.org has the IP: xx.xx.xxx.xxx
                      
                      Scanning port :79
                      Port 79: is CLOSED
                      Scanning port :80
                      Port 80 is         --OPEN--
                      Scanning port :81
                      Port 81: is CLOSED
                      Dernière modification par blend, 03 juillet 2015, 15h45.

                      Commentaire


                      • #12
                        non ça ne me dérange pas du tout de recommencer ce script (j’étais bien partit de 5 pauvres lignes au départ) et j'ai du le recommencer au moins une bonne 15 aine de fois ...
                        Prends un morceau de papier ou un éditeur de texte, écrit ton algo, réfléchis à ce que tu fais et le meilleur moyen de le faire.
                        Tu vas perdre quoi : 1 heure, 2 heures max. Mais au final tu vas gagner des jours de dev.
                        je sais que c'est chiant, moi-même je ne fais pas à chaque fois mais je le regrette souvent ensuite

                        Utilise argparse comme fred te la conseiller.

                        Ensuite, même si Fred ne semble pas etre d'accord avec moi, voilà comment je procederais :

                        Imaginons que tu es un passe tes arguments comme ceci : "vesisc.py 127.0.0.1 -P 1,21,80,1000-2000"
                        -Le premier argument est une IP ou un nom de domaine.
                        -Le second des ports à scanner.

                        -Pour les ports, découpe ta chaine au niveau des virgules et stocke la dans un tableau, pour chaque entrée vérifie le port ou la plage de ports. Une ou deux conditions devraient faire l'affaire.

                        -Pour l'IP ou le domaine, tu peux déclarer une expression régulière et vérifier la concordance avec ce que l'utilisateur à entré.

                        Pour chaque cas retourne un message d'erreur si le paramètre est invalide.

                        tu peux ensuite utiliser tes librairies ou tes fonctions en étant sûr que les paramètres que tu passes sont valide.
                        Dernière modification par Erenox, 03 juillet 2015, 17h58.

                        Commentaire


                        • #13
                          Ensuite, même si Fred ne semble pas etre d'accord avec moi
                          Il pourrait commencer simple sans gestion d'erreurs et sans gestion des paramètres pour l'instant ?

                          C'est si compliqué de faire une fonction scanner qui affiche tous les ports ouverts à partir d'une IP, soit sous forme de liste python, soit en récupérant un générateur avec yield ?

                          Commentaire


                          • #14
                            Comme je pense que ça peut être difficile, je vais tenter une aide un peu plus importante (je suis pas un spécialiste des sockets)

                            Code:
                            import socket
                            import errno
                            
                            # socket information
                            
                            TIMEOUT = 0.9 # modifiable facilement dans le programme
                            
                            # port information
                            
                            CLOSE = 0 # fermé
                            OPEN = 1 # ouvert
                            UNREACHABLE = 2 # inaccessible
                            TIMEOUT_ERROR = 3 # connection non aboutie dans les temps TIMEOUT
                            
                            def scan(ip, port=80):
                                """ 
                                scan port of ip 
                                return port information and port
                                """
                                
                                s = socket.socket() # valeur par défaut AF_INET et SOCK_STREAM
                                s.settimeout(TIMEOUT)
                                err = s.connect_ex((ip, port))
                                
                                if not err: # Si pas d'erreur tout se passe bien, voir doc
                                    s.shutdown(socket.SHUT_RDWR) # Empêche l'écriture et la lecture du socket
                                    s.close()
                                    return (OPEN, port)
                                elif errno.errorcode[err] is "ECONNREFUSED":
                                    return (CLOSE, port)
                                elif errno.errorcode[err] is "EHOSTUNREACH":
                                    return (UNREACHABLE, port)
                                
                                return (TIMEOUT_ERROR, port)
                                
                            print(scan("173.194.42.5")) # retourne (1, 80) soit port 80 ouvert sur google
                            Comme on le voit je laisse gérer les erreurs au module socket, c'est lui qui m'envoie un code erreur (err) précis me permettant d'en déduire s'il est ouvert, fermé ou autres... à l'aide du module errno.

                            Ensuite, on peut faire les tests sur une plage, et créer une fonction d'affichage spécifique à chaque message d'erreur rencontré.

                            EDIT: Pourquoi l'utilisation de la méthode shutdown ?

                            La documentation dit:
                            Note close() releases the resource associated with a connection but does not necessarily close the connection immediately. If you want to close the connection in a timely fashion, call shutdown() before close().
                            Bonne continuation...
                            Dernière modification par fred, 04 juillet 2015, 16h07. Motif: explication de shutdown

                            Commentaire


                            • #15
                              Encore un autre version de mon script de scanner de ports , pour l'instant toujours pas de argparse , ce sera pour une version ultérieure. par contre j'ai essaye d’intégrer le plus possible certaines idées.

                              voila la nouvelle version:

                              Code:
                              import socket
                              import errno
                              
                              
                              
                              TIMEOUT = 0.1 
                              CLOSE = "CLOSE"
                              OPEN = "                        -- OPEN --  "
                              UNREACHABLE = "UNREACHABLE" 
                              TIMEOUT_ERROR = "TIMEOUT_ERROR"
                              GAIERROR = "GAIERROR: No address associated with hostname"
                              HERROR = "HERROR: Unknown host"
                              CONNERR = "URL or IP unreachable"
                              
                              def scan(ip, port):    
                                  
                                  s = socket.socket() 
                                  s.settimeout(TIMEOUT)
                                  err = s.connect_ex((ip, port))    
                                  
                                  
                                  if not err: 
                                      s.shutdown(socket.SHUT_RDWR) 
                                      s.close()
                                      return (port, OPEN, socket.getservbyport(port))
                                  elif errno.errorcode[err] is "ECONNREFUSED":
                                      return (port, CLOSE, socket.getservbyport(port))
                                  elif errno.errorcode[err] is "EHOSTUNREACH":
                                      return (port, UNREACHABLE)
                                  
                                  return (port, TIMEOUT_ERROR)
                              
                              def loop(scan):
                                  
                                  for port in range(75,85):
                                      print(scan(ip,port))
                              
                              def range_p(scan):
                              
                                  for port in PORT_L:
                                      print(scan(ip,port))
                                  
                              
                              
                              
                              address = raw_input("Enter an U.R.L or  I.P: ")
                              choice = raw_input("Range or List scan (1 / 2 ):")
                              
                              try:
                                  ip = socket.gethostbyname(address)
                                  host = socket.gethostbyaddr(ip)         
                                  print "\nHOST: {}".format(host[0])
                                  print "{0} has the IP: {1}\n".format(address, ip)
                                  if choice == "1":
                                      loop(scan)
                                  else:
                                      PORT_L = raw_input("Enter port list separate by comma (,): ")
                                      print ""
                                      PORT_L = [int(i) for i in PORT_L.split(",")]
                                      range_p(scan)
                              except:
                                  print CONNERR

                              je vais maintenant tenter d'ajouter THREADING et ultérieurement QUEUE (et la va falloir que je fasse de recherche....et que je regardes a nouveau le module sur le threading de mon cours...), et bien sur toujours ouvert a vos propositions

                              ps: je tiens a préciser que ce scanner fait partie d'un exercice pour un cours python ou je me suis inscrit...., comme je l'ai dis a Fred je partagerais ici , certains de mes exercices (avec les erreurs que je commettrait, les tests , et le script final .....)
                              par contre je n'ai pas de date limite pour finir ce cours (juste pour l'examen final...)


                              Merci encore a tous pour vos idées (même si je comprends pas toujours tout , je tente de faire de mon mieux )
                              Dernière modification par blend, 12 juillet 2015, 16h07.

                              Commentaire

                              Chargement...
                              X