Vous êtes sur la page 1sur 4

News - Invisible is Real - 2/2

3 solves - 499 points - Difficile


Données fournis :
URL : news2.nobrackets.fr:30748

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

Analyse de la page Web et du token


Page Web
La page Web est sensiblement la même que celle de la première étape. Nous avons toujours un
commentaire HTML qui nous indique le même endpoint /next-news-draw.

</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

On peut utiliser l'outil jwt_tool pour analyser le token :

python3 jwt_tool.py eyJhbGciOiJIUzUxMiIsImtpZCI6IjZiOWM5YzJmLWIyNTAtNDcyNC05MTI5LTAyNTli

=====================
Decoded Token Values:
=====================

Token header values:


[+] alg = "HS512"
[+] kid = "6b9c9c2f-b250-4724-9129-0259b60752dc.key"
[+] typ = "JWT"

Token payload values:


[+] isRedactor = False

----------------------
JWT common timestamps:
iat = IssuedAt
exp = Expires
nbf = NotBefore
----------------------

On retrouve les informations classiques d'un token JWT :

L'algorithme de chiffrement utilisé : HS512


Notre payload : isRedactor = False
et un KID (Key ID) : 6b9c9c2f-b250-4724-9129-0259b60752dc.key

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.

Il existe certaines vulnérabilités liées à l'utilisation de KID.


Dans un premier temps, nous allons testé de modifier le KID pour voir si nous pouvons accèder à une
autre clé ou si nous pouvons accèder au contenu d'un fichier distant.

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 .

Si on teste avec ../../etc/passwd , on obtient par contre :


Invalid JWT or isRedactor is not set to true .

Très bien, on peut savoir si le fichier existe ou non sur le serveur en fonction du message d'erreur.

Une exploitation basique de cette vulnérabilité est de placer ../../../../../dev/null pour en


essayer de faire croire au serveur que la clé de chiffrement est le fichier vide. En regardant la sortie :

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

On trouve un passage très intéressant :

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.

On va donc placer le chemin /proc/sys/kernel/randomize_va_space dans le KID et utiliser 2


comme clé de chiffrement.

Vous aimerez peut-être aussi