Nmap NSE Scripting. Breve reseña para creación y ejecución scripts NSE nmap. Parte 2

Ya vimos en la primera parte de esta serie dedicada a Nmap y, en concreto, al scripting NSE (Nmap NSE Scripting. Breve reseña para creación y ejecución scripts NSE nmap. Parte 1) nociones de como ejecutar un script, como interpretarlo, paso de argumentos, filtros, ejemplos, etc.

nmap

En esta ocasión vamos a analizar uno de ellos para ver su estructura y, de esta forma, aprender a modificar o crear nuestros propios scripts según nuestras necesidades.

Esctructura de un script NSE.

Vamos a analizar un script, de los más simples, para ver su estructura.

Antes veremos, brevemente como están conformados.

Básicamente un script se compone de las siguientes secciones, no todas son necesarias y pueden no aparecer:

Cabecera.

  • id descripción corta, nombre del script que se muestra en la salida Nmap.
  • description: breve descripción del script, notas, etc. Caracter informativo.
  • author autor del script.
  • tags o categories categoría del script
  • license licencia (no es procesado)
  • dependencies / require scripts que necesita ejecutar antes, depende de ellos.

Funciones.

  • portrule / hostrule (regla)se espera unos datos para decidir si se cumple y ejecuta el script. Los datos pueden ser host y/o port.
  • action (acción) es la parte importante de script, es script propiamente dicho.

Como hemos dicho, no todos los campos se requieren para la escrutura del script. Los requeridos y necesarios son:

  • descriptiona
  • categories
  • portrule ó hostrule 
  • action

Ejemplo. Estrucutura

Lo vemos con el script, muy básico, daytime.nse:

nmap nse script structura cabeceras funciones

.

Vemos de forma clara la cabecera con la description, author, license y categories. En este caso description nos cuenta que se trata del descubrimiento del servicio UDP Daytime (definido en el RFC 867), categories tiene discovery y safe (lo vimos en el la Parte1). Se trata pues de un script de:

  • discovery distintas pruebas de descubrimento en una red «interrogando» al los distintos servicios
  • safe modo inofensivo para el objetivo.

require nos «dice» que necesita comm.lua y shortport.lua que dos script Lua con funciones necesarias para nuestro script dytime.nse.

Vamos ahora con la parte importante del script.

portrule

En este script es portrule = shortport.port_or_service(13, «daytime», {«tcp», «udp»})

Hemos visto antes que en la línea 12 de script (require) hace uso de la librería shortport.lua, pues bien, esta librería contiene la función shortport.port_or_service con los argumentos entre paréntesis (13, «daytime», {«tcp», «udp»}) . Se usa para comprobar el objetivo. Se comprueba el puerto 13 del servicio daytime en los protocolos tcp o udp.

NOTA: La misma librería shortport.lua, nos explica el uso: usage portrule = shortport.port_or_service(22,»ssh»)…..

Como argumentos, en este caso,  shortport.port_or_service soporta un puerto o lista de puertos, un solo servicio o lista, un solo protocolo o lista de protocolos.

Seguimos.

De ser cierto (True), la condición de comprobación de portrule, entonces se ejecuta la parte contenida en action.

action

En actión se define una función que necesita la librería comm.lua, cuya llamada se realiza mendiante require. Se llama a la función exchange mediante comm.exchange(host, port, «dummy», {lines=1, proto=port.protocol}).

La sintáxis es exchange = function(host, port, data, opts)

Daytime está hoy en día prácticamente en desuso, así que vamos a ilustrar el funcionamiento de action con el script daytime.nse, emulando mediante netcat (ncat) el servicio en nuestro BackTrack 4.0

los hacemos mediante la siguiente línea:

ncat -l 13 –send-only –exec «/bin/date»

Vemos el resultado:

daytime script nmap nse resultado

 

.

Analizamos en resultado.

Vemos que como resultado se retorna el banner de los datos aportados por el servicio descubierto.

Modificando / creando un script.

Bueno, vamos a modificar e incluso crear un script tenendo como base daytime.nse. Lo haremos de forma muy básica. En próximos capítulos iremos avanzando y profundizando.

modificamos description = [[Retrieves the day and time from the UDP Daytime service.]] 

description = [[Descubrimiento de serivicio ftp. Imprimimos un banner en la salida]] 

dejamos categories y  eliminamos los requerimientos, no necestiamos de ninguna librería auxiliar y modificamos el author

portrule

Creamos la función y realizamos las condiciónes necesarias para que se cumpla (True) y se ejecute action

portrule = function(host, port)
return port.service == «ftp» and
port.number == 21
and port.protocol == «tcp»
and port.state == «open

action

action = function()
return «El puerto 21 esta abierto. Pillin tienes el servivio ftp activo»

Respetmos los end y lo dejamos de esta forma es scritp que llamaremos efetepe.nse

 description = [[
Descubrimiento de serivicio ftp. Imprimimos un banner en la salida
]]

author = «Alfonn»

license = «Same as Nmap–See http://nmap.org/book/man-legal.html»

categories = {«discovery», «safe»}

portrule = function(host, port)
return port.service == «ftp» and
port.number == 21
and port.protocol == «tcp»
and port.state == «open»
end

action = function()
return «El puerto 21 esta abierto. Pillin tienes el servivio ftp activo»
end

El resultado:

nmap nse scripting crear script

.

Para entenderlo mejor, si cambiamos  return port.service == «ftp» por return port.service == «ft» o el valor de cualquiera de las «condiciones» de cumplimiento de portrule veremos no imprime el banner. Si eliminamos una, si se imprime el banner.

Otro ejemplo y usando condiciones if()

description= [[ Ejemplo para ftp y ftp-data ]]
author =»alfon»
categories = {«safe»,»discovery»}

portrule = function(host, port)
if (
port.number == 20 or
port.number == 21 or
port.service == «ftp-data» or
port.service == «ftp»
and port.protocol == «tcp» )

then
return true
else
return false
end
end
action = function()
return «FTP puertos abiertos»
end

Evidentemente es muy simple. Iremos avanzando y explicando en proximos capítulos. Hasta la próxima…

Esta entrada fue publicada en Nmap, Seguridad y redes. Guarda el enlace permanente.

6 respuestas a Nmap NSE Scripting. Breve reseña para creación y ejecución scripts NSE nmap. Parte 2

  1. Gustavo dijo:

    Muy buenos articulos doc, sigue asi, espero con ansias los demas capitulos, ire viendo q hacer con los script’s de nmap, a jugar se ha dicho 😉
    Saludos!!!

  2. mauro dijo:

    hace una parte 3 esta muy bueno! gracias

  3. Alfon dijo:

    Gacias por vuestros comentarios Gustavo y mauro.

  4. Javier dijo:

    He conseguido hacer correr el ejemplo, pero ahora ando interesando en poder crear un NSE que envie una trama hacia un servicio sobre UDP y poder parsear la respuesta.
    Alguien ha hecho alguna prueba similar ?

  5. k4iro dijo:

    esta super bueno el articulo llevo casi 2 años investigando a fondo nmap y si me pueden ayudar lo agradesco

  6. Alfon dijo:

    Gracias k4iro por tu comentario. En breve más sobre Nmap.

Deja un comentario