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.
Índice()

    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.
    1. instrumentacion dice:

      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 !

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Te has suscrito correctamente al boletín

    Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

    Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.