NMap: SCRIPTS

Nmap es una herramienta excepcional para realizar tareas de escaneo de redes y servicios, ya hemos publicado un post sobre los usos básicos, pero entre sus múltiples funcionalidades nos encontramos con algunas muy destacables como por ejemplo el motor de scripts NSE. Los scripts pueden realizar test concretos para complementar el análisis, gracias a esto podemos comprobar el estado de servicios, sacar información de éstos e incluso comprobar vulnerabilidades como shellshock, poodle o heartbleed. Su uso es bastante sencillo y no necesitamos descargarnos ningún archivo adicional. Además podemos crear nuestros propios scripts con lo que podemos probar todo lo que necesitemos.

Funcionamiento básico

Tenemos la lista completa de scripts en la página oficial de NMap, para adjuntar un script al escaneo de NMap usaremos el modificador –script seguido del nombre del script que queramos lanzar.

Para pasar argumentos al script lo haremos con el siguiente modificador:

--script-args=arg1=x,arg2=y,arg3=z...

Si queremos que muestre información acerca de la ejecución del script usaremos el siguiente modificador:

--script-trace

Si queremos obtener ayuda sobre un determinado script podemos usar el siguiente modificador:

--script-help <nombredelScript>

Para actualizar la base de datos de scripts usamos el siguiente modificador:

--script-updatedb

Para poder organizar un poco el uso de los scripts contamos con la posibilidad de usar puertas lógicas como OR, AND y NOT, esto nos será de utilidad a la hora de seleccionar entre los distintos scripts que tengamos que lanzar. Los scripts están organizados por distintas categorías, de esta forma podemos seleccionar los scripts que estén en una categoría determinada o excluirlos con el operador NOT, os dejo el enlace con el listado completo de categorías. A continuación os dejo unos ejemplos donde se usan las categorías y los operadores:

nmap --script "not intrusive"
Con esta expresión lanzamos todos los scripts excepto los que tienen la categoría intrusive.
nmap --script "default and not mysql-*"
Con esta expresión lanzamos los scripts por defecto que no empiecen por mysql-, podemos usar el comodin *.

 

Lanzando scripts con nmap

Para realizar las pruebas voy a utilizar una máquina virtual con la imagen ISO de BadStore, ya habíamos usado este entorno de pruebas de pentesting para un post anterior. Primero realizamos un test que nos indique qué puertos tiene abiertos la máquina virtual de BadStore, lanzamos el siguiente comando poniendo la dirección IP que tenga asignada Bad Store:

nmap -p 0-65535 -T4 -sT <ipBadStore>

Nos devuelve los puertos 80, 443 y 3306. Ahora lanzaremos un script al servicio MySQL, si miramos en la lista de scripts y buscamos por mysql encontraremos algunos scripts interesantes.  Lanzamos el script mysql-empty-password, para comprobar si los password de algunas cuentas están vacíos:

nmap -p 3306 --script mysql-empty-password <ipBadStore>

Nos da la siguiente salida:

SCRIPT-empty-password-badstore

Vemos que badstore deja la cuenta root y anonymous con los passwords en blanco, sabido esto podemos usar otro script para listar las bases de datos de BadStore, esta vez tendremos que pasar como argumentos el usuario y la contraseña de la base de datos:

nmap -p 3306 --script mysql-databases --script-args "mysqluser=root,mysqlpass=" <ipBadStore>

La ejecución del comando nos devuelve el siguiente resultado:

SCRIPTS-mysql-databases-badstore

Creación de un script NSE básico

Una de las principales ventajas del motor de scripts NSE es poder editar y usar nuestros propios script, para ello, usamos el lenguaje Lua y debemos tener alguna noción básica sobre sintaxis (y si no a buscar en google :P), pero antes que nada, necesitamos conocer las partes generales de las que consta un script para nmap:

  • Head: La cabecera se usa para incluir meta información del script como por ejemplo, descripción, autor, licencia o categorías
  • Rule: La regla se usa para comprobar si una condición se cumple, si determinada regla se cumple ejecuta su acción relacionada.
  • Action: Es la acción que realiza el script al cumplir la regla.

Todo esto lo veremos mejor en el siguiente ejemplo:

-- Cabecera 
description = [[
Revisa el SSH por defecto
]]
author = "Conectabell"
categories = {"default", "safe"}

-- Regla
portrule = function(host, port)
    return port.protocol == "tcp"
            and port.number == 22
            and port.state == "open"
end

-- Acción
action = function(host, port)
    return "Puerto por defecto SSH abierto CAMBIA ESO"
end

Ahora llamamos al script indicándole su ruta en el modificador –script y lo ejecutamos. Comprobamos que el script devuelve el mensaje al detectar el puerto 22 abierto, os adjunto la captura de pantalla con la salida:

SCRIPT-nse-prueba

Otra función del script podría ser revisar la existencia de algún directorio o archivo en concreto. En este caso he realizado un script que detecte si los puertos http que vaya detectando contienen el directorio del panel de administración de WordPress por defecto. Es bastante simple, no detecta subdirectorios, pero da un apaño cuando le pasamos un host en concreto.

local shortport = require "shortport"
local http = require "http"

-- Cabecera 
description = [[
Revisa directorio wp-admin del host
]]
author = "Conectabell"
categories = {"default", "safe"}

-- Regla
portrule = shortport.http

-- Accion
action = function(host, port)

    local uri = "/wp-admin/"
    local respuesta = http.get(host, port, uri)
    return ("wp-admin directory status: " .. respuesta.status)

end

A continuación os dejo la salida que genera.

SCRIP-personalizado-wpadmin

De esta forma podemos darle infinitas funcionalidades extra a NMap y sacarle un mayor jugo al motor de esta gran herramienta de análisis de red, un saludo!