You are on page 1of 33

HEAP Overflows Desmitificados

The Dark Raver

Undercon 7

Murcia 2003

1 Introduccin

Este texto no cubre nuevas tcnicas super-complejas de explotacin de heap overflows y tampoco cubre tcnicas para evitar sistemas superseguros (y que casi nadie usa) para protegerse de los exploits basados en buffer overflows. (No pretendo aburrir en exceso al personal)

1 Introduccin

Este texto simplemente recoge una tcnica genrica de explotacin de heap overflows (Aunque es extensible incluso a la explotacin de stack overflows o de bugs de formato).

1 Introduccin

Esta tcnica esta basada en mi experiencia en la programacin de buffer overflows y se desliga de la mayora de textos escritos sobre el tema. Adems en su concepcin es relativamente simple, aunque su aplicacin alcance en la mayora de casos mayor complejidad.

1.1 Olvidar todo lo ledo

Si habis ledo algn articulo sobre explotacin de heap overflow, olvidarlo, o mejor que olvidarlo, guardarlo en un rincn y compararlo con lo que voy a explicar. Comprobareis que el enfoque de esta tcnica en su concepcin es totalmente diferente a las publicadas aunque al fin y al cabo todas acaban siendo lo mismo.

1.2 Aplicacin de esta tcnica

Una de las mayores ventajas de esta tcnica es que es muy genrica, ya que es aplicable casi en cualquier plataforma y casi en cualquier tipo de overflow. Esto otorga gran flexibilidad al programador de exploits para emplear su experiencia o para elegir distintas formas de explotacin que le permitan obtener mayor eficiencia en su cdigo.

1.2 Aplicacin de esta tcnica

Sin embargo no olvidemos que cada SO introduce una serie de particularidades que no deben ser ignoradas a la hora de emplear esta tcnica.

Ejemplo de particularidades:

Desplazamiento de la pila Little-endian / big-endian Error handlers Compiladores

1.3 Stack overflows

Pequeo repaso... (Recordemos la presentacin Exploits Basados en Stack Overflows Para x86 de la Undercon III)

2 Introduccin a la Teora de punteros

Cual es el principal indicador de que existe un fallo de seguridad en un programa?

Un error de segmentacin.

Porque se produce un error de segmentacin?

El software intenta acceder a una zona de memoria no mapeada. Normalmente a causa de un buffer overflow que sobrescribe un valor de memoria.

2 Introduccin a la Teora de punteros

Es decir, el programa intenta leer, escribir o ejecutar cdigo, en una zona de memoria no mapeada. Y intenta hacer esto porque un overflow ha alterado el flujo normal del programa, modificando algn puntero con un valor de memoria no valido. Por tanto, Tipos de punteros:

Punteros de lectura Punteros de escritura Punteros de ejecucin

2 Introduccin a la Teora de punteros

Situaciones tras un buffer overflow:

Controlamos directa o indirectamente el valor del puntero que produce el error. No controlamos el valor del puntero -> Solo DoS

2.1 Herramientas de trabajo

La idea de la tcnica por tanto es trabajar "solo" con punteros y olvidarnos del resto. Para explotar un bug de este tipo no es necesario contar con su cdigo fuente ni conocer su flujo de funcionamiento, todo este tipo de informacin no es mas que rboles que nos impiden ver el bosque.

2.1 Herramientas de trabajo

Esto aporta grandes ventajas sobre otras tcnicas y aunque parezca mentira, en la mayora de casos simplifica la labor del exploiter.

La nica herramienta necesaria para explotar este tipo de fallos ser nuestro debugger (preferiblemente el GDB)

En Win32 ollydbg o MS debugging tools

3 Tcnica de los punteros

As se llama la tcnica Tcnica de los punteros: Se basa en el anlisis de la explotabilidad de un buffer overflow, segn el impacto que tenga sobre distintos punteros (u otros objetos abstraibles como punteros) almacenados en memoria.

3.1 Punteros de lectura

No son explotables para ejecutar cdigo. En algn caso extremo, en el que los datos ledos sean mostrados por pantalla tal vez se puede intentar leer informacin interna del proceso.

nica opcin en Bugs de formato cuando no es posible %n

Porcentaje de aparicin: aprox 30%

3.2 Punteros de ejecucin

Es nuestro da de suerte, si podemos modificar un puntero de ejecucin, solo tenemos que hacer que apunte a nuestro shellcode y listo. (Aunque normalmente siempre aparecen problemas...) Posibles punteros de ejecucin:

Saved IP Saved EBP (o similares) Punteros a funciones Error Handlers (Win32) Estructuras *FILE Etc...

Porcentaje de aparicin: aprox 20%

3.3 Punteros de escritura

Es el caso mas tpico. El puntero modificado es uno de escritura, dependiendo del caso:

Controlamos el valor DONDE se escribe. Controlamos el valor QUE se escribe. Controlamos ambos.

Porcentaje de aparicin: aprox 40%

