dimanche 26 juillet 2015

Nebulla - level 16

Bonjour,

Nous avons presque terminé avec cette liste d'exploit nous en sommes au niveau 16 maintenant voila ce que l'on nous donne :
There is a perl script running on port 1616.
To do this level, log in as the level16 account with the password level16. Files for this level can be found in /home/flag16.
Donc logiquement voici le script perl qui va tourner sur le port 1616:

 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
36
37
#!/usr/bin/env perl

use CGI qw{param};

print "Content-type: text/html\n\n";

sub login {
  $username = $_[0];
  $password = $_[1];

  $username =~ tr/a-z/A-Z/; # conver to uppercase
  $username =~ s/\s.*//;        # strip everything after a space

  @output = `egrep "^$username" /home/flag16/userdb.txt 2>&1`;
  foreach $line (@output) {
      ($usr, $pw) = split(/:/, $line);
  

      if($pw =~ $password) {
          return 1;
      }
  }

  return 0;
}

sub htmlz {
  print("<html><head><title>Login resuls</title></head><body>");
  if($_[0] == 1) {
      print("Your login was accepted<br/>");
  } else {
      print("Your login failed<br/>");
  }    
  print("Would you like a cookie?<br/><br/></body></html>\n");
}

htmlz(login(param("username"), param("password")));

On peut voir une ligne de code (ligne 14) qui semble être sensible à une injection. En se basant sur une faille relativement connu appelé Poisoin Null byte . Notre but sera donc de tenter d’exécuter une commande de notre choix (dans le meilleur des cas pour avoir un terminal simplement. Et puisque nous sommes sur un script qui est exécuté sur un port donné on va devoir ici utiliser netcat . Donc dans un premier temps nous allons simplement executer le script pour voir ce qu'il nous indique :


Et donc puisque nous n'avons pas la moindre idée du couple de login/password on se retrouve avec un message d'erreur ici. J'ai utilisé une simple request HTTP (je vous conseil de regarder la RFC si vous ne comprenez pas ce que j'ai fais). Maintenant en regardant le petit script on peut se rendre compte que nos arguments seront modifié (les commentaires dans le script sont cool pour aider dans la compréhension ici). On va donc simplement créer un petit script en bash qui va simplement exécuter netcat en mode listen (sur le port 4242 ici) qui utilisera un programme en inbound (ici le lancement d'un shell). On peut se rendre compte que pour accéder à ce script un simple ls nous prouve que l'on va trouver uniquement ce script si on va chercher dans /*/NAMEOFSCRIPT . J'ai utilisé netcat.traditional ici puisque lors de l’exécution de la commande netcat simple. Voici donc notre script :


Et donc nous allons simplement utiliser ce script dans la partie username histoire de faire l'injection correctement (avec la faille null byte ici). Enfin nous avons simplement à nous connecter sur le port ouvert depuis l’exécution du script pour récupérer le flag.


 Et voila rien de vraiment nouveau.
 

Aucun commentaire:

Enregistrer un commentaire