Python n’est pas seulement un langage pour faire des traitements sur les chaînes de caractères, mais aussi pour construire des applications beaucoup plus intéressantes.
Dans cet article je vais essayer d’ullistrer l’utilisation des socket avec python à travers quelques lignes de code.
Avec un minimum de bagage en TCP/IP, tout le monde sais que pour établir une connexion entre deux machines ils nous faut d’abord un protocole de transfert de donnée, puis une trame qui va envoyer notre information et bien sur l’adresse des deux machines, chacune de ces deux machines doit impérativement avoir un port ouvert pour établir la communication.
Dans cet exemple on va utiliser python pour faire un script simple avec deux fonctions la première va scanner les ports ouverts d’une ip donnée et les afficher, la deuxième va essayer d’établir une connexion avec un serveur Web et de nous renvoyer son ‘Header’.
Dans ce script le protocole utilisé est TCP, si vous souhaiter utiliser l’UDP vous n’avez qu’à remplacer SOCK_STREAM par SOCK_DGRAM .
Je vous laisse examiner le code et j’espère qu’il est suffisamment commenté.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import httplib, socket #l'import de module necessaires from socket import error maxp = 100 #le numero de port maximum => de 0 jusqu'a 1000 timeout = 2. #si notre trame n'a pas pu etablir #une connexion dans 2 secondes , donc le port est fermé def scan(h): print "Starting Scann ...nOpen Ports In %s Are :" % (h) print '< Port >' p = 0 while p <= maxp: try: #creation de notre socket en TCP s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(timeout) #definition du timeout s.connect((h,p)) #ici la trame va essayer de se connecter print ' ', p s.close() p+= 1 #exception levée quand la trame n'arrive pas a se connecté except socket.error: s.close() p+= 1 print "Scan Complete For : [%s]" %(h) #deuxième fonction qui va nous retourner le HEADER d'un server web def scansrv(h): #connexion avec le serveur con = httplib.HTTPConnection(h, 80) print "Trying To Scan : %s" %(h) try: con.request('HEAD', '/') #on essaye d'avoir le HEADER #exception levée quand le port 80 est fermé ou quand l'IP est down except error: print "Can't Connect To : %s" %(h) else: #sinon si tout marche bien , on recupère la réponse response = con.getresponse() con.close #puis on recupere le HEADER et on l'affiche server = response.getheader('Server', 'Version du serveur inconnu') print "[%s], Is Running : %s" %(h,server) |
Ces deux fonctions sont extraites de Perfect-Scanner, un scanner de port que j’avais codé ça fait un bout de temps, vous pouvez télécharger le script complet ici et vaux mieux le tester dans une machine linux, car sous Windows ça peut planter sauf si vous spécifier un intervalle de ports pas supérieur à 1000 avec un timeout d’une demi seconde.
Ce problème sous Windows peut être facilement réglé si on utilise les Threads d’exécution, sinon sous linux ça marche déjà bien !
le script est en GPL et il est là pour des raisons purement educatives.
Et voici ce que ça donne sous Windows
Starting Scann ... Open Ports In 127.0.0.1 Are : < Port > 80 Scan Complete For : [127.0.0.1] >>> Trying To Scan : 127.0.0.1 [127.0.0.1], Is Running : Apache/1.3.33 (Win32) PHP/4.3.10
Voila !
Recent Comments