Nmap y Python: Escaneo de Puertos
Hola amigos de Internet. Mi nombre es Luis, y les doy la bienvenida a Mi Diario Python.
En el articulo de hoy, veremos como podemos escanear puertos con nmap desde ¨Python.
Te mostrare lo fácil que es extraer información de un host utilizando nmap.
Sin más preámbulos, comencemos.
Instalación de nmap
Para instalar nmap, lo único que debemos hacer, es ingresar el siguiente comando en nuestra terminal o consola.
windows:
py -m pip install python-nmap
Linux:
python -m pip install python-nmap
Muy fácil ¿No crees?. La instalación no durara más de un minuto.
Y listo. Ya podemos empezar a utilizar nmap.
Escaneando puertos
Muy bien, ya podemos empezar a realizar la magia.
Nmap nos proporciona la clase PortScanner(), que como habrás imaginado, nos permite realizar el escaneo.
>>> import nmap
>>> nscan = nmap.PortScanner()
Luego utilizamos el método scan (adivina para que). Al método scan le pasamos dos argumentos: la IP o el host, y el rango de puertos a escanear.
>>> nscan.scan('scanme.nmap.org','22/443')
{'nmap': {'command_line': 'nmap -oX - -p 22-443 -sV scanme.nmap.org', 'scaninfo': {'t
cp': {'method': 'syn', 'services': '22-443'}}, 'scanstats': {'timestr': 'Wed Feb 06 1
4:05:16 2019', 'elapsed': '42.29', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1
'}}, 'scan': {'45.33.32.156': {'hostnames': [{'name': 'scanme.nmap.org', 'type': 'use
r'}, {'name': 'scanme.nmap.org', 'type': 'PTR'}], 'addresses': {'ipv4': '45.33.32.156
'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'reset'}, 'tcp': {22: {'state':
'open', 'reason': 'syn-ack', 'name': 'ssh', 'product': 'OpenSSH', 'version': '6.6.1p
1 Ubuntu 2ubuntu2.11', 'extrainfo': 'Ubuntu Linux; protocol 2.0', 'conf': '10', 'cpe'
: 'cpe:/o:linux:linux_kernel'}, 23: {'state': 'filtered', 'reason': 'no-response', 'n
ame': 'telnet', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''
}, 25: {'state': 'filtered', 'reason': 'no-response', 'name': 'smtp', 'product': '',
'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}, 80: {'state': 'open', 'reaso
n': 'syn-ack', 'name': 'http', 'product': 'Apache httpd', 'version': '2.4.7', 'extrai
nfo': '(Ubuntu)', 'conf': '10', 'cpe': 'cpe:/a:apache:http_server:2.4.7'}}}}}
’scanme.nmap.org’ es un host que nos proporciona nmap para realizar nuestras pruebas. ‘22/443’ significa que escanearemos desde el puerto 22 hasta el 443.
El resultado es información muy relevante. Sabemos que el sistema operativo del servidor es Ubuntu. La dirección IP es 45.33.32.156. El puerto 22 y 80 están abiertos. Y bueno, mucha información. Sabemos que con esta información se pueden saber las debilidades de un sistema para luego poder explotarlas. Así que te pido que utilices con mucha responsabilidad y ética, estas herramientas. Como dice el viejo adagio: “Un gran poder, conlleva a una gran responsabilidad”.
Muy bien, prosigamos.
Extracción de información
Nmap nos proporciona funciones para extraer la información de manera mas eficiente. Veamos algunas de ellas:
>>> nmscan.all_hosts() # Obtener todos los host
['45.33.32.156']
>>> nmscan.scaninfo() # Informacion sobre el escaneo
{'tcp': {'method': 'syn', 'services': '22-443'}}
>>> nmscan['45.33.32.156'].all_protocols() # Obtener protocolos
['tcp']
>>> nmscan['45.33.32.156'].hostsnames() # nombre del host
[{'name': 'scanme.nmap.org', 'type': 'user'}, {'name': 'scanme.nmap.org', 'type': 'PT
R'}]
>>> s['45.33.32.156'].state() # estado del host
'up'
Sistema operativo del host
Si, ya sabemos que es Ubuntu. Pero con nmap podemos extraer más información. Para ello utilizaremos los argumentos de las siguiente manera:
>>> ScanOS = s.scan("scanme.nmap.org", arguments="-sS -O")
{'nmap': {'command_line': 'nmap -oX - -p 22-443 -sS -O scanme.nmap.org', 'scaninfo':
{'tcp': {'method': 'syn', 'services': '22-443'}}, 'scanstats': {'timestr': 'Wed Feb 0
6 15:33:05 2019', 'elapsed': '36.37', 'uphosts': '1', 'downhosts': '0', 'totalhosts':
'1'}}, 'scan': {'45.33.32.156': {'hostnames': [{'name': 'scanme.nmap.org', 'type': '
user'}, {'name': 'scanme.nmap.org', 'type': 'PTR'}], 'addresses': {'ipv4': '45.33.32.
156'}, 'vendor': {}, 'status': {'state': 'up', 'reason': 'reset'}, 'uptime': {'second
s': '3126784', 'lastboot': 'Tue Jan 01 11:00:01 2019'}, 'tcp': {22: {'state': 'open',
'reason': 'syn-ack', 'name': 'ssh', 'product': '', 'version': '', 'extrainfo': '', '
conf': '3', 'cpe': ''}, 23: {'state': 'filtered', 'reason': 'no-response', 'name': 't
elnet', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}, 25: {
'state': 'filtered', 'reason': 'no-response', 'name': 'smtp', 'product': '', 'version
': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}, 80: {'state': 'open', 'reason': 'syn
-ack', 'name': 'http', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'c
pe': ''}}, 'portused': [{'state': 'open', 'proto': 'tcp', 'portid': '22'}, {'state':
'closed', 'proto': 'tcp', 'portid': '24'}, {'state': 'closed', 'proto': 'udp', 'porti
d': '40889'}], 'osmatch': [{'name': 'Linux 3.10 - 4.8', 'accuracy': '98', 'line': '60
500', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux',
'osgen': '3.X', 'accuracy': '98', 'cpe': ['cpe:/o:linux:linux_kernel:3']}, {'type':
'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '4.X', 'accuracy'
: '98', 'cpe': ['cpe:/o:linux:linux_kernel:4']}]}, {'name': 'Linux 3.2 - 4.8', 'accur
acy': '97', 'line': '62168', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux
', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '97', 'cpe': ['cpe:/o:linux:linux
_kernel:3']}, {'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'os
gen': '4.X', 'accuracy': '97', 'cpe': ['cpe:/o:linux:linux_kernel:4']}]}, {'name': 'L
inux 3.16 - 4.6', 'accuracy': '96', 'line': '61251', 'osclass': [{'type': 'general pu
rpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '96', 'cp
e': ['cpe:/o:linux:linux_kernel:3']}, {'type': 'general purpose', 'vendor': 'Linux',
'osfamily': 'Linux', 'osgen': '4.X', 'accuracy': '96', 'cpe': ['cpe:/o:linux:linux_ke
rnel:4']}]}, {'name': 'Linux 2.6.32 - 3.13', 'accuracy': '96', 'line': '53811', 'oscl
ass': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '
2.6.X', 'accuracy': '96', 'cpe': ['cpe:/o:linux:linux_kernel:2.6']}, {'type': 'genera
l purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '96',
'cpe': ['cpe:/o:linux:linux_kernel:3']}]}, {'name': 'Linux 2.6.22 - 2.6.36', 'accura
cy': '95', 'line': '49107', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux'
, 'osfamily': 'Linux', 'osgen': '2.6.X', 'accuracy': '95', 'cpe': ['cpe:/o:linux:linu
x_kernel:2.6']}]}, {'name': 'Linux 3.10', 'accuracy': '94', 'line': '60119', 'osclass
': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X
', 'accuracy': '94', 'cpe': ['cpe:/o:linux:linux_kernel:3.10']}]}, {'name': 'Linux 4.
4', 'accuracy': '94', 'line': '64163', 'osclass': [{'type': 'general purpose', 'vendo
r': 'Linux', 'osfamily': 'Linux', 'osgen': '4.X', 'accuracy': '94', 'cpe': ['cpe:/o:l
inux:linux_kernel:4.4']}]}, {'name': 'Linux 2.6.32', 'accuracy': '94', 'line': '52612
', 'osclass': [{'type': 'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'o
sgen': '2.6.X', 'accuracy': '94', 'cpe': ['cpe:/o:linux:linux_kernel:2.6.32']}]}, {'n
ame': 'Linux 2.6.32 - 3.10', 'accuracy': '93', 'line': '53781', 'osclass': [{'type':
'general purpose', 'vendor': 'Linux', 'osfamily': 'Linux', 'osgen': '2.6.X', 'accurac
y': '93', 'cpe': ['cpe:/o:linux:linux_kernel:2.6']}, {'type': 'general purpose', 'ven
dor': 'Linux', 'osfamily': 'Linux', 'osgen': '3.X', 'accuracy': '93', 'cpe': ['cpe:/o
:linux:linux_kernel:3']}]}, {'name': 'HP P2000 G3 NAS device', 'accuracy': '93', 'lin
e': '32611', 'osclass': [{'type': 'storage-misc', 'vendor': 'HP', 'osfamily': 'embedd
ed', 'osgen': None, 'accuracy': '93', 'cpe': ['cpe:/h:hp:p2000_g3']}]}]}}}
>>>
De esta manera tendremos información más especifica acerca del sistema operativo.
Excelente. ¿Alguna duda? ¿Alguna sugerencia? Déjanos tu comentario y con mucho gusto te responderemos.
Sin más nada que decir. Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
Deja una respuesta
Buen dia Luis. Agradecido por tus aportes. Tengo una pregunta: ¿ y si el sistema operativo fuese Windows 7 ultimate de que forma reescribiriamos las instrucciones?. Gracias de antemano, desde Venezuela !