
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:
El resultado esperado es :

y el resultado que estoy obteniendo es el siguiente :

Agradezco la ayuda !
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 :

y el resultado que estoy obteniendo es el siguiente :

Agradezco la ayuda !
Valora esta pregunta


0