Professional Documents
Culture Documents
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.
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.
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.
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:
Pequeo repaso... (Recordemos la presentacin Exploits Basados en Stack Overflows Para x86 de la Undercon III)
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.
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:
Controlamos directa o indirectamente el valor del puntero que produce el error. No controlamos el valor del puntero -> Solo DoS
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.
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)
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.
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.
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...
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.
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.
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...
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.
Ejecucin directa:
Ejecucin indirecta:
r11 1 = 2 = N = S =
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
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
Demo en vivo
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.
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
Win32:
Unix :
GOT:
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:
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
Los exploiters son vagos por naturaleza. Hay cosas mejores que hacer que perder el tiempo programando exploits. (Por ejemplo las mujeres :)
Dudas, preguntas