> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/web/jwt/attaques-sur-lauthentification.md).

# Attaques sur l'authentification

### jwt\_tool

Outil pour faire des attaques sur des JWT.

**Installation**

```
git clone https://github.com/ticarpi/jwt_tool
cd jwt_tool
python3 -m pip install -r requirements.txt
```

**Utilisation**

```
# décoder un token
python jwt_tool.py <token>

# modifier un token
python jwt_tool.py <token> -T
```

{% embed url="<https://github.com/ticarpi/jwt_tool>" %}

## **Attaques sur la signature**

### **Signature `none`**

Remplacer l'algorithme de signature par `none` et supprimer la signature après le dernier point. Certaines applications décodent (à tort) le token si aucune signature n'est présente.

{% hint style="success" %}
Avec `Burp` on peut modifier le token modifié au préalable avec `jwt_tool`
{% endhint %}

### **Modifier RS256 en HS256 (Algorithm Confusion)**

RS256 correspond à l'algorithme RSA (asymétrique) avec une clé privée utilisée pour signer le token et une clé publique utilisée pour vérifier la signature.

HS256 correspond à l'algorithme HMAC (symétrique) avec une seule clé utilisée pour signer et vérifier le token.

```
verify( token, secretOrKey ) {
    if token.alg == "RS256" {
        // vérifier la signature avec la clé publique RSA secretOrKey
    }
    else if token.alg == "HS256" {
        // vérifier la signature avec le secret HMAC secretOrKey
    }
}
```

Si on **modifie RS256 en HS256 et qu'on re-signe le token avec la clé publique**, elle sera utilisée par le serveur comme le secret symétrique. **Il faut donc trouver la clé publique.**

1. Obtenir la clé publique
   * Code source
   * Documentation
   * Publiée sur des endpoints connues
   * [Récupération de clé à partir de plusieurs tokens](https://github.com/FlorianPicca/JWT-Key-Recovery)
2. Changer l'algorithme de RSA en HMAC
3. Modifier le payload
   * Ajouter les informations dont on a besoin pour l'attaque
4. Signer le nouveau token avec la clé publique

**Avec jwt\_tool:**

```
python jwt_tool.py <token> -X k -pk <public.key> -I -pc <payload_field> -pv <payload_value> 
```

### **Bruteforce le secret**

Essayer de bruteforce le secret avec des listes classiques (rockyou, [jwt-secrets](https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list), etc.). Une fois le secret obtenu, on peux modifier le contenu du token (des champs du payload par exemple) et le re-signer avec le secret obtenu.

**Avec hashcat:**

```
hashcat -a 0 -m 16500 <token> <chemin vers la liste>
```

**Avec jwt-cracker:**

```
python3 jwt-cracker.py --jwt <token> --wordlist <chemin vers la liste>
```

{% embed url="<https://github.com/mazen160/jwt-pwn>" %}

## **Injection de header**
