Está en la página 1de 73

Desarrollo NSE (Nmap Scripting Engine)

Paulino Calderon
Twitter: @calderpwn
Email: calderon@websec.mx
WWW: http://calderonpale.com
GuadalajaraCON 2013
http://guadalajaracon.org
http://guadalajaracon.org
GuadalajaraCON
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
Quin soy?
Repositorio personal
https://github.com/cldrn/nmap-nse-scripts/
Google Summer of Code 2011
https://code.google.com/p/google-summer-of-code-2011-nmap/
Nmap 6: Network Exploration and Security Auditing Cookbook
http://nmap-cookbook.com
http://guadalajaracon.org
GuadalajaraCON
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
Introduccin
Uso avanzado
Fundamentos de programacin en LUA
Controles de flujo
Tipos de datos
Cadenas de texto
Patrones y capturas
Desarrollo de scripts
Deteccin de vulnerabilidades
Uso de libreras NSE
Manejo de sockets
Paralelismo
Estndar de desarrollo
http://guadalajaracon.org
GuadalajaraCON
Temario
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
Motor de scripts que ha expandido la funcionalidad de
Nmap en todos los aspectos.
Actualmente existen ms de 400 scripts (435 el da que
escrib esto) en el repositorio oficial.
http://guadalajaracon.org
GuadalajaraCON
NSE == "Nmap Scripting Engine"
LUA
Basado en el lenguaje de scripting LUA:
Implementacin pequea pero muy poderosa.
Usado en proyectos como:
Wireshark
Snort
VIM
World of Warcraft
Entre otros...
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Categoras NSE
AUTH - Autenticacin de usuarios
BROADCAST - Descubrimiento de hosts a travs de peticiones "broadcast"
DEFAULT - Estos scripts son ejecutados cuando usamos -sC
DISCOVERY - Descubrimiento de hosts y servicios
DOS - Denegacin de Servicio
EXPLOIT - Explotacin de vulnerabilidades
EXTERNAL - Dependen de un servicio externo
FUZZER - Scripts para hacer fuzzing
INTRUSIVE - Scripts considerados intrusivos
MALWARE - Deteccin de malware
SAFE - Scripts considerados seguros
VERSION - Deteccin de versin avanzada
VULN - Deteccin y explotacin de vulnerabilidades
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Usando NSE
Para iniciar el motor de scripts:
$nmap -sC <host>
Seleccionando scripts:
$nmap --script <archivo/exp/folder> <host>
Pasando argumentos a los scripts:
--script-args http.useragent=0, http.pipeline=15
--script-args http.useragent=CUM,pipeline=10
--script-args whois={whodb=no follow}
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Seleccin avanzada de scripts
Usando expresiones para seleccionar scripts
granularmente:
nmap -p80 --script "http-* and (not(http-brute or http-
slowloris))" <objetivo>
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Consejos de uso
Nunca usen los dns de su ISP. Para usar los dns abiertos
de google:
nmap --dns-servers 8.8.8.8,8.8.4.4 <objetivo>
Experimenten con diferentes configuraciones de tiempo:
nmap -T5 <objetivo>
Si cualquier cosa se ve sospechosa:
nmap -d <objetivo>
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Consejos de uso
Usen el filtro -p si solo les interesa el resultado de cierto
servicio.
$nmap -p80 --script http-trace <objetivo>
Si estan trabajando con scripts HTTP, cambien su user
agent SIEMPRE:
$nmap -p80 --script http-enum <objetivo>
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Ms consejos de uso
Es difcil recordar el nombre de todos los argumentos.
Mantengan abierta una consola en el folder de los scripts y
usen:
cat <script> | grep @args
No existe una funcin de autocompletar. ( Entren al
folder de scripts y ejecuten sus escaneos desde ah? ).
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Ms consejos de uso
No se olviden de visitar el wiki donde se agregan scripts
no aceptados al repositorio oficial:
https://secwiki.org/w/Nmap/Script_Showcase
No existe una funcin de autocompletar. ( Entren al
folder de scripts y ejecuten sus escaneos desde ah? ).
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Ms consejos de uso
Interesantes scripts no oficiales:
vulscan
http-google-email
http-screenshot
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Aplicaciones
Descubrir hosts y servicios
Deteccin y explotacin de vulnerabilidades
Ataques de fuerza bruta
Sniffing de trfico
Determinar versiones
Recoleccin de informacin
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Aplicaciones
Conozcan a los scripts de la categora broadcast:
#nmap --script broadcast -P0
Dropbox-listener
Broadcast ping == ping 255.255.255.255
Targets-sniffer
#nmap --script=targets-sniffer --script-
args=newtargets,targets-sniffer.iface=eth0
NECESITAN USAR iface PARA QUE CORRA.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Prctica
Descarguen e instalen un script nse no oficial
Corran la categora "broadcast"
nmap --script broadcast -P0
Notas
Comando para actualizar base de datos
#nmap --script-updatedb
Pgina con scripts no oficiales:
https://secwiki.org/w/Nmap/Script_Showcase
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Ataques de diccionario
La categora brute contiene scripts que nos ayudan a
realizar ataques de diccionario a diferentes servicios:
http-brute
$nmap --script http-brute -p80 <objetivo>
Entre muchos otros:
smtp-brute
sip-brute
ftp-brute
...
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Prctica: Ataques de diccionario
Lanza un ataque de fuerza bruta contra algn servicio.
Notas:
El objetivo es familiarizarse con los argumentos:
userdb
passdb
brute.firstOnly
brute.mode
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Recoleccin de informacin
Hostmap Descubre aplicaciones web hospedadas en
el mismo servidor:
$nmap -p80 --script hostmap <objetivo>
http-wordpress-enum - Enumera usuarios en
instalaciones Wordpress:
$nmap -p80 http-wordpress-enum <objetivo>
ip-geolocation Localizacin geogrfica de una IP
$nmap script ip-geolocation-* <objetivo>

