mercredi 22 juillet 2015

Nebulla - level 09

Bonjour,

Nous allons aujourd'hui voir un niveau un peu plus complexe qui va demandé d'avoir des notions de PHP. Donc avant tout je vous conseil d'apprendre à comprendre au minimum les bases puisqu'elles seront utile ici.
Voyons ce qu'il faut faire ici :
 There’s a C setuid wrapper for some vulnerable PHP code…
To do this level, log in as the level09 account with the password level09. Files for this level can be found in /home/flag09.

On voit devoir donc comprendre le code PHP qui nous est donné ici :

 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
<?php

function spam($email)
{
  $email = preg_replace("/\./", " dot ", $email);
  $email = preg_replace("/@/", " AT ", $email);
  
  return $email;
}

function markup($filename, $use_me)
{
  $contents = file_get_contents($filename);

  $contents = preg_replace("/(\[email (.*)\])/e", "spam(\"\\2\")", $contents);
  $contents = preg_replace("/\[/", "<", $contents);
  $contents = preg_replace("/\]/", ">", $contents);

  return $contents;
}

$output = markup($argv[1], $argv[2]);

print $output;

?>

Le premier truc que l'on peut remarquer est l'utilisation de deux fonctions. La première fonction sera appelé par la seconde qui elle même sera appelé par les arguments passé au lancement du script . On faire un listing voir s'il y a un truc qu'on aurait pu ne pas voir : 


Donc rien de magique ici à faire tout est indiqué. On va donc devoir trouver une manière d'exploiter le programme normalement. On va pour le moment simplement lancer le programme pour voir s'il fait ce qu'on pense :

Rien de bien farfelu on va donc tenter de comprendre ce qui n'est pas normal dans le code que l'on pourrait exploiter. Nous allons regarder une ligne en particulier puisqu'il s’agit simplement de la ligne qui va call la première fonction de notre script :

  $contents = preg_replace("/(\[email (.*)\])/e", "spam(\"\\2\")", $contents);
Avec un peu d’expérience on peut penser à une faille XSS le soucis simple ici c'est qu'on ne peut et surtout ne doit pas utiliser de javascript. On va donc utiliser ce principe pour pouvoir exécuter la fonction que l'on souhaite On peut voir qu'il existe une fonction system qui risque de nous être utile pour notre exploitation. On va donc avoir besoin ici de notre fichier contenant notre script qui va modifier simplement l’exécution du script en notre faveur. Ce qu'il faut penser ici ( et c'est en réalité le seul soucis) ce sera d'escape les valeurs situé dans notre fichier pour que celle-ci soient bien interprété. Je ne vais pas vous montrer le nombre de test que j'ai fais puisque pour le coup ce sera mieux pour voir que vous les fassiez dans votre coin (par exemple la premier test sera d'afficher un simple phpinfo()). Je vais simplement vous montrer ma manière de résoudre ce niveau assez simplement :


Donc j'ai simplement utilisé la fonction system qui permet d’exécuter une commande du système et je lui ai donné pour argument la second variable que je passe dans le lancement du programme. Je peux donc par la suite exécuter la commande de mon choix (ici un shell) et faire ce que j'ai besoin. Le reste ne sera simplement que dans le but de rendre le code lisible par PHP (donc de l'escape).

Ce niveau peut sembler étrange pour les personnes n'ayant pas forcément de bonne notion en PHP et pour celle-ci je conseil vivement de se mettre à jour puisque vous allez vite le remarquer mais lorsque l'on va vouloir exploiter dans le web en général le PHP sera un pré-requis au minimum pour la compréhension du fonctionnement du langage

Aucun commentaire:

Enregistrer un commentaire