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.
 

Nebulla - level 15

Bonjour,

Nous voila au niveau 15 ici. Voyons voir ce qu'on nous donne ici :

strace the binary at /home/flag15/flag15 and see if you spot anything out of the ordinary.
You may wish to review how to “compile a shared library in linux” and how the libraries are loaded and processed by reviewing the dlopen manpage in depth.
Clean up after yourself :)
To do this level, log in as the level15 account with the password level15. Files for this level can be found in /home/flag15.

On nous indique clairement d'apprendre à utiliser strace ici qui est un programme qui va permettre de savoir les syscalls utilisé par notre programme au minimum. On va donc simplement lancer cette commande pour voir ce que nous donne le résultat.

Donc je ne vais ici partir du principe que vous comprenez ce que strace (dans le cas échéant je vous conseil de chercher sur duckduckgo plus d'information) affiche.
On peut remarquer très vite que le programme tente d'utiliser des fichiers qui ne sont pas présent ici. Ces fichiers sont situé dans le dossier /var/tmp/flag15. On va alors tenter d'en savoir plus sur ce fichier avec la fameuse commande objdump qui va nous permettre de tout savoir sur le programme visé. On va ici tenter de regarder ce qu'il se passe au niveau des librairies puisqu'on nous a bien précisé de chercher à comprendre comment fonctione tout ce qui est lié aux « a shared library in linux ». Dans un premier temps on va voir les libs utilisé obligatoirement.


Ici dans la partie lib dynamique on peut lire le nom du fichier libc.so.6 dans le dossier /var/tmp/flag15 on peut aussi tenter de savoir les fonctions utilisé ici :

 
Avec quelques recherche sur le net on peut faire simplement notre petite libraire perso avec notre fonction __libc_start_main() tel que :


La compilation peut faire peur mais avec un peu de recherche il s’agit simplement des flags nécessaire pour rendre notre librairie possible d'utilisation. Ici il semblerait qu'il manque une fonction obligatoire ici __cxa_finalize que je vais donc rajouter simplement ici :


On se retrouve encore une autre erreur lié à la version de GLIBC. Au dessus par objdump on a pu voir que la version utilisé ici est simplement la 2.0. On va donc améliorer ça avec des flags en plus !


Alors j'ai trouvé tout les flags après des recherches sur internet (je suis pas devin) je vous conseil de tenter de comprendre tout ça de votre coté. On se retrouve encore avec des erreurs.. Bon on va donc utiliser une manière un peu bourrin qui va nous permettre d'afficher simplement tout les messages de debug sur un fichier utilisé pour ca je vais donc simplement copier le binaire et le lancer avec la variable global LD_DEBUG set à all et donc:


J'ai coupé une partie puisque ce qui nous intéresse se trouve ici. Et donc on peut remarquer que tout est bon ici jusqu'au call de system qui n'existe simplement pas pour l'ordinateur. On va donc devoir rajouter encore des flags pour corriger ce problème dans le but d'override simplement la partie que l'on souhaite sans toucher au reste!


On a enfin réussis à utiliser notre fonction system sans soucis puisque celle-ci s’exécute au lancement de notre programme. Le soucis ici c'est que notre programme garde l'uid de l'utilisateur qui va lancer le programme et non l'uid du programme en lui même. Pour résoudre ce soucis on va modifier un petit peu notre script ainsi:


Et enfin voila notre petit flag !

Ce niveau est vraiment sympa puisqu'il nous oblige à utiliser ce qu'on a pu déjà utiliser par le passé mais de façon plus approfondi. Ainsi on a pu découvrir objdump ainsi que strace qui sont vraiment utile surtout dans l'applicatif. Donc prenez vraiment le temps de comprendre l'utilisation de ces programmes.