Python - banner grabbing no muestra servicios

 
Vista:
Imágen de perfil de gustavo

banner grabbing no muestra servicios

Publicado por gustavo (1 intervención) el 04/09/2021 21:32:41
Estoy teniendo inconveniente con el banner grabbing, ya que no me está mostrando los servicios asociados al puerto.

Detallo un poco lo que quiero resolver:

Tengo que descubrir las IP de la red en la que se encuentre mi máquina, en una determinada interfaz. Una vez haya encontrado las IP debe mostrar los puertos que tienen abiertos, tanto para TCP como para UDP, y junto al puerto, debe indicar el banner del servicio.

Mi código es el siguiente:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
def scan(self):
 
    respuesta = ''
 
    # Iniciamos el Escaner de Puertos
    nm = nmap.PortScanner()
    nm.scan('192.168.0.1/24', arguments='-sV -T4')
 
    # tomamos la lista de hosts
    hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
    hosts_ord = []
 
    # tomamos solo los que están 'up'
    for host, status in hosts_list:
        if status in 'up':
            hosts_ord.append(host)
 
    # Los ordenamos con sorted, struct e inet_aton
    hosts_ord = sorted(hosts_ord, key=lambda ip: struct.unpack("!L", inet_aton(ip))[0])
 
    # Por cada dispositivo encontrado:
    for h in hosts_ord:
        self.jsondata[h] = nm[h]
        print('IP {}'.format(h)) # Nombramos al dispositivo
        respuesta = '{}\nIP {}'.format(respuesta, h)
        print('=======================')
        respuesta = '{}\n======================='.format(respuesta)
        host_msg = '{}: '.format(h)
        protocolos = ['tcp','udp'] # Por cada protocolo que queremos filtrar
 
        for proto in protocolos:
            try:
                print('\t{}:'.format(proto.upper()))
                if nm[h][proto]:
                    respuesta = '{}\n\t{}'.format(respuesta,proto.upper())
                    puertos_cont = 0
                    for port in nm[h][proto].keys():
                        if nm[h][proto][port]['state'] == "open": # Si está abierto
                            puertos_cont += 1
                            puertos='{}: '.format(port)
                            #print(puertos)
                            banner = self.obtenerBanner(h,port) # Captura del Banner
                            if banner == '' or 'None' in banner or banner == None: # Si no devuelve banner
                                banner = '-'
                            print('\t\t{}:\t{}'.format(port, banner))
                            respuesta = '{}\n\t\t{}:\t{}'.format(respuesta, port, banner)
                    if puertos_cont == 0:
                        print('\t\tSin puertos abiertos')
                        respuesta = '{}\n\t\tSin puertos abiertos'.format(respuesta)
                    print('\n\n')
            except:
                pass
        print('--------------------------------')
        respuesta = '{}\n--------------------------------'.format(respuesta)
    return(respuesta)
 
 
    def obtenerBanner(self, ip_address, puerto):
        # Capturamos el Banner
        try:
            conexion=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            #conexion.settimeout(2)
            conexion.connect((ip_address,puerto))
            banner = conexion.recv(1024)
            conexion.close()
            return str(banner.decode('utf-8').rstrip('\n')) # Devolvemos decodificada para evitar b'' como string y quitamos el salto de línea posible
 
        except Exception as e:
             print (">>> Error de escaneo:", e)

El resultado esperado es :

RSyn5

y el resultado que estoy obteniendo es el siguiente :

cKfQE

Agradezco la ayuda !
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder