🩁Narnia 4

🩁Narnia 4

1 May 2023 Narnia challenges 0

De retour pour le 4e challenge Narnia !

Le challenge Narnia 4 ressemble Ă©normĂ©ment au challenge Narnia2 vu prĂ©cĂ©demment, il s’agit de la mĂȘme faille de sĂ©curitĂ©.

Commençons sans plus tarder à disséquer ce challenge !

DĂ©couverte

Le but de ce challenge est de rĂ©ussir Ă  exĂ©cuter un shell grĂące au setuid, afin d’obtenir le mot de passe de Narnia5.

Comme vous avez pu le constater, il s’agit de la mĂȘme faille de sĂ©curitĂ© qu’au cours du challenge Narnia2, c’est-Ă -dire le strcpy.

Nous pouvons reprendre les étapes vues précédemment :

  1. DĂ©terminer la taille du payload avec peda
  2. Récupérer une adresse de retour
  3. Modifier le payload prĂ©cĂ©dent (narnia2) pour l’adapter
				
					#include 
#include 
#include 
#include 

extern char **environ;

int main(int argc,char **argv){
    int i;
    char buffer[256];

    for(i = 0; environ[i] != NULL; i++)
        memset(environ[i], '\0', strlen(environ[i]));

    if(argc>1)
        strcpy(buffer,argv[1]);

    return 0;
}

				
			

Exploitation

DĂ©terminer la taille du payload

Afin de dĂ©terminer la taille du payload, il est pratique d’utiliser peda.

Peda est un dĂ©buggueur basĂ© sur gdb. Il a l’avantage d’ĂȘtre trĂšs graphique et donc plus facile Ă  utiliser que gdb.

Commençons par lancer peda avec la commande :

				
					peda
				
			

SĂ©lectionner le fichier Ă  utiliser :

				
					file /narnia/narnia4
				
			
Pour dĂ©terminer oĂč placer son breakpoint, utiliser la fonction disassemble :
				
					disassemble main
				
			

On peut voir que le strcpy se situe au niveau de main +117, il peut ĂȘtre intĂ©ressant de placer le breakpoint Ă  ce niveau-lĂ .

Configurez un argument suffisamment long pour remplir de buffer de 256 char et le faire déborder, par exemple : 

				
					set args $(python2 -c 'print("A"*256 + "BBBB")')
				
			

Lancer le programme avec la commande run et voyez ce qu’il se passe.

Vous pouvez faire dĂ©filer les commandes une Ă  une en tapant “n” puis en appuyant sur la touche Enter.

Comme vu dans le challenge Narnia 2, il ne reste plus qu’à dĂ©terminer le moment oĂč EIP prend la valeur ‘BBBB’ en modifiant le nombre de A.

Vous saurez, Ă  ce moment-lĂ , quelle longueur devra faire votre injection.

Récupérer une adresse de retour

Dans ce deuxiĂšme temps, vous pourrez rĂ©cupĂ©rer une adresse de retour pour votre injection. Comme d’habitude, cette adresse doit tomber au niveau des “A” de votre injection.

Pour ce faire, au moment du leave, tapez la commande :

				
					x/300x $esp
				
			

Cette commande permet de visualiser le contenu de la pile, en hexadécimal,  à un instant T.
RĂ©cupĂ©rez une adresse oĂč vous voyez de nombreux “A” (0x41).

Adapter le payload de Narnia2

Si vous n’aviez pas lu l’article pour fabriquer le shellcode de Narnia2, cliquez ici !

En résumé, voici les quelques étapes à suivre :

  1. CrĂ©er un script assembleur permettant d’ouvrir un shell,
  2. Assembler le code avec la commande nasm (en 32 bits),
  3. Récupérer les caractÚres hexadécimaux de la commande objdump afin de constituer votre shellcode.

Sinon, vous pouvez rĂ©cupĂ©rer votre shellcode pour Narnia2 et l’adapter pour ce cas !

Enfin, il ne reste plus qu’à remplacer les valeurs trouvĂ©es au cours des Ă©tapes prĂ©cĂ©dentes (Nombre de NOP et adresse de retour) pour obtenir une injection de ce format lĂ  :

				
					$(python2 -c 'print("\x90" * XX + "shellcode" + "\x90" * YY + "adresse")
				
			
OĂč XX + YY + longueur du shellcode = longueur dĂ©terminĂ©e Ă  l’étape 1

Conclusion

Si vous aviez bien compris le principe du challenge Narnia2, celui-ci ne devrait pas vous poser de problĂšme.

N’hĂ©sitez pas Ă  relire les explications donnĂ©es dans cet article.

Enfin, en ressources, vous trouverez un outil en ligne assez pratique pour vous aider à générer vos shellcodes.

Ressources