Nmap es probablemente una de las herramientas más conocidas y
utilizadas en el mundo del pentesting y no es para menos, ya que se
trata de un escaner que no solamente permite encontrar puertos abiertos
en un máquina o segmento de red, sino que también permite ejecutar
scripts NSE (Nmap Scripting Engine) para filtrar información o detectar vulnerabilidades sobre el objetivo.
Algunas de las caracterÃsticas avanzadas que incluye Nmap y que son
igualmente útiles para pentesters, administradores de sistemas y
atacantes, se listan a continuación:
- Implementación de técnicas de evasión de IDS/IPS y Firewalls
- Permite ejecutar varias técnicas de escaneo, entre las que se incluyen escaneos del tipo XMAS, Null, Fin, Stealth, entre muchos otros.
- Permite la fragmentación de paquetes a la hora de realizar el escaneo. La finalidad de esta técnica es la de dificultar la identificación del escaneo por parte de mecanismos como IDS o IPS
- Generación aleatoria de hosts y señuelos como origen de los paquetes
- Ejecución de scripts NSE, asà como la posibilidad de crear scripts personalizados utilizando lenguaje LUA.
- Capacidad de ejecutar “Idle scans” que permiten utilizar un host cuyo manejo del numero de secuencia de los paquetes IP es predecible. (ver: http://nmap.org/book/idlescan.html)
- Capacidad de controlar la frecuencia en la que se envÃan los paquetes de datos al sistema objetivo. De esta forma es posible controlar cada cuanto se envÃan paquetes para la detección del estado de un puerto.
Estas son tan solo algunas de las caracterÃsticas que convierten a Nmap
en una herramienta que se debe de encontrar en el arsenal de cualquier
pentester.
Sin embargo, en ocasiones es muy útil poder automatizar su uso por medio
de scripts o rutinas externas. En el caso de Python, es posible hacerlo
como con cualquier otro ejecutable, se puede crear un proceso
utilizando la utilidad subprocess de Python y ejecutar Nmap con los
argumentos adecuados. No obstante, hacerlo de esta forma puede resultar
ineficiente, ya que seria necesario parsear los contenidos del canal
estándar de salida (stdout) para que la información retornada por Nmap
pueda ser útil desde un script. Una solución mucho más adecuada para
este propósito y desde luego mucho más elegante, es utilizando una
librerÃa que se encargue de estos detalles y devuelva una estructura de
datos consistente con los resultados devueltos por Nmap. Una de las
mejores alternativas es python-nmap
Utilizando Python-nmap
Python-nmap es una librerÃa que se encuentra en desarrollo continuo y
que a la fecha de escribir este documento, soporta todas las
caracterÃsticas disponibles en la ultima versión de Nmap. Existen dos
versiones que permiten operar con Python 3.x y Python 2.x, lo cual es
importante tenerlo en cuenta a la hora de instalar dicha librerÃa. Por
otro lado, con esta librerÃa es posible ejecutar escaneos de forma
sÃncrona o asÃncrona. Un escaneo sÃncrono, consiste simplemente en que
python-nmap bloqueará el hilo de ejecución principal hasta que el
escaneo finalice su ejecución. Un escaneo asÃncrono ejecuta el escaneo
Nmap en un nuevo hilo de ejecución y permite que el hilo principal siga
ejecutándose. En un escaneo asÃncrono, se permite la definición de una
función de callback que será invocada de forma automática cuando se obtenga un resultado sobre alguno de los puertos analizados.
Para instalar la librerÃa, se sigue el mismo procedimiento que muchas de
las librerÃas disponibles para Python, consiste simplemente en ejecutar
el script setup.py con el argumento install el cual se encuentra ubicado en el directorio raÃz del paquete descargado.
#python setup.py install
|
El uso básico de la librerÃa es por medio de la clase PortScanner. Dicha clase implementa todas las funciones necesarias para ejecutar un escaneo y recuperar la información retornada por Nmap.
#python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import nmap
>>>nm = nmap.PortScanner()
>>>results = nm.scan('127.0.0.1', '22,25,80,443')
>>> nm.scaninfo()
{u'tcp': {'services': u'22,25,80,443', 'method': u'syn'}}
>>> nm.command_line()
u'nmap -oX - -p 21,22,25,80,443 -sV 127.0.0.1'
>>> nm.all_hosts()
[u'127.0.0.1']
|
Desde el interprete de Python, se ha creado un objeto del tipo PortScanner y luego se ha ejecutado un escaneo contra la máquina local en los puertos 22, 25, 80 y 443. Las funciones scaninfo, command_line y all_host devuelven
información general sobre el escaneo ejecutado, el comando Nmap
ejecutado y todos los hosts que han sido analizados en el escaneo.
>>> print(nm.csv())
host;protocol;port;name;state;product;extrainfo;reason;version;conf
127.0.0.1;tcp;22;ssh;open;;;no-response;;3
127.0.0.1;tcp;25;smtp;unknown;;;no-response;;3
127.0.0.1;tcp;80;http;unknown;;;no-response;;3
127.0.0.1;tcp;443;https;unknown;;;no-response;;3
>>> nm['127.0.0.1']['tcp'][22]['state']
u'open'
>>> nm.all_hosts()
[u'127.0.0.1']
>>> nm['127.0.0.1']['tcp'][22]
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}
|
Como se puede apreciar, es posible recorrer el diccionario que contiene
los resultados utilizando como claves, el host analizado, el protocolo y
el puerto analizado. Se trata de un diccionario anidado y como tal,
puede ser recorrido utilizando instrucciones y funciones estándar del
lenguaje.
Por otro lado, se trata de una librerÃa que permite ejecutar Nmap de
forma personalizada, del mismo modo que lo harÃa un pentester o
administrador de sistemas desde linea de comandos, especificando los
argumentos necesarios para la ejecución del escaneo.
>>> results = nm.scan('88.12.45.12', arguments="-sSV -A -n -T2")
>>> type(results)
<type 'dict'>
>>> results['scan'].keys()
[u'88.12.45.12']
>>> results = nm.scan('77.80.25.244', arguments="-sSV -A -n --source-port 88 -D 22.22.22.22,33.33.33.33,RND:4,ME")
>>> type(results)
<type 'dict'>
>>> results['scan'].keys()
[u'77.80.25.244']
|
Con el parámetro “arguments” es posible especificar las opciones que
recibirá Nmap para ejecutar el escaneo contra los objetivos definidos.
Con esto, es posible controlar mucho mejor el proceso de escaneo.
Finalmente, tal y como se comentaba anteriormente, es posible ejecutar un escaneo asÃncrono utilizando python-nmap tal y como se detalla a continuación.
#python
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import nmap
>>> nma = nmap.PortScannerAsync()
>>> def asynScan(host, result):
... print host, result
...
>>> nma.scan('127.0.0.1', arguments="-sSV -A -n", callback=asynScan)
>>> while nma.still_scanning():
... nma.wait(2)
...
>>>
|
Para implementar un escaneo asÃncrono, se debe utilizar la clase PortScannerAsync la cual es exactamente igual a la clase PortScanner con
la diferencia de que incluye un argumento adicional que permite definir
una función de callback y cuenta con algunas funciones adicionales para
controlar el proceso de escaneo en el caso de ser necesario.
Python-nmap es una muy buena solución que permite implementar las
funcionalidades completas de Nmap desde cualquier script en python. Se
trata desde luego, de una utilidad que viene muy bien a cualquier
proyecto relacionado con la seguridad informática o para el uso de un
pentester profesional.
fuente :flu-project
0 comentarios:
Publicar un comentario