4 Explotacin

Esta es la parte mas interesante. Aqu veremos una serie de tcnicas o trucos que ayudaran a la explotacin de este tipo de vulnerabilidades.

4.1 Tcnica genrica


1.

Comprobamos que se produce el overflow -> SIGFAULT Empezamos con el overflow mas pequeo Comprobamos que tipo de puntero se ha pisado Si no nos vale intentamos introducir un valor que no produzca SIGFAULT

2.

3.

4.

5.

Vamos incrementando...

4.2 Punteros de lectura

Como se ha comentado. Explotacin posible en pocos casos. Simplemente se le pasa un valor de memoria valido y se intenta que continu el flujo de ejecucin.

4.3 Punteros de ejecucin

A priori los mas sencillos de explotar. Tipos:

Ejecucin directa:

Ej. Pisamos el saved EIP directamente

Ejecucin indirecta:

Ej. Pisamos el saved EBP (Usamos el comando de gdb: BT)

4.3 Punteros de ejecucin

Ej. AIX 4.3 lscfg (local)

/usr/sbin/lscfg -l `perl -e 'print "a" x 10000'` Pisamos r11


<_ptrgl>: <_ptrgl+4>: <_ptrgl+8>: <_ptrgl+12>: <_ptrgl+16>: <_ptrgl+20>: lwz stw mtctr lwz lwz bctr r0,0(r11) r2,20(r1) r0 r2,4(r11) r11,8(r11) ====> carga 0(r11) en r0 ====> mover r0,ctr

0xd015ead0 0xd015ead4 0xd015ead8 0xd015eadc 0xd015eae0 0xd015eae4

====> Branch a ctr

4.3 Punteros de ejecucin

/--------------------\ [r11] | v 111111111111111111111222222222222222222222222NNNNNNNNNNNNNNSSSSSSSSSSS | ^ \--------------------/

r11 1 = 2 = N = S =

r11 1+LEN=(r11) NOPS SHELLCODE

=> => => =>

Registro que almacena el puntero sobre-escrito r11 toma el valor de esta zona 1 La seccin 2 es apuntada por r11 Los OFFSETS en 2 apuntan al campo de NOPS

4.3 Punteros de ejecucin

Ej. iPlanet Chunked Encoding overflow Solaris (remoto)

Pisamos %o0

Dump of assembler code for function PR_Recv: 0xef36bf34 <PR_Recv>: ld [ %o0 ], %g1 0xef36bf38 <PR_Recv+4>: ld [ %g1 + 0x44 ], %g1 0xef36bf3c <PR_Recv+8>: jmp %g1

4.3 Punteros de ejecucin

Ej. Exception Handler en Win32 (Apache Chunked encoding)

Demo en vivo

4.4 Punteros de escritura

Como se ha comentado:

Controlamos el valor DONDE se escribe: Dependiendo de lo que se escriba, aunque no es posible la ejecucin de cdigo, tal vez sea posible la explotacin por otras vas. En caso de no explotabilidad se tratan igual que los punteros de lectura.

Ej. Solaris Login Enviroment overflow

4.4 Punteros de escritura

Controlamos el valor QUE se escribe: No tienen porque producir SIGFAULT. Generalmente no tienen utilidad de cara a la explotacin. Controlamos ambos: Caso ideal para su explotacin. Debemos escribir en una zona de memoria que produzca que el flujo del programa se dirija a nuestro cdigo:

Win32 - Error handlers (Unhandled Exception Hanlder) Unix - GOT de alguna funcin que se use

4.4 Punteros de escritura

Win32:

Como localizar el Undhandled Exception Hanlder

Unix :

GOT:

$ objdump -R /bin/ls | grep free 08053a90 R_386_JUMP_SLOT free

4.4 Punteros de escritura

Ej. ASP Chunked encoding overflow

Demo en vivo

Conclusiones

Ya esta? Tanto revuelo para algo tan simple? Pues si, aunque no sea aplicable en todos los casos nuestro amigo Ockham parece que tenia razn:

"Con igualdad de factores la solucin mas simple tiende a ser la correcta"


"Si puedo explicar cualquier cosa con pocos elementos, por que introducir elementos superfluos"

Conclusiones

Normalmente durante la programacin de un exploit aparecen mltiples factores que dificultan o hacen menos eficiente la explotacin de la vulnerabilidad atacada. En la mayora de casos, analizar la vulnerabilidad sobre lenguajes de alto nivel donde existe mayor nivel de abstraccin dificulta el trabajo del exploiter y le obliga a realizar anlisis superfluos que no aportan nada al resultado final de su trabajo.

Conclusiones

Entonces porque no aparecen mas exploits para este tipo de vulnerabilidades?

Los exploiters son vagos por naturaleza. Hay cosas mejores que hacer que perder el tiempo programando exploits. (Por ejemplo las mujeres :)

Dudas, preguntas

The Dark Raver - Murcia <28/11/2003> darkraver@t0s.org

You might also like