dimanche 19 juillet 2015

Nebulla - level04

Bonjour,

Nous allons commencer par ce petite level04 qui est pour le coup assez simple. On va pour le moment lire ce que l'on nous donne :
This level requires you to read the token file, but the code restricts the files that can be read. Find a way to bypass it :)
To do this level, log in as the level04 account with the password level04. Files for this level can be found in /home/flag04.
Dans un premier temps faut simplement comprendre comment marche le programme que l'on nous donne. On a de la chance ici on a la source il suffit juste donc de lire et de comprendre celle-ci. Je vais tenter d'expliquer le plus important : 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv, char **envp)
{
  char buf[1024];
  int fd, rc;

  if(argc == 1) {
      printf("%s [file to read]\n", argv[0]);
      exit(EXIT_FAILURE);
  }

  if(strstr(argv[1], "token") != NULL) {
      printf("You may not access '%s'\n", argv[1]);
      exit(EXIT_FAILURE);
  }

  fd = open(argv[1], O_RDONLY);
  if(fd == -1) {
      err(EXIT_FAILURE, "Unable to open %s", argv[1]);
  }

  rc = read(fd, buf, sizeof(buf));
  
  if(rc == -1) {
      err(EXIT_FAILURE, "Unable to read fd %d", fd);
  }

  write(1, buf, rc);
}

On va commencer par lire depuis le début donc :

if(strstr(argv[1], "token") != NULL)

 Je ne vais pas parler du début du programme qui va simplement faire un checking des arguments passé en paramètre du programme. Nous allons surtout voir ce qui commence par le test sur la fonction `strstr` qui par le man nous indique qu'en gros on va voir si la string passer en second paramètre est contenu dans la première string (passé en paramètre de la fonction). On peut donc conclure qu'ici on regarde si le nom du fichier passer en argument va contenir le mot token dans son nom. Rien de bien compliqué jusqu'ici. On continu donc :


fd = open(argv[1], O_RDONLY);
rc = read(fd, buf, sizeof(buf)); 

`Open` et `read` sont deux fonctions qui vont simplement ouvrir et lire le fichier que l'on aura passé en paramètre. Des tests sont fait pour éviter d'avoir des erreurs de droits d’aces ou pour simplement éviter des actions sur un fichier qui n'existe simplement pas.

 write(1, buf, rc);
Voilà donc la fin qui va simplement écrire dans la sortie standard via la fonction `write` le contenu du fichier une fois que tout les tests n'ont pas échoué.Voici donc un exemple de test d'utilisation du programme :


Comme prévu on se retrouve avec une erreur. Je vais vous apprendre une nouvelle notion ici assez simple mais que je n'ai pas eut besoin d'utiliser jusqu'ici. Il s'agit de la commande `ln` qui permet en gros de faire une liaison d'un fichier vers un autre. Une sorte de raccourci sous Windows mais en évolué. Je vous invite a lire le man de cette fameuse commande puisqu'elle risque d’être utile par la suite.

On aimerait afficher le contenu du fichier token ce qui n'est pas possible. Le trick ici sera de créer un raccourci sur lequel nous avons les droits vers ce fichier token pour le lire depuis un fichier du nom de notre choix. Une fois l’opération terminé il suffit simplement de lancer le programme puis de se log via la commande `su` pour accéder donc à notre flag :
Et voila le tour est joué rien de compliqué si on prend le temps de comprendre le code source donné. Les choses ici à retenir sont vraiment lié à la compréhension des choses demandé ainsi que la commande `ln` qui pour le coup est vraiment utile.
 

Aucun commentaire:

Enregistrer un commentaire