Scanner de ports en Python (Phase2)

 

 

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:

if __name__ == '__main__':
    main()

 

Je remets pour informations le code au complet avec son extension.

# coding: utf-8

import socket
from multiprocessing import Pool
from datetime import datetime


open_p, closed_p = [], []
reponse = ["OPEN PORTS","CLOSED PORTS","SCANNING PORTS","TYPE",
           "SCANNING","ADDRESS","NUMBER OF PROCESSES","RANGE MIN","RANGE MAX","HOST","HAS IP","UNREACHABLE"]



target_ip = raw_input("{}: ".format(reponse[5]))
try:
    ip = socket.gethostbyname(target_ip)
    host = socket.gethostbyaddr(target_ip)
    print ""
    print "{0} {1}: {2}".format(reponse[5], reponse[10], ip)
    print "{0} :{1}".format(reponse[9], host[0])
    print ""
except:
    print "{0} {1}".format(reponse[5], reponse[11])

num_procs = int(raw_input("{0}: ".format(reponse[6])))
minp = int(raw_input("{0}: ".format(reponse[7])))
maxp = int(raw_input("{0}: ".format(reponse[8])))
print "{0}:{1}\n".format(reponse[4],ip)


startTime = datetime.now()
print "DEPART COMPTEUR: ", startTime



def scan(arg):
    target_ip, port = arg
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(.17)
    result = sock.connect_ex((target_ip,port))
    if result == 0:
        sock.shutdown(2)
        return port, True
    else:
        return port, False
        sock.close


def main():
    ports = range(minp, maxp+1)
    pool = Pool(processes=num_procs)
    print "{0}: ".format(reponse[2])
    for port, status in pool.imap_unordered(scan, [(target_ip, port)for port in ports]):
        print port,
        open_p.append(port)if status else closed_p.append(port)



if __name__ == '__main__':
    main()


print "\n\nOPEN PORTS: ", open_p,"\n"
print "BANNER GRABING...\n"

for elements in open_p:
    try:
        print "{0} {1} :{2}".format(elements,reponse[3],socket.getservbyport(elements))
    except:
        continue
    addr = (target_ip,elements)
    sock = socket.socket()
    sock.settimeout(.17)
    sock.connect_ex(addr)
    sock.send ("GET / HTTP/1.0\r\nHost: " + target_ip + "\r\n\r\n")
    try:
        print sock.recv(1024), "\n"
        sock.close()
    except:
        print "NON3\n"
        sock.close

print "\n\n\nTOTAL TIME: ",datetime.now() - startTime

 

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

Please like us:

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *