Comme un scan de port n’est rien sans un petit banner grabbing. Je vous propose de compléter le script utilisé dans le premier article. Afin d’extraire les versions des différents services utilises par les ports ouverts découverts durant le scan de Metasploitable.
La partie intéressante destinée a la récupérations des différentes bannières se situe a la fin du code, juste après:
[pastacode lang=”python” manual=”if%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20%20main()” message=”” highlight=”” provider=”manual”/]
Je remets pour informations le code au complet avec son extension.
[pastacode lang=”python” manual=”%23%20coding%3A%20utf-8%0A%0Aimport%20socket%0Afrom%20multiprocessing%20import%20Pool%0Afrom%20datetime%20import%20datetime%0A%0A%0Aopen_p%2C%20closed_p%20%3D%20%5B%5D%2C%20%5B%5D%0Areponse%20%3D%20%5B%22OPEN%20PORTS%22%2C%22CLOSED%20PORTS%22%2C%22SCANNING%20PORTS%22%2C%22TYPE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%22SCANNING%22%2C%22ADDRESS%22%2C%22NUMBER%20OF%20PROCESSES%22%2C%22RANGE%20MIN%22%2C%22RANGE%20MAX%22%2C%22HOST%22%2C%22HAS%20IP%22%2C%22UNREACHABLE%22%5D%0A%0A%0A%0Atarget_ip%20%3D%20raw_input(%22%7B%7D%3A%20%22.format(reponse%5B5%5D))%0Atry%3A%0A%20%20%20%20ip%20%3D%20socket.gethostbyname(target_ip)%0A%20%20%20%20host%20%3D%20socket.gethostbyaddr(target_ip)%0A%20%20%20%20print%20%22%22%0A%20%20%20%20print%20%22%7B0%7D%20%7B1%7D%3A%20%7B2%7D%22.format(reponse%5B5%5D%2C%20reponse%5B10%5D%2C%20ip)%0A%20%20%20%20print%20%22%7B0%7D%20%3A%7B1%7D%22.format(reponse%5B9%5D%2C%20host%5B0%5D)%0A%20%20%20%20print%20%22%22%0Aexcept%3A%0A%20%20%20%20print%20%22%7B0%7D%20%7B1%7D%22.format(reponse%5B5%5D%2C%20reponse%5B11%5D)%0A%0Anum_procs%20%3D%20int(raw_input(%22%7B0%7D%3A%20%22.format(reponse%5B6%5D)))%0Aminp%20%3D%20int(raw_input(%22%7B0%7D%3A%20%22.format(reponse%5B7%5D)))%0Amaxp%20%3D%20int(raw_input(%22%7B0%7D%3A%20%22.format(reponse%5B8%5D)))%0Aprint%20%22%7B0%7D%3A%7B1%7D%5Cn%22.format(reponse%5B4%5D%2Cip)%0A%0A%0AstartTime%20%3D%20datetime.now()%0Aprint%20%22DEPART%20COMPTEUR%3A%20%22%2C%20startTime%0A%0A%0A%0Adef%20scan(arg)%3A%0A%20%20%20%20target_ip%2C%20port%20%3D%20arg%0A%20%20%20%20sock%20%3D%20socket.socket(socket.AF_INET%2C%20socket.SOCK_STREAM)%0A%20%20%20%20sock.settimeout(.17)%0A%20%20%20%20result%20%3D%20sock.connect_ex((target_ip%2Cport))%0A%20%20%20%20if%20result%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20sock.shutdown(2)%0A%20%20%20%20%20%20%20%20return%20port%2C%20True%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20return%20port%2C%20False%0A%20%20%20%20%20%20%20%20sock.close%0A%0A%0Adef%20main()%3A%0A%20%20%20%20ports%20%3D%20range(minp%2C%20maxp%2B1)%0A%20%20%20%20pool%20%3D%20Pool(processes%3Dnum_procs)%0A%20%20%20%20print%20%22%7B0%7D%3A%20%22.format(reponse%5B2%5D)%0A%20%20%20%20for%20port%2C%20status%20in%20pool.imap_unordered(scan%2C%20%5B(target_ip%2C%20port)for%20port%20in%20ports%5D)%3A%0A%20%20%20%20%20%20%20%20print%20port%2C%0A%20%20%20%20%20%20%20%20open_p.append(port)if%20status%20else%20closed_p.append(port)%0A%0A%0A%0Aif%20__name__%20%3D%3D%20’__main__’%3A%0A%20%20%20%20main()%0A%0A%0Aprint%20%22%5Cn%5CnOPEN%20PORTS%3A%20%22%2C%20open_p%2C%22%5Cn%22%0Aprint%20%22BANNER%20GRABING…%5Cn%22%0A%0Afor%20elements%20in%20open_p%3A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20print%20%22%7B0%7D%20%7B1%7D%20%3A%7B2%7D%22.format(elements%2Creponse%5B3%5D%2Csocket.getservbyport(elements))%0A%20%20%20%20except%3A%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20addr%20%3D%20(target_ip%2Celements)%0A%20%20%20%20sock%20%3D%20socket.socket()%0A%20%20%20%20sock.settimeout(.17)%0A%20%20%20%20sock.connect_ex(addr)%0A%20%20%20%20sock.send%20(%22GET%20%2F%20HTTP%2F1.0%5Cr%5CnHost%3A%20%22%20%2B%20target_ip%20%2B%20%22%5Cr%5Cn%5Cr%5Cn%22)%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20print%20sock.recv(1024)%2C%20%22%5Cn%22%0A%20%20%20%20%20%20%20%20sock.close()%0A%20%20%20%20except%3A%0A%20%20%20%20%20%20%20%20print%20%22NON3%5Cn%22%0A%20%20%20%20%20%20%20%20sock.close%0A%0Aprint%20%22%5Cn%5Cn%5CnTOTAL%20TIME%3A%20%22%2Cdatetime.now()%20-%20startTime” message=”” highlight=”” provider=”manual”/]
Un bref aperçu d’un scan de Metasploitable affichera comme prévu la liste des ports ouverts, mais aussi leur versions des services. Voici donc une copie d’écran des informations intéressantes extraites par ce script.
Vous pourrez maintenant utiliser ce script ainsi que les informations retournées par celui-ci dans vos propres CTF ou test de vulnérabilité afin de vérifier quels sont les ports d’ouverts et quelles sont les version des services. Mais aussi si les versions des différents services sont vulnérables. Grâce aux différentes ressources disponible sur internet que je vous ai énumérées ici.
Je vous invite a explorer et disséquer ce script afin de comprendre son fonctionnement. Je vous invite aussi a le modifier car il n’est évidement pas parfait (il est loin de l’être). Mais il serait sympa de mentionner sa source en ajoutant un commentaire avec le lien de cet article ainsi que le nom de mon blog si vous comptez l’utiliser.
N’oubliez pas que l’utilisation des différents outils et techniques pourrait dans certaines circonstances vous mettre hors la loi. Veuillez respecter la législation en vigueur en France en suivant les consignes que j’ai publie dans l’article intitulé “Rappel des textes en vigueur concernant les atteintes aux systèmes de traitement automatisé de données“