Code source disponible pour cette épreuve : https://repo.zenk-security.com/hackingweek2014_ctf/web3.zip
En analysant les sources on remarque la présence d'un fichier success.php
<?php require_once "../secret.php"; session_start(); (isset($_SESSION['web3'])) or die("Oops! This page appears broken - Access error."); echo "Success! The password is \"" . $secretpassword3 . "\""; ?>
La condition pour obtenir le flag est donc d'avoir la variable web3 en session. Cette variable est définie dans le fichier chmod.php
<?php if ($_SERVER['REMOTE_ADDR'] == '127.0.0.1') { if (isset($_GET['id'])) { $id = htmlspecialchars($_GET['id'], ENT_QUOTES); if (preg_match("/^[a-zA-Z0-9]+$/", $id) === false) die("Could not find the provided session ID"); if (file_exists(session_save_path() . "/sess_$id") === false) die("Could not find the provided session ID"); session_id($id); session_start(); $_SESSION['web3'] = true; session_write_close(); } } else { die("Oops! This page appears broken - Access error."); } ?>
Le code commence par vérifier que la connexion provient du serveur lui-même et non d'un client distant, il teste ensuite la présence d'une variable GET nommée id.
Cette variable doit être composée de lettres min/MAJ et chiffres, puis le script vérifie si cet id correspond à un id de session sur le serveur. La session est ensuite chargée avec cet identifiant, et la variable de session web3 est initialisé à true.
Il faut donc que le PHPSESSID de l'attaquant soit transmis à cette page et passe les contrôles pour obtenu la variable de session.
La seule contrainte viens du test if ($_SERVER['REMOTE_ADDR'] == '127.0.0.1')
Aucun soucis, l'adresse ip du server web est la même que celle des épreuves d'exploit par ssh.
On lance un shell sur une des épreuves remote, puis :
wget http://localhost/web3/chmod.php?id=NOTRE_PHPSESSID
Il ne reste plus qu'a consulter la page success.php avec un navigateur et le flag apparait : Ciu2Ahhool