Desarrollo NSE (Nmap Scripting Engine)


Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Recoleccin de informacin
Detectar sistemas de proteccin mediante filtrado de
trfico como WAFs e IPS.
$nmap --script http-waf-detect -p80 script-args
http-waf-detect.aggro,http-waf-detect.
detectBodyChanges <OBJETIVO>
Si la pgina no es dinmica usen el argumento:
detectBodyChanges.
Si quieren realizar una prueba ms completo (5X veces
ms el nmero de peticiones) usen el argumento: aggro

Desarrollo NSE (Nmap Scripting Engine)


Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Recoleccin de informacin
Detectar sistemas de proteccin mediante filtrado de
trfico como WAFs e IPS.
$nmap --script http-waf-fingerprint -p80
<OBJETIVO>
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Auditora de configuracin
Checar si la configuracin de MySQL cumple con los
requerimientos del MySQL CIS
$nmap -p 3306 --script mysql-audit --script-args
"username='root', mysql-audit.password='toor',
mysql-audit.
filename='/usr/local/share/nmap/nselib/data/mysql-
cis.audit'" <host>
Checar si un HTTP proxy esta abierto
$nmap script http-proxy <host>
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
LUA
LUA scripting
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Introduccin a LUA
Similar a otros scripting languages como python y ruby:
$cat hola.lua
#!/usr/bin/lua
print("Nombre?")
name = io.read()
print ("Hola " .. name)
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Introduccin a LUA
Documentacin:
http://www.lua.org/manual/5.2/manual.html
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Tablas en LUA
Las tablas en LUA se declaran de la siguiente manera:
local miTabla = {1,2,3}
local nestedTabla = {10={11,12,13},
20={21,22}}
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Tablas en LUA - http-fingerprints.lua
category='general',
probes={
{path='/archiva/index.action', method='GET'},
{path='/index.action', method='GET'}
},
matches= {
{match='.*">Apache Archiva (.-)</a>', output='Apache Archiva version \\1'},
{match='Apache Archiva (%d-%..-)\n', output='Apache Archiva version \\1'},
{match='<title>Apache Archiva \\', output='Apache Archiva'}
}
}
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Clases de carcteres
%s caracter de espacio
%d nmero entero
%a todas las letras
%l letras en minscula
%x valor hexadecimal
%z null bytes
[sets] Agrupaciones
(*) http://www.lua.org/manual/5.2/manual.html#6.4.1
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
LUA: Cadenas de texto
Formatear cadenas de texto.
string.format(formato, var1, var2, var3...)
Imaginen que: texto = GuadalajaraCON, anio = 2013, num = 1
string.format(Resultado:%s %d v%d.%d, texto, anio, num, 0)
Resultado:GuadalajaraCON 2013 v1.0
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
LUA: Cadenas de texto
Regresar sub cadenas de texto.
string.sub(texto, offset_inicio, offset_fin)
string.sub(hola, 2)
ola
string.sub(hola, 2, 3)
ol
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
LUA: Cadenas de texto
Substituir cadenas de texto
string.gsub(texto, patron, reemplazo)
Reemplazar null bytes por comas.
string.gsub(texto, %z, )
Cambiar la primera letra a maysuculas
string.gsub("%a", string.upper, 1)
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Prctica: Cadenas de texto
Desarrolla un script en LUA que genere un User Agent aleatorio.
Notas
math.random() genera enteros aleatorios
User-Agents normalmente se ven as:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)
Opera/7.50 (Windows XP; U)
Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Debian/1.6-7
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Patrones de texto
Detectan patrones en cadenas de texto.
> print(string.sub("nmap Nmap", string.find("nmap Nmap", "%u%a*")))
Nmap
>print(string.sub("nmap Nmap NSENmap", string.find("nmap Nmap
NSENmap", "NSE%u%a*")))
NSENmap
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Patrones de texto
> print(string.sub("123ABC123", string.find("123ABC123", "[ABC]%d")))
> print(string.sub("123ABC123", string.find("123ABC123", "[A-C]%d")))
> print(string.sub("123ABC123", string.find("123ABC123", "%d%d%dAB[AC]%
d")))
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Capturas de texto
Permiten extraer informacin de cadenas de texto usando patrones.
>print(string.find("CONFIG<user>admin</user>", "<user>(.*)</user>"))
7 24 admin
http-majordomo2-dirtraversal:
_, _, rfile_content = string.find(response.body, '<pre>(.*)<!%-%- Majordomo
help_foot format file %-%->')
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Capturas de texto
function get_href_links(body)
local href_links = {}
for l in string.gfind(body, 'href%s*=%s*[\'"](%s*[^"^\']+%s*)[\'"]') do
table.insert(href_links, l)
end
return href_links
end
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Desarrollo NSE
Nmap Scripting Engine
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Introduccin a desarrollo NSE
Desarrollar tus propios scripts NSE es muy sencillo.
Envia tus scripts a la lista de correo de desarrollo de Nmap: dev@insecure.org
Si no sabes que hacer, checa el wishlist de la comunidad:
https://secwiki.org/w/Nmap/Script_Ideas
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Depurando
Para mostrar informacin de depuracin
-d[1-9]
Para generar una traza del script:
--script-trace
Para generar una traza de paquetes:
--packet-trace
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Libreras NSE
Para incluir libreras se usa require:
local http = require http
Entre las libreras ms tiles estn:
http
creds
target
packet
brute
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Como distinguir entre versiones?
La familia 6.x:
local http = require http
La familia 5.x:
require "http"
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reglas de ejecucin
Todos los scripts deben de tener por lo menos una de las
siguientes funciones:
prerule()
hostrule(host)
portrule(host, port)
postrule()
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Ejemplos de reglas de ejecucin
Existen aliases como shortport.http
http = shortport.port_or_service({80, 443, 631, 7080,
8080, 8088, 5800, 3872, 8180, 8000},
{"http", "https", "ipp", "http-alt", "vnc-http", "oem-agent"})
La regla para servidores HTTP sera:
portrule = shortport.http
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Ejemplos de reglas de ejecucin
Hostrule para siempre ejecutar el script:
hostrule = function() return true end
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reglas de pre-ejecucin
Checando permisos administrativos e interface:
prerule = function()
return nmap.is_privileged() and
(stdnse.get_script_args("targets-sniffer.iface") or
nmap.get_interface())
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Plantilla NSE
description = [[
]]
---
-- @usage nmap -sV script myscript <target>
-- @output
-- @args
---
author = ""
license = "Same as Nmap--See http://nmap.org/book/man-legal.html"
categories = {}
portrule =
action = function(host, port)
end
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Librera "nmap"
Cargar archivos (Multiplataforma)
nmap.fetch_file()
Leer estado de determinado puerto
nmap.get_port_state(host,puerto)
Funciones pcap para manejo de paquetes raw
nmap.pcap_open()
nmap.pcap_receive()
nmap.pcap_close()
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Leyendo argumentos en scripts
Para leer argumentos se usa la librera "stdnse":
stdnse.get_script_args("<nombre de argumento>")
Si usamos el formato <script>.<nombre> declaramos un
alias global del nombre del argumento:
stdnse.get_script_args(SCRIPT_NAME..".user")
Es comn ver declaraciones como la siguiente:
local mysql_user = stdnse.get_script_args
(SCRIPT_NAME..".user") or "root"
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Prctica: Encontrando webcams
Existe una vulnerabilidad en camaras IP Trendnet modelo
TW 100 que permite accederlas remotante:
http://ip/anony/mjpg.cgi
Notas
Recuerden que pueden cargar listas de ips como
objetivos.
nmap -iL ips.txt OBJETIVO
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Formato de datos de salida
Nmap soporta diferentes formatos de salida de
datos XML, greppable y normal. Sin embargo datos
de salida de NSE solo se guardan cuando elegimos
XML o normal.
El modo greppable ya esta deprecado (Aunque en
algunas situaciones es til an).
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Formato XML
Nmap genera elementos para escaneo de puertos,
deteccin de servicios y NSE.
Anteriormente se guardaba en un elemento llamado
<script> dentro del atributo output.
En agosto del 2012 se integr soporte estructurado
de scripts.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Datos de salida de NSE con soporte
XML
Al usar la funcin stdnse.output_table para guardar
nuestros datos de salida se auto genera el rbol XML.
.nse:
...
local output_tab = stdnse.output_table()
output_tab.ip = host.ip
output_tab.hosts = domains
return output_tab
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Datos de salida de NSE con soporte
XML
NSE:
| test:
| ip: 127.0.0.1
|_ hosts: localhost
XML:
<script id="test" output="...">
<elem key="ip">127.0.0.1</elem>
<elem key="hosts">localhost</elem>
</script>
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Consejos al tratar datos de salida
Organizar de forma lgica los datos
Es preferible usar la funcin stdnse.output_table()
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reporte de vulnerabilidades
La librera "vulns" fue escrita para ayudarnos a reportar
correctamente vulnerabilidades encontradas con NSE.

La funcin de generar reportes construye automticamente
un reporte con un formato especfico en base a los campos
asignados.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reporte de vulnerabilidades
dns-openresolvers-check:
VULNERABLE:
This DNS server has been blacklisted as an open resolver.
State: VULNERABLE
Risk factor: High
Description:
This DNS server is known for supporting open recursion. Open resolvers are dangerous
because of the following reasons:
* Attackers may consume resources of third parties. They are actively being exploited in
DDoS attacks.
* Attackers may poison the cache of an open resolver.
References:
http://isotf.org/news/DNS-Amplification-Attacks.pdf
http://dns.measurement-factory.com/surveys/openresolvers.html
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reporte de vulnerabilidades
La tabla principal tiene la siguiente estructura:
local vuln = {
title = 'Authentication bypass in MySQL servers.',
IDS = {CVE = 'CVE-2012-2122'},
state = vulns.STATE.NOT_VULN,
description = [[
When a user connects to MariaDB/MySQL...
]],
references = {
'http://seclists.org/oss-sec/2012/q2/493',
'https://community.rapid7.com/community/metasploit/blog/2012/06/11/cve-2012-2122-a-tragically-comedic-
security-flaw-in-mysql'
},
dates = {
disclosure = {year = '2012', month = '06', day = '9'},
},
}
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reporte de vulnerabilidades
La librera tiene una variable que lleva el registro del
estado de la vulnerabilidad encontrada:
EXPLOITABLE
VULNERABLE
NOT_VULN
Es nuestra responsabilidad asignarlo durante la ejecucin:
vuln.state = vulns.STATE.VULN
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Reporte de vulnerabilidades
Para generar el reporte se utiliza la funcin vulns.Report.
make_output():
local report = vulns.Report:new(SCRIPT_NAME, host,
port)
return report:make_output(vuln_table)
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Networking I/O
NSE tiene acceso a la librera de sockets de Nmap que
ofrece paralelismo transparente por medio de un API que
usa un estilo de conexin.
Si quieres irte al nivel ms bajo se registran monitores
PCAP a la interfaz y se procesan como son recibidos.
Ms informacin: http://nmap.org/book/nse-api.html#nse-
api-networkio
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Networking I/O
Modems Huawei HG530x y HG520x ( posiblemente otros
tambin ) revelan informacin sensible si se envia un
paquete UDP especial a puerto 43690.
Qu tan sensible?
Firmware version
MAC address
Direccin IP local y remota
Modelo
Usuario y password PPPoE
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
huawei-udp-info
Usamos un paquete UDP especialmente diseado e
imprimimos la informacin recibida.
http://www.hakim.ws/huawei/HG520_udpinfo.tar.gz
http://websec.ca/advisories/view/Huawei-HG520c-
3.10.18.x-information-disclosure
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
huawei-udp-info
Regla de ejecucin
portrule = shortport.portnumber(43690, "udp", {"open",
"open|filtered","filtered"})
Argumentos de shortport.portnumber:
portnumber(puerto,protocolo,estados)
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
huawei-udp-info
1. Crea un socket
local socket = nmap.new_socket("udp")
2. Configura el tiempo de espera
socket:set_timeout(tonumber(timeout))
3. Haciendo la conexin
local status = socket:connect(ip,puerto, "udp")
if (not(status)) then return end
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
huawei-udp-info
status = socket:send(payload)
if (not(status)) then return end
status, data = socket:receive()
if (not(status)) then
socket:close()
return
end
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
huawei-udp-info
-- PORT STATE SERVICE REASON
-- 43690/udp open|filtered unknown no-response
-- |_huawei5xx-udp-info: |\x10||||||||<Firmware
version>|||||||||||||||||||||||||||||||<MAC addr>|||<Software
version>||||||||||||||||||||||||||||||||||||||||||||| <local
ip>|||||||||||||||||||<remote
ip>||||||||||||||||||<model>|||||||||||||||<pppoe
user>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||<pppoepassword>|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||\x01||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||
--
a
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Paralelismo
Usemos algunas anlogias para definir terminos:
Hilos ( Co-rutina en LUA ) -> proceso.
Un script -> ejecutable.
Durante la ejecucin los scripts son "detenidos" si hay
llamadas a operaciones de redes.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Paralelismo
Iniciando un thread
worker_thread, status_function = stdnse.
new_thread(main, )
Acciones que se pueden aplicar a Mutexes:
lock - Bloquea un thread
trylock - Bloquea un thread si es posible
done - Libera el mutex
running - Regresa el thread que tiene el mutex
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Paralelismo
Nos sirve cuando necesitamos paralelizar
conexiones usando sockets.
No hay que preocuparse por sincrona de memoria.
Tambin cuenta con conditional variables para
sincronizar la ejecucin.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
http-iis-shortname-dos
Prctica para casa: Actualizar el script para que
soporte paralelismo.
Prctica para casa #2: Implementar hilo monitor que
actualice el estado del host ( abajo o arriba )
I
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Consejos de desarrollo
Siempre documentar lo mejor posible el script
Incluir por lo menos dos ejemplos de uso "@usage"
El output del script debe ser mnimo cuando verbose
sea menor a nivel 2
Usar funciones de la librera Nmap cada que sea
posible.
S
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Consejos de desarrollo
Reporten correctamente las vulnerabilidades
Si encuentran credenciales, agregarlas a "creds"
Si encuentran nuevos objetivos, agregarlos a "targets"
No olviden enviar sus scripts a la lista oficial
(dev@insecure.org) o agregarlos al wiki.
S
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
Desarrollo NSE ( Nmap Scripting Engine)
Paulino Calderon
@calderpwn
http://calderonpale.com
GuadalajaraCON 2013
http://guadalajaracon.org