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 :
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 :
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