Description du challenge

Someone on the dev team fat fingered their keyboard, and deployed the wrong app to production. Try and find what went wrong. The flag is in a file called “flag.txt”

Hint #1
Are there any python servers that can store water ;)

Analyse de la description

Le challenge nous donne un indice sur le type de serveur utilisé : python, nous pouvons également déduire que le serveur utilise le framework flask.

Analyse du site web

Lorsque nous lançons le site web, nous arrivons sur la page suivante :

La page dans l’état actuel ne nous donne aucun indice, j’ai donc analysé le code source pour voir s’il n’y avait pas des commentaires ou des informations cachées.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Todo List</title>
<!-- CSS only -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor"
crossorigin="anonymous"
/>
<!-- JavaScript Bundle with Popper -->
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2"
crossorigin="anonymous"
></script>
<link rel="stylesheet" href="static/styles.css" />
</head>
<body>
<div class="container">
<h1>This website is currently under <i>development</i></h1>
</div>
</body>

<!-- John, please don't run the app in debug mode, how many times do I have to tell you this! -->
</html>

Nous pouvons voir qu’il y’a effectivement un indice caché, merci john 👀

<!-- John, please don't run the app in debug mode, how many times do I have to tell you this! -->

Nous pouvons donc en déduire que le serveur est en mode debug, ce qui est une très mauvaise pratique en production.

Recherche d’exploit

Après quelques recherches, je suis tombé sur un article qui explique comment exploiter un serveur flask en mode debug: https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/werkzeug. La ressource en elle même ne m’a pas été très utile, mais elle m’a permis de trouver la route vers la console de debug : /console

Exploit

Code PIN

Lorsque nous arrivons sur la page, nous avons un code pin à rentrer :

J’ai d’abord essayer des combinaisons classiques (0000, 1234 etc….) mais aucune ne fonctionnait. J’ai donc fait un retour en arrière pour voir si je n’avais pas loupé un indice.

Je suis retourné sur le code source de la page principale, et au départ rien ne m’interpellait, mais en regardant de plus près, j’ai remarqué que les sources provenaient toutes d’un cdn sauf une :

<link rel="stylesheet" href="static/styles.css" />

j’ai donc décidé d’aller voir ce fichier 👀

/* Nothing interesting here except this number - 934123 */

Effectivement la page contenait le code pin : 934123

Console de debug

Maintenant que nous avons le code pin, nous pouvons accéder à la console de debug.

Il s’agit d’une console python, nous pouvons donc exécuter du code python. Chacun peut avoir une approche différente, mais j’ai décidé de lister le contenu de répertoire courant pour voir si je pouvais trouver le flag.

import os
os.listdir('./')

Nous pouvons voir flag.txt, nous allons donc l’afficher pour voir son contenu.

with open('flag.txt', 'r') as f:
print(f.read())

Nous avons le flag : dsc{p1zz4_15_4w350m3}