🩁Narnia 3

🩁Narnia 3

3 April 2023 Narnia challenges 0

On se retrouve une nouvelle fois pour un challenge de la série Narnia.

Tout d’abord, bravo pour votre persĂ©vĂ©rance pour ces challenges.

Le challenge Narnia3 n’est pas excessivement complexe, ainsi je ne vous donnerai que quelques pistes pour le rĂ©ussir plus rapidement.

DĂ©couverte

Voici le challenge de Narnia3 :

				
					#include 
#include 
#include 
#include 
#include 
#include 
#include 

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);
}
				
			
De façon simple, ce programme copie le contenu d’un fichier vers un autre, spĂ©cifiĂ©s en arguments.

Voici les différents tests à effectuer pour essayer de mieux comprendre ce programme :

En précisant 2 arguments pour input/ouput (appelés ifile et ofile), cela redirige le contenu du fichier directement dans /dev/null :

En mettant le contenu d’un fichier auquel je n’ai pas d’accùs, cela m’affiche ce message d’erreur :

Mais si je mets le contenu d’un fichier auquel j’ai accĂšs, cela le copie “dans un endroit sĂ»r”, c’est Ă  dire /dev/null 😅

VoilĂ  pour les diffĂ©rents cas d’usage de ce script.

Vous aurez remarquĂ© que n’importe quel input est entrĂ©, cela crĂ©e soit une erreur, soit envoie le rĂ©sultat dans /dev/null.

Ce qui serait pratique, ça serait de pouvoir modifier directement ofile


Heureusement pour nous, le code utilise une fonction trÚs vulnérable : strcpy.

Pour rappel, cette fonction permet de copier les caractĂšres d’une string Ă  une autre. Cependant celle-ci ne vĂ©rifie pas s’il y a la place d’écrire dans la destination.

Ainsi, Ă  cause de ce souci de configuration, nous pouvons facilement effectuer notre buffer-over-flow.

On se demande bien quel fichier il sera intĂ©ressant de lire… 

Raisonnement

Dans un premier temps, voyons voir quelles conditions doit remplir notre buffer :

  • Nous avons besoin, en premier, de remplir complĂštement le buffer ifile de 32 caractĂšres.
  • Nous avons aussi besoin que ifile pointe vers le nom du fichier qu’on souhaite lire.
  • La deuxiĂšme valeur doit ĂȘtre un chemin de maximum 16 caractĂšres existant, afin que le programme puisse Ă©crire Ă  l’intĂ©rieur. (Attention ‘\0’ est aussi un caractĂšre)
  • Pour rĂ©sumer, il nous faut un chemin de 48 caractĂšres qui existe mais dont les 16 derniers caractĂšres sont aussi un chemin existant !

On peut se poser la question de comment avoir des noms de fichiers imbriqués valides pour lire un fichier arbitraire.

C’est en fait trùs simple : il suffit d’utiliser un lien symbolique !

Les liens symboliques

Un lien symbolique est un raccourci. Il permet tout simplement d’attribuer un autre chemin d’accùs à un fichier.

Si le fichier original est modifié, le lien symbolique sera modifié aussi.

Si le fichier original est supprimé, le lien symbolique ne pointera plus nul part.

Voici la commande pour créer un lien symbolique :

				
					ln -s -f   
				
			

Vous pouvez vérifier que votre lien symbolique a bien été crée en tapant cette commande au niveau de la destination :

				
					ls -lah
				
			

Si le lien symbolique a bien été effectué, il sera signalé par une flÚche et sa source :

				
					total 168K
drwxrwxr-x    2 narnia3 narnia3 4.0K Feb  3 14:23 .
drwxrwx-wt 4117 root    root    160K Feb  3 14:23 ..
lrwxrwxrwx    1 narnia3 narnia3   24 Feb  3 14:23 a -> /etc/narnia_pass/narnia4
				
			
Il ne vous reste plus qu’Ă  trouver la bonne combinaison de chemin afin d’exploiter la faille.  
Indice : Rappelez-vous que dans le dossier /tmp, vous avez tous les droits (crĂ©ation de dossier, de fichier…)

Conclusion

Il ne s’agit clairement pas du challenge qui requiert le plus de connaissances, mĂȘme s’il requiert une certaine gymnastique d’esprit.

Cela reste toujours intĂ©ressant d’étudier diffĂ©rentes maniĂšres d’exploiter un mĂȘme souci de configuration.

Ressources