lunes, 21 de junio de 2010

Nmap Querier (NQu)

Durante la ejecución de un pentest, recurrimos a muchas herramientas para obtener información que nos llevará a conducir el test de intrusión por un camino u otro. Entre esas herramientas se encuentra la vetusta nmap que ya ha alcanzado su versión 5 y que hemos podido ver en un buen número de largometrajes. Una de las opciones más interesantes de NMAP es la opción de exportación de los resultados. Estos ficheros nos sirven para automatizar el ataque usando otras herramientas o simplemente tener un resumen de lo que ha encontrado. Algunas aplicaciones como Nessus o su fork open source, Openvas, permiten importar los resultados para afinar la ejecución de sus plugins y acotar el ámbito de ataque.

Figura 1 Escaneando una red interna

Desde blueliv, hemos querido contribuir un poco a esa gestión de la información con una herramienta llamada NQu (Nmap Querier). NQu permite importar los resultados de NMAP y ejecutar sentencias de SQL sobre esos resultados, de tal forma que podamos ver la información que creamos más relevante para luego guardarla:

Figura 2 Ventana principal de NQu

NQu lee la salida en formato XML generada por NMAP (opción -oX). Desde la pantalla principal, el botón Importar XML permite seleccionar el fichero a importar:

Figura 3 Fichero XML importado

Imaginaros el supuesto de que se quiera lanzar un ataque de diccionario sobre SSH. Desde el cuadro "Consulta SQL" podemos filtrar los datos obtenidos por NMAP para obtener un listado de todos los hosts con el puerto "SSH" a la escucha:

Figura 4 Con una simple SQL podremos filtrar los resultados

Una serie de consideraciones a tener en cuenta cuando se use la herramienta:
  • Los nombres de los campos corresponden con los nombres de las columnas
  • No está permitido el uso de comillas dobles (")
  • Para ejecutar la query, habrá que posicionarse al final y pulsar enter
  • Admite drag and drop de ficheros XML de nmap
  • Las columnas se pueden ordenar a vuestro antojo
La parte más interesante de NQu es la posibilidad de guardar los datos resultantes en cualquier formato que la imaginación y los conocimientos de Javascript permitan. A la hora de guardar el resultado de la query, se puede seleccionar un script javascript que preprocesará los datos antes de salvarlos. Por defecto, podemos grabarlos en formato xml, entre otros:

Figura 5 Selección del formato de salida

Después de salvar el archivo, el contenido de nmap-nqu.xml quedaría así:


Figura 6 Resultado de la exportación

Escribir scripts para formatear los resultados es muy sencillo. A continuación, os muestro un ejemplo de script que guardar los datos en el formato IP:puerto1,puerto2,puerto3,...:

importPackage(com.blueliv.nmap.model);
function processNmap(hosts){
for(i=0;i<hosts.size();i++){
println(hosts.get(i).getIpAddress()+':'+ hosts.get(i).getPortsAsCSV());
}
}

Los ficheros tienen que estar en el directorio scripts de la aplicación. Por defecto no está creado, así que habrá que hacerlo a mano. Una vez se haya guardado el fichero en el directorio, aparecerá en el cuadro desplegable de la opción Guardar.


La API

Además de las funciones de Javascript, el paquete com.blueliv.nmap.model nos proporciona una API para poder jugar con los resultados. En la variable hosts, tenemos una lista de objetos que nos ofrecen los siguientes métodos:

  • getStatus(): Obtiene el estado
  • getIpAddress(): Obtiene la IP
  • getIpAddressType(): Obtiene el tipo de dirección
  • getMacAddress(): Mac address de la máquina
  • getHostNames(): Nombre de host
  • getPorts(): Devuelve una colección de puertos.
  • getPortsAsCSV(): Devuelve la lista de puertos en formato CSV
  • getHostNamesAsCSV(): Devuelve la lista de nombres en formato CSV

De la colección de puertos se puede obtener la siguiente información:

  • getProtocol(): Protocolo
  • getPortNumber(): Puerto de escucha
  • getState(): Estado (abierto, filtrado,...)
  • getServiceName(): Nombre real del servicio
  • getServiceState(): Estado del servicio
  • getServiceProduct(): Aplicación a la escucha
  • getServiceVersion(): Version
  • getServiceTunnel(): Tunel (valor booleano)
  • getServiceOsType(): Sistema operativo
La herramienta también permite su uso sin un entorno gráfico para añadirla a vuestros proprios scripts. La encontrareis para descargar desde aquí.

Saludos,