Académique Documents
Professionnel Documents
Culture Documents
Préambule
Ce challenge est la suite du challenge [Invisible is Real - 1/2] proposé lors du NoBracketsCTF de
2023.
Dans la première étape nous avions exploité une vulnérabilité de type JWT - Secret Faible pour
accèder à la page /next-news-draw.
Résolution
</body>
<!--TODO : Setup /next-news-draw-->
<!--FIXED : JWT KEY WEAK-->
</html>
On nous indique également que la vulnérabilité de type JWT - Secret Faible a été corrigée sur cette
nouvelle version.
Token JWT
Sans plus d'informations sur la partie Web, nous allons de nouveau analyser le token JWT :
curl -c - news2.nobrackets.fr:30748/ | grep 'jwt'
jwt eyJhbGciOiJIUzUxMiIsImtpZCI6IjZiOWM5YzJmLWIyNTAtNDcyNC05MTI5LTAyNTliNjA3NTJkYy5r
=====================
Decoded Token Values:
=====================
----------------------
JWT common timestamps:
iat = IssuedAt
exp = Expires
nbf = NotBefore
----------------------
KID
Le KID est un identifiant de clé. Il est utilisé pour identifier la clé publique utilisée pour signer le token.
Cette implémentation est particulièrement utile lorsque nous avons plusieurs clés pour signer les
jetons et que vous devez rechercher la bonne pour vérifier la signature.
Exploitation du KID
De même que pour l'étape n°1, nous allons utiliser l'extension 'JWT Editor' de BurpSuite pour modifier
le KID plus facilement et rapidement.
En modifiant simplement le KID avec comme valeur : ../index.html nous obtenons le résultat suivant
Key file not found .
Très bien, on peut savoir si le fichier existe ou non sur le serveur en fonction du message d'erreur.
On reçoit une nouvelle erreur personnalisée : Key file is empty , le serveur regarde le contenu du
fichier avant de le charger.
Il faut donc adopter une nouvelle approche. En regardant un peu sur HackTricks :
https://book.hacktricks.xyz/pentesting-web/hacking-jwt-json-web-tokens
Using files inside the host with known content you can also forge a valid JWT. For example, in
linux systems the file /proc/sys/kernel/randomize_va_space has the value set to 2. So, putting
that path inside the "kid" parameter and using "2" as the symetric password to generate the JWT
you should be able to generate a valid new JWT.