Ce challenge de crypto est orienté autour d’un jeton d’authentification. Ce dernier est composé de la manière suivante :

username=<username>;role=<role>;time=<timestamp>

Pour connaitre le système de chiffrement sous-jacent, on peut créer un token malformé afin d’espérer récupérer un message d’erreur. Pour ce faire, il suffit d’envoyer un paquet n’ayant pas le bon nombre d’octets. Une fois cela fait, on obtient l’erreur suivante :

Data must be aligned to block boundary in ECB mode
Erreur, jeton d'authentification incorrecte.

En essayant à la main il est possible de connaitre la taille de bloc utiliser par l’AES. Nous avons donc affaire à un AES-128 en mode ECB.

Nous savons maintenant que le mode de chiffrement sous-jacent est ECB. Nous allons donc nous servir du fait qu’aucun mécanisme de sécurité n’est implémenté pour forger un token admin.

La méthode est simple, créer un token a partir du nom d’utilisateur. Pour ce faire lors de la saisie, il faut que la totalité de notre payload fasse 384 bits de long. De ce fait, le serveur va chiffrer notre payload dissimulée dans le username puis il ne nous restera plus qu’à envoyer les trois premiers blocs du token qui correspondront à notre token frauduleux.

Pour cela, je vais donner comme username : morncraban01;role=admin;time=1679929894

Suite à ça, je récupère donc un token de la forme suivante :

Format token:

username=morncraban01;role=admin;time=1679929894;role=invite;time=1679929986

Token:

47343b7f975707b5bc5f1a06cf099080ce456d3cd7f7bb319fa8a1d5075b92bd0276f4b88b86835732f8693878c732a56400d13467c58e941b49e82d355e0e46d157980d131d3183c61c5a0aaafaf49b.

J’envoie les 96 premiers caractères du token qui correspondent a mon token forgé et bingo !! Voilà le flag !!

---------------------------------------
1. Demander un jeton d'authentification
2. S'authentifier
3. Quitter
---------------------------------------
Entrez votre choix (1,2,3): 2
Veuillez renseigner votre nom: morncraban01
Veuillez renseigner votre jeton d'authentification: 47343b7f975707b5bc5f1a06cf099080ce456d3cd7f7bb319fa8a1d5075b92bd0276f4b88b86835732f8693878c732a5
Vous êtes a présent connecté en tant qu'administrateur. BZHCTF{Oh_Noh_You_Pwned_Ze_BreizhCTF_!}

Il faut faire attention à bien donner un timestamp valide. Pour ce faire la génération d’un premier token valide fait l’affaire.

Note : la solution de l’auteur est disponible ici.

À propos de l’auteur

Article écrit par Maël FRAZAO alias Morncraban, Expert cybersécurité chez ACCEIS.