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.
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:
.
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:
.
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:
.
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…
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!!!
hace una parte 3 esta muy bueno! gracias
Gacias por vuestros comentarios Gustavo y mauro.
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 ?
esta super bueno el articulo llevo casi 2 años investigando a fondo nmap y si me pueden ayudar lo agradesco
Gracias k4iro por tu comentario. En breve más sobre Nmap.