domingo, 6 de septiembre de 2015

Accediendo a nMap desde Python

Ya hace tiempo, al inicio de este blog, dediqué varios capítulos a nMap, uno de los más potentes scanneres de red. En este artículo vamos a volver a nMap pero tratándolo de otra manera.
Vamos a acceder a los servicios de nMap desde un programa en Python.
El acceso a nMap nos permite automatizar ciertas tareas que realizamos de forma rutinaria, por ejemplo chequeos periódicas de nuestras instalaciones y, lo más importante en mi opinión, poder guardar esta información en una base de datos.

Y sin decir mucho más creo que a todos se nos hace obvio el abanico de posibilidades que se nos abre, así que pasemos a la acción.


Instalando la biblioteca

La comunicación entre Python y nMap se consigue con la biblioteca python-nmap que se puede descargar  de este enlace http://xael.org/norman/python/python-nmap/
Hay que tener cuidado y descargar la versión que es compatible con nuestro Python (2.7 o 3x)
Descomprimimos el fichero zip descargado y desde el mismo directorio donde hemos realizado la descompresión ejecutamos:

python setup.py install

Esperamos a que el script nos informe de que el proceso de instalación ha finalizado correctamente.
Ya estamos en condiciones de trabajar con nMap desde python. Lo primero que haremos es verificar que python está correctamente instalado.

Abrimos una sesión online de python e importamos la biblioteca. Si no hay mensajes de informen de errores listamos los elementos de esta biblioteca.

Navegando por la información

Una vez importada la bibioteca nmap listamos el contenido: dir(nmap)



Vemos hay hay varias funciones del tipo PortScanner y que son las que nos permitirán lanzar los test de nMap.

Vamos primero a familiarizarnos con la información que obtenemos



Para mejor entender la información que no da voy a formatear la información para que sea más compresible



{'nmap': {
    ' scanstats': {
        'uphosts': '1',
        'timestr': 'Mon Aug 31 18:29:00 2015',
        'downhosts': '0', 'totalhosts': '1',
        'elapsed': '1.40'},
    'scaninfo': {
        'tcp': {
            'services': '22',
            'method': 'connect'}},
    'command_line': 'nmap -oX - -p 22 -sV 192.168.1.137'},                               
    'scan': {
        '192.168.1.137': {
            'status': {
                 'state': 'up',
                 'reason': 'conn-refused'},
            'hostnames': [],
            'vendor': {},
            'addresses': {
                'ipv4': '192.168.1.137'},
           'tcp': {
                22: {
                     'product': 'OpenSSH',
                     'state': 'open',
                     'version': '6.0p1 Debian 4+deb7u2',
                     'name': 'ssh',
                     'conf': '10',
                     'extrainfo': 'protocol 2.0',
                     'reason': 'syn-ack',
                     'cpe': 'cpe:/o:linux:linux_kernel'}}}}} }

Podemos acceder a la información usando los métodos que nos proporciona el objeto PortScanner:




Por cada dirección IP scaneada obtenemos un objeto de tipo host. Por ejemplo si hubieramos ejecutado el siguiente portscan:

nm.scan('192.168.1.0/24', '22')

Obtenemos una salida similar a esta




Que de forma más esquemática quedaría así:



Tenemos una lista hosts cada uno identificado por su dirección IP, y para acceder a cada uno de ellos usamos la forma habitual de python para manejar listas



Podemos intentar localizar un host determinado con el método has_host


Con esta introducción ya estamos en consecuencia de realizar nuestro primer programa python que será muy sencillo.

Lo único que hará el programa es realizar un scan de un rango de direcciones y por cada host que encuentre creará una entrada en una lista y Y cuando finalice mostrará en pantalla la lista de equipos que haya encontrado y su dirección IP.


import nmap
class NmapHost:
    def __init__(self):
        self.host = None
        self.state = None
        self.reason = None

def parseNmapScan(scan):
    nmapHosts = []
    for host in scan.all_hosts():
        nmapHost = NmapHost()
        nmapHost.host = host
        if scan[host].has_key('status'):
            nmapHost.state = scan[host]['status']['state']
            nmapHost.reason = scan[host]['status']['reason']
            if scan[host].has_key('addresses'):
                if scan[host]['addresses'].has_key('mac'):
                    nmapHost.mac = scan[host]['addresses']['mac']
                else:
                    nmapHost.mac = '00:00:00:00:00:00:00'
                nmapHost.ipV4 = scan[host]['addresses']['ipv4']
           
        nmapHosts.append(nmapHost)                   
    return nmapHosts
if __name__ == '__main__':
    nm = nmap.PortScanner()
    nm.scan('192.168.1.0/24', '22-500')
    structureNmap = parseNmapScan(nm)
    for nmapHost in structureNmap:
        print '[-] Host: ' + nmapHost.host + ' is ' + nmapHost.state
        if  nmapHost.mac != '00:00:00:00:00:00:00':
            print '[-]         MAC: ' + nmapHost.mac
        print '[-]         IP V4: ' + nmapHost.ipV4


El programa no requiere mucha más explicación y nos da un código mínimo para aprender la listar el resto de la información suministrada por el método PortScanner

No hay comentarios:

Publicar un comentario