Este documento presenta sobre el desarrollo de scripts para Nmap Scripting Engine (NSE). Explica que NSE expande la funcionalidad de Nmap para descubrimiento de hosts y servicios, detección de vulnerabilidades, recolección de información y más. También cubre conceptos de programación en Lua como tablas, cadenas de texto, patrones y más, los cuales son fundamentales para crear scripts NSE. Finalmente, proporciona ejemplos de uso avanzado de NSE incluyendo ataques de fuerza bruta y auditoría de configuración.
2. ¿Quién 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
3. Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
■ Introducción
■ Uso avanzado
■ Fundamentos de programación en LUA
○ Controles de flujo
○ Tipos de datos
○ Cadenas de texto
○ Patrones y capturas
■ Desarrollo de scripts
○ Detección de vulnerabilidades
○ Uso de librerías NSE
○ Manejo de sockets
○ Paralelismo
○ Estándar de desarrollo
http://guadalajaracon.org
GuadalajaraCON
Temario
4. 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 más de 400 scripts (435 el día que
escribí esto) en el repositorio oficial.
http://guadalajaracon.org
GuadalajaraCON
NSE == "Nmap Scripting Engine"
5. LUA
● Basado en el lenguaje de scripting LUA:
● Implementación pequeña 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
6. Categorías NSE
AUTH - Autenticación de usuarios
BROADCAST - Descubrimiento de hosts a través de peticiones "broadcast"
DEFAULT - Estos scripts son ejecutados cuando usamos -sC
DISCOVERY - Descubrimiento de hosts y servicios
DOS - Denegación de Servicio
EXPLOIT - Explotación de vulnerabilidades
EXTERNAL - Dependen de un servicio externo
FUZZER - Scripts para hacer fuzzing
INTRUSIVE - Scripts considerados intrusivos
MALWARE - Detección de malware
SAFE - Scripts considerados seguros
VERSION - Detección de versión avanzada
VULN - Detección y explotación de vulnerabilidades
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
7. 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
8. Selección 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
9. 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
10. 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
11. Más consejos de uso
● Es difícil 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 función 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
12. Más 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 función 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
13. Más 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
14. Aplicaciones
● Descubrir hosts y servicios
● Detección y explotación de vulnerabilidades
● Ataques de fuerza bruta
● Sniffing de tráfico
● Determinar versiones
● Recolección de información
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
15. Aplicaciones
● Conozcan a los scripts de la categoría ”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
16. Práctica
● Descarguen e instalen un script nse no oficial
● Corran la categoría "broadcast"
nmap --script broadcast -P0
Notas
Comando para actualizar base de datos
#nmap --script-updatedb
Página 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
17. Ataques de diccionario
La categoría ”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
18. Práctica: Ataques de diccionario
● Lanza un ataque de fuerza bruta contra algún 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
19. Recolección de información
● 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 – Localización geográfica de una IP
$nmap –script ip-geolocation-* <objetivo>
●
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
20. Recolección de información
● Detectar sistemas de protección mediante filtrado de
tráfico como WAFs e IPS.
$nmap --script http-waf-detect -p80 –script-args
http-waf-detect.aggro,http-waf-detect.
detectBodyChanges <OBJETIVO>
● Si la página no es dinámica usen el argumento:
detectBodyChanges.
● Si quieren realizar una prueba más completo (5X veces
más el número de peticiones) usen el argumento: aggro
● Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
21. Recolección de información
● Detectar sistemas de protección mediante filtrado de
tráfico 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
22. Auditoría de configuración
● Checar si la configuración 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
24. Introducción 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
25. Introducción a LUA
● Documentación:
http://www.lua.org/manual/5.2/manual.html
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
26. 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
30. 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
31. 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 mayúsuculas
string.gsub("%a", string.upper, 1)
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
32. Práctica: 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
33. 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
35. Capturas de texto
Permiten extraer información 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
36. 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
37. Desarrollo NSE
Nmap Scripting Engine
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
38. Introducción 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
39. Depurando
● Para mostrar información de depuración
-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
40. Librerías NSE
Para incluir librerías se usa ”require”:
local http = require ”http”
Entre las librerías más útiles están:
● http
● creds
● target
● packet
● brute
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
41. ¿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
42. Reglas de ejecución
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
43. Ejemplos de reglas de ejecución
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 sería:
portrule = shortport.http
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
44. Ejemplos de reglas de ejecución
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
45. Reglas de pre-ejecución
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
47. Librería "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
48. Leyendo argumentos en scripts
● Para leer argumentos se usa la librería "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 común 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
49. Práctica: 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
50. 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 aún).
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
51. Formato XML
○ Nmap genera elementos para escaneo de puertos,
detección 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
52. Datos de salida de NSE con soporte
XML
● Al usar la función 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
53. 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
54. Consejos al tratar datos de salida
○ Organizar de forma lógica los datos
○ Es preferible usar la función stdnse.output_table()
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
55. Reporte de vulnerabilidades
La librería "vulns" fue escrita para ayudarnos a reportar
correctamente vulnerabilidades encontradas con NSE.
La función de generar reportes construye automáticamente
un reporte con un formato específico en base a los campos
asignados.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
56. 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
57. 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
58. Reporte de vulnerabilidades
La librería tiene una variable que lleva el registro del
estado de la vulnerabilidad encontrada:
● EXPLOITABLE
● VULNERABLE
● NOT_VULN
Es nuestra responsabilidad asignarlo durante la ejecución:
vuln.state = vulns.STATE.VULN
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
59. Reporte de vulnerabilidades
Para generar el reporte se utiliza la función 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
60. Networking I/O
NSE tiene acceso a la librería de sockets de Nmap que
ofrece paralelismo transparente por medio de un API que
usa un estilo de conexión.
Si quieres irte al nivel más bajo se registran ”monitores”
PCAP a la interfaz y se procesan como son recibidos.
Más información: http://nmap.org/book/nse-api.html#nse-
api-networkio
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
61. Networking I/O
Modems Huawei HG530x y HG520x ( posiblemente otros
también ) revelan información sensible si se envia un
paquete UDP especial a puerto 43690.
¿Qué tan sensible?
● Firmware version
● MAC address
● Dirección IP local y remota
● Modelo
● Usuario y password PPPoE
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
62. huawei-udp-info
Usamos un paquete UDP especialmente diseñado e
imprimimos la información 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
63. huawei-udp-info
Regla de ejecución
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
64. 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 conexión
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
65. 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
66. 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||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
67. Paralelismo
Usemos algunas análogias para definir terminos:
○ Hilos ( Co-rutina en LUA ) -> proceso.
○ Un script -> ejecutable.
Durante la ejecución 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
68. 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
69. Paralelismo
○ Nos sirve cuando necesitamos paralelizar
conexiones usando sockets.
○ No hay que preocuparse por sincronía de memoria.
○ También cuenta con conditional variables para
sincronizar la ejecución.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
70. http-iis-shortname-dos
Práctica para casa: Actualizar el script para que
soporte paralelismo.
Práctica para casa #2: Implementar hilo monitor que
actualice el estado del host ( abajo o arriba )
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
71. 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 mínimo cuando verbose
sea menor a nivel 2
● Usar funciones de la librería Nmap cada que sea
posible.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON
72. 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.
Desarrollo NSE (Nmap Scripting Engine)
Paulino Calderon
calderon@websec.mx
http://guadalajaracon.org
GuadalajaraCON