User Rating: 4 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Inactive
 

     

    Prérequis : Connaitre le fonctionnement d’un serveur web

     

    Bonjour à tous, aujourd’hui au programme, un article sur Juice shop. Juice shop est une boutique en ligne trouée de vulnérabilités . Elle permet de s’exercer au pentest web et contient l’ensemble du top 10 des vulnérabilités de l’OWASP.

    Comme pour mon article sur la boutique sera exécutée dans un container via docker. L’image officielle juice Shop est écrite en JavaScript. La boutique étant vulnérable, il faut éviter de l’exposer sur internet .

    Les challenges à résoudre sont classés en 5 catégories allant de la plus simple à la plus compliquée . Dans cet article, nous allons résoudre les challenges des 3 premiers niveaux, mais également détaillés pour comprendre leurs fonctionnements. Nous verrons dans un prochain article les niveaux difficiles. Je vous montrerai la technique que j’ai utilisée, cependant, il existe beaucoup d’autres techniques pour les résoudre . Je n’utiliserai pas d’outils automatisés pour résoudre les différents défis .

    Pour démarrer le container contenant le site vulnérable, rien de plus simple :

    #On télécharge l’image sur le

    docker hub

    docker pull bkimminich/juice-shop

    #On lance le container et on ouvre le port 3000 à partir de l’image juice-shop

    docker run –rm -p 3000:3000 bkimminich/juice-shop

    La recherche de vulnérabilité s’effectue sous Parrot OS  .

    Commençons le pentest de cette application web .

     

    Niveau 1 Juice Shop – Trivial Challenges

     

    On se rend sur l’URL de notre instance juice-shop port 3000. Première étape, il faut trouver l’interface de scoreboard de juiceshop. Pour cela, il suffit de lire le code du site (main.js). Nous pouvons également voir une page d’administration, mais nous n’avons pas les droits suffisant pour y accéder .

    ” 403 Forbidden ”

    On peut ensuite se rendre sur l’URL http://ip_juice_shop:3000/score-board/ . Nous pouvons voir la réussite du premier challenge.

    Bien nous allons nous échauffer encore un peu avec la réalisation d’une simple XSS Reflected . Le challenge XSS Tier 0 sur l’image ci-dessus demande la réalisation d’une attaque XSS . Pour cela il faut taper <iframe src=”javascript:alert(`xss`)”> dans la barre de recherche de la boutique et nous réalisons une attaque de type XSS Reflected. Ce qui se traduit par : Ouvrir dans la page actuelle un popup avec le texte “xss”. Un pirate mettra bien évidemment un autre code .

    Une XSS permet à un attaquant d’injecter un script dans le contenu d’un site Web ou d’une application. Lorsqu’un utilisateur visite la page infectée, le script s’exécute dans le navigateur de la victime.

    Une XSS reflected (ou également appelé attaque XSS non persistante) est un type spécifique de XSS. Elle est transmise dans la requête, généralement dans l’URL. Comparé au XSS stocké, le XSS reflected nécessite que le script malveillant soit ajouté à un lien et qu’un utilisateur clique dessus.

    Dernier petit échauffement avant d’attaquer les challenges de niveaux 2 et 3.
    Nous allons nous inscrire sur la boutique avec l’adresse mail This email address is being protected from spambots. You need JavaScript enabled to view it. et le mot de passe 12345 en ne respectant pas les condition de mot de passe du site . Je me rends sur la page d’inscription et remplis les différents champs demandés.
    Lors de l’inscription, si le deuxième mot de passe n’est pas identique au premier mot de passe saisi, nous aurons une erreur.

    « Les mots de passes ne correspondent pas »

    Ce qui est logique . Je saisis donc 12345 en deuxième mot de passe . Avant de valider, je remodifie le premier mot de passe entrée par 12349 sans toucher au deuxième mot de passe. Puis je valide l’inscription.

    Aucune erreur n’est remontée et le challenge est validé . J’ai volontairement modifié le code pour passer le type des “passwords” en “text” pour que vous puissiez voir les valeurs avant la validation du formulaire.

     

     

    Niveau 2 Juice Shop – Easy Challenges

     

    Un défi intéressant dans cette partie est le défi ou nous devons voir le panier d’un autre utilisateur du site web. Pour cela, j’ai ajouté des articles et je me suis rendu dans mon panier . J’ai ensuite inspecté le code de la page grâce aux outils développeur de mon navigateur web . Une fois dans l’onglet storage, puis session storage, nous pouvons voir que je possède la valeur 5 .

    En modifiant la valeur par celle d’un autre utilisateur et en rafraichissant la page, on se retrouve avec le panier d’un autre utilisateur .

    Un autre défi où nous devons nous connecter en tant qu’administrateurs sur le site juiceshop.

    Nous utiliserons l’injection SQL pour réaliser ce défi. L’injection SQL est une méthode d’attaque très connue. C’est un vecteur d’attaque extrêmement puissant quand il est bien exploité. Il consiste à modifier une requête SQL en injectant des morceaux de code non filtrés, généralement par le biais d’un formulaire.

    Il faut se rendre dans le formulaire de connexion au site . Nous utiliserons ici en login une instruction basique toujours vraie ‘ or 1=1– et un mot de passe pris au hasard. Cette instruction authentifiera la première personne dans la table Users (car la condition est vraie)qui se trouve être par hasard et par chance l’administrateur.

    Au passage nous pouvons maintenant accéder à l’interface d’administration repérer dans la partie échauffement . Nous récupérons beaucoup d’informations comme les adresses mail des utilisateurs inscrits, leurs ID sur le site, etc..

    Le dernier défi que j’ai apprécié et une attaque XSS sur une entrée filtrée par le site web .

    Étant connecté en tant qu’administrateur, j’ai modifié son profil . En username, j’ai entré la même XSS que tester au-dessus
    <script>alert(`computer-security.fr`)</script> . On remarque sous la photo de profil que le nom d’utilisateur est maintenant lert(`computer-security.fr`) ce qui indique que l’entrée username est filtrée. Ici le début de l’entrée est filtré.

    Après plusieurs tentatives, j’ai entré l’XSS suivante
    <<a|ascript>alert(`computer-security.fr`)</script> pour valider le challenge. Le filtre mis en place va supprimer cette partie <a|a . La popup apparaît et le challenge est validé.

     

     

     

    Niveau 3 –
    Medium Challenges

     

    Premier challenge intéressant de cette dernière partie, nous devons mettre un commentaire sous le nom d’un autre utilisateur. Après avoir longuement cherché il suffit d’inspecter le code de la page pour voir l’attribut hidden= “” . En le supprimant et en rechargeant la page web, nous pouvons voir l’apparition d’un nouveau champ.

    Il nous suffit d’entrer l’ID d’un autre utilisateur ( repéré au niveau 2 grâce à l’injection SQL) et valider le commentaire . Le commentaire est envoyé sous le nom d’un autre utilisateur.

    Le challenge le plus intéressant des 3 premiers niveaux, le bypass de captcha . Le but est ici de poster 10 commentaires en moins de 10secondes (en bypassant le captcha installé par le site).

    J’ai dans un premier temps regardé comment fonctionnait le captcha . En analysant les requêtes envoyées, on s’aperçoit que la page /rest/captcha est appelée. Elle contient l’ID du captcha, le calcul que nous devons réaliser, et la réponse attendue, ici 37.

    C’est assez simple, il nous suffit de rentrer 37 pour valider le premier captcha . Le problème est que le captcha change à chaque nouveau poste de commentaires. Les valeurs demandées peuvent même être négative -1, -2, -3, -4, -5, -6, etc . Le brute force n’est pas possible . J’ai lancé mon proxy web pour analyser plus en détail les requêtes web envoyées entre mon navigateur et le site juice shop.

    Au bout de plusieurs captchas de validés, je me suis aperçu que la valeur de l’ID du captcha et incrémenter de 1 a chaque nouveau poste de commentaire. Mais est-ce que les anciens ID de captcha déjà validé par mes soins existent toujours ?

    Nous pouvons voir ici le 7e test de captcha ( ID = 7) , la réponse attendue par le site est 19.

    Je relance le captcha pour la 8e fois , j’intercepte avec burpsuite la requête et j’inverse l’ID 8 par 7 est la valeur 5 par 19 avant d’envoyer la requête à jucie shop.

    Le commentaire est validé . J’ai tout simplement réutilisé un ancien captcha déjà validé. Je récupère alors la requête curl et crée une boucle de 10 itérations avec un simple for, ce qui permettra de poster 10 commentaires rapidement avec le captcha portant l’ID 7.

    Autre défi intéressant, nous devons ici modifier les quantités de produits dans notre panier à des valeurs négatives . Je me connecte, et ajoute un article dans mon panier. Problèmes, nous ne pouvons pas modifier la quantité à moins de 1 depuis cette interface ou alors l’article est supprimé (il y a une vérification côté client).

    En analysant toujours le code de la page, nous pouvons voir que l’API appelée est BasketItems et que l’ID de notre produit est le 6.

    Je récupère la requête envoyée sous forme de curl et la copie/colle dans mon terminal. Avant de valider je modifie la quantité à -100 et valide.

    En retournant dans mon panier la quantité est bien passée à -100. Il nous suffit de valider notre panier avec le un montant TTC de -199.00$ ^^ pour valider l’épreuve.

    Dernier défi créer un compte, qui sera ici administrateur du site. Je me rends dans la page d’inscription . Comme pour beaucoup d’autres défis il suffit de regarder les requêtes web envoyer depuis mon navigateur vers le site pour se rendre compte que l’API appelé ici est l’API “Users”. En effectuant un POST vers cette API, nous pouvons voir que le paramètre “isAdmin” est à “false” par défaut.

    Je tente une inscription en envoyant en paramètres une adresse mail, un mot de passe, et le paramètre “isAdmin” à “True” . Le site me renvoie un “succes” .

    Une fois connecté, mon compte créé fait bien partie des administrateurs du site .

     

          

        Cet article reflète exclusivement l'opinion de ses auteurs et n’engage en aucune façon Consultingit. J'espère que ça vous a plu. Vos commentaires/remarques sont les bienvenus: