Intruder et Repeater

Repeater

Burp Repeater est un outil qui vous permet de modifier et d'envoyer un message HTTP ou WebSocket intéressant à plusieurs reprises.

Vous pouvez utiliser Repeater à toutes sortes de fins, par exemple pour :

  • Envoyer une requête avec des valeurs de paramètres variables pour tester les vulnérabilités basées sur les entrées.

  • Envoyer une série de requêtes HTTP dans une séquence spécifique pour tester les vulnérabilités dans les processus à plusieurs étapes, ou les vulnérabilités qui reposent sur la manipulation de l'état de la connexion.

  • Vérifier manuellement les problèmes signalés par Burp Scanner.

Repeater vous permet de travailler simultanément sur plusieurs messages, chacun dans son propre onglet. Toutes les modifications apportées à un message sont enregistrées dans l'historique de l'onglet. La fonction de regroupement vous permet de gérer facilement un grand nombre d'onglets ouverts.

Envoi d'une requête à Burp Repeater

La façon la plus courante d'utiliser Burp Repeater est de lui envoyer une requête à partir d'un autre outil de Burp. Dans cet exemple, nous enverrons une requête à partir de l'onglet "Proxy > Intercept".

Target

Pour cette partie, nous allons utilisé la cible suivante:

C'est une application en mode "jeu" qui possède plusieurs niveaux de failles XSS.

Petit rappel:

XSS:

Cross-site scripting (XSS) est une faille de sécurité qui permet à un attaquant d'injecter dans un site web un code client malveillant. Ce code est exécuté par les victimes et permet aux attaquants de contourner les contrôles d'accès et d'usurper l'identité des utilisateurs. Selon le projet Open Web Application Security, XSS était la troisième cause de vulnérabilité des applications du web en 2013. Définition: DEVELOPPER.MOZILLA.ORG

Étape 1 : Envoyer la requête au Repeater

Dans le tutoriel précédent, vous avez appris à intercepter une requête. Nous allons faire de même avec le niveau 1 sur notre cible.

Dans le premier niveau, il nous est demandé d'introduire une demande dans la barre de recherche, nous allons donc intercepter cette requête:

Maintenant, nous allons faire un clique-droit sur la requête et faire "Send to Repeater" ou le raccourci clavier "CTRL-R":

Dans l'onglet "Repeater", nous voyons notre requête à gauche, une fois que nous cliquons sur le bouton "Send", nous voyons la réponse apparaître sur le volet de droite:

Étape 2: Modifier la valeur dans le Repeater

Il est donc possible de modifier notre requête à gauche pour tenter de trouver la faille et passer au niveau 2 de notre jeu XSS.

Essayons de remplacer la valeur de "query" par "</script>alert('1')</script>".

</script>alert('1')</script> est un payload XSS. La fonction alert() en javascript permet d'afficher une fenêtre "pop-up" pour afficher le message (dans notre cas le chiffre 1).

Ce payload est très utilisé et il permet d'avoir directement un visuel sur notre browser si la fonction est appelée.

Nous voyons dans la sortie que mes balises de script sont toujours intactes, ce qui signifie que notre attaque XSS pourrait fonctionner.

À partir de là, deux options s'offrent à nous:

  • Copier/coller l'url avec le payload dans le site web et le tester manuellement;

  • Utiliser Burp pour automatiser une requête du navigateur.

Pour la démonstration nous allons montrer l'input directement sur le site:

  • Dans la barre de recherche, on introduit notre payload:

  • Le résultat:

-> On obtient bien un "pop-up" qui indique que la vulnérabilité a été exploitée et que nous pouvons passer au niveau suivant.

  • La réponse de notre requête:

-> Identique à celle que nous avons dans le Repeater

Conclusion

Repeater est un outil d'altération manuelle qui vous permet de copier des requêtes provenant d'autres outils (Proxy, Target, etc.) et de les modifier avant de les envoyer à nouveau à la cible. Le Repeater permet de modifier facilement la charge utile et fournit également des liens permettant de répéter rapidement l'attaque dans le navigateur.

Voila pour notre introduction du Repeater, passons maintenant à l'intruder !

Intruder

Imaginons que nous voulions nous connecter à une application mais que nous ne connaissions pas le nom d'utilisateur ou le mot de passe. Nous pourrions copier une demande de connexion dans l'outil Repeater, puis sélectionner manuellement le nom d'utilisateur et le mot de passe et les remplacer à chaque fois par des options d'une liste.

Bien sûr, nous devrions faire cela des centaines, voire des milliers de fois. Si nous voulons automatiser un processus comme celui-ci, où nous avons un paramètre changeant et un ensemble connu de valeurs que nous voulons essayer, alors il est temps d'utiliser l'outil Intruder.

Burp Intruder est un outil permettant d'automatiser des attaques personnalisées contre des applications web. Il vous permet de configurer des attaques qui envoient la même requête HTTP à plusieurs reprises, en insérant à chaque fois des charges utiles différentes dans des positions prédéfinies.

Target

Pour cette partie, on va utiliser l'application Google Gruyere qui nous permet de nous connecter à un compte.

Étape 1 : Envoyer la requête à l'Intruder

Comme nous avons fait pour le Repeater, nous allons intercepter la requête de connexion avec le nom d'utilisateur et le mot de passe.

La fonction de connexion est le "Sign In" dans Google Gruyere:

Avant de faire le tuto Intruder, utilisez la fonction "Sign up". Elle permet de créer un compte sur l'application. Dans mon exemple, l'utilisateur à le nom "test".

La requête capturée sur Burp:

Maintenant, nous allons faire un clique-droit sur la requête et faire "Send to Intruder" ou le raccourci clavier "CTRL-I":

Étape 2: Modifier les valeurs dans l'onglet Positions

Dans l'onglet "Intruder", nous voyons plusieurs onglets ainsi que notre requête:

  • Tout d'abord, on remarque que des valeurs sont surlignées:

-> Nous allons donc "Clear" toutes les informations et sélectionner juste la valeur du mot de passe (derrière le "pw=").

Types d'attaque

Nous allons définir les différents types d'attaque:

Sniper:

Cette attaque place chaque charge utile dans chaque position de charge utile à tour de rôle. Elle utilise un seul ensemble de données utiles.

Le nombre total de requêtes générées par l'attaque est le produit du nombre de positions et du nombre de payloads dans l'ensemble de payloads.

L'attaque Sniper est utile pour analyser individuellement un certain nombre de paramètres de demande afin de détecter des vulnérabilités courantes.

Battering Ram:

Cette attaque place simultanément la même charge utile dans toutes les positions de charge utile définies. Elle utilise un seul ensemble de charges utiles.

Le nombre total de requêtes générées par l'attaque correspond au nombre de charges utiles de l'ensemble de charges utiles.

L'attaque "Battering Ram" est utile lorsqu'une attaque nécessite l'insertion d'une même donnée à plusieurs endroits de la requête. Par exemple, un nom d'utilisateur dans un cookie et un paramètre du corps de la requête.

Pitchfork:

Cette attaque itère à travers un ensemble de charges utiles différentes pour chaque position définie. Les charges utiles sont placées simultanément dans chaque position. Par exemple, les trois premières requêtes seraient les suivantes :

  • Première demande :

Position 1 = Première charge utile de l'ensemble 1.

Position 2 = première charge utile de l'ensemble 2.

  • Deuxième demande :

Position 1 = Deuxième charge utile de l'ensemble 1.

Position 2 = deuxième charge utile de l'ensemble 2.

  • Troisième demande :

Position 1 = Troisième charge utile de l'ensemble 1.

Position 2 = Troisième charge utile de l'ensemble 2.

Le nombre total de demandes générées par l'attaque correspond au nombre de charges utiles dans le plus petit ensemble de charges utiles.

L'attaque Pitchfork est utile lorsqu'une attaque nécessite l'insertion de données différentes mais connexes à plusieurs endroits de la demande. Par exemple, pour placer un nom d'utilisateur dans un paramètre et un numéro d'identification connu correspondant à ce nom d'utilisateur dans un autre paramètre.

Cluster bomb:

Cette attaque utilise de manière itérative un ensemble de charges utiles différent pour chaque position définie. Les charges utiles sont placées à partir de chaque ensemble à tour de rôle, de sorte que toutes les combinaisons de charges utiles sont testées. Par exemple, les trois premières requêtes seraient les suivantes :

  • Première demande :

Position 1 = première charge utile de l'ensemble 1.

Position 2 = première charge utile de l'ensemble 2.

  • Deuxième demande :

Position 1 = première charge utile de l'ensemble 1.

Position 2 = deuxième charge utile de l'ensemble 2.

  • Troisième demande :

Position 1 = Première charge utile de l'ensemble 1.

Position 2 = Troisième charge utile de l'ensemble 2.

Le nombre total de demandes générées par l'attaque est le produit du nombre de charges utiles dans tous les ensembles de charges utiles définis - ce nombre peut être extrêmement élevé.

L'attaque par bombes à fragmentation est utile lorsqu'une attaque nécessite l'insertion de données inconnues ou sans rapport entre elles à plusieurs endroits de la demande. Par exemple, lorsqu'il s'agit de deviner un nom d'utilisateur et un mot de passe.

Dans notre cas, nous avons le nom d'utilisateur et nous devons trouver le mot de passe, du coup il nous faut l'attaque Sniper.

Étape 3: Modifier les valeurs dans l'onglet Payload

Nous utiliserons "Simple list" comme type de charge utile, mais il existe de nombreuses autres options, comme "numbers", qui pourrait être utilisé pour trouver des identifiants ou modifier une valeur dans une chaîne de caractères plus longue.

Si vous disposez de la version Pro, vous pouvez utiliser des listes prédéfinies dans Burp. Si vous utilisez la version gratuite, vous pouvez soit charger une liste (par exemple "Rock you" pour les mots de passe, etc.), soit créer votre propre liste.

Pour cet exemple, je vais créer ma propre liste de 10 mots de passe possibles en les tapant et en cliquant sur ajouter. Comme l'ensemble de données utiles "1" a été sélectionné dans la section des ensembles de données utiles, cela s'applique à mon premier paramètre, qui est le mot de passe.

Nous voyons maintenant que le nombre de requêtes est de 10, ce qui est logique. J'ai 1 nom d'utilisateur (Test) et 10 mots de passe.

Si nous essayons toutes les combinaisons (puisque nous avons réglé notre type d'attaque sur "Sniper"), nous allons avoir 10 requêtes au total.

Ensuite, nous cliquons sur "Start Attack" dans les options "Payload Sets". Si vous avez la version gratuite, vos attaques seront limitées, donc les grandes listes prendront beaucoup de temps. Les 10 requêtes devraient toutefois être traitées très rapidement.

Une fois l'attaque lancée, nous avons une fenêtre pop-up ouverte qui énumère toutes les requêtes.

Dès que l'attaque est terminée, nous remarquons qu'un des payloads (charges utiles) à une plus grande valeur dans la longueur de la réponse:

Vu que tous les statuts des réponses sont à 200, la longueur indiquerait que nous avons trouvé la bonne valeur.

Code 200 OK:

Le code de statut de réponse HTTP 200 OK indique la réussite d'une requête. Une réponse 200 peut être mise en cache par défaut.

La signification de la réussite dépend de la méthode de requête HTTP :

  • GET : la ressource a été récupérée et est transmise dans le corps du message.

  • HEAD : l'ensemble des en-têtes est présent dans la réponse, celle-ci n'a pas de corps.

  • POST : la ressource qui décrit le résultat d'une action est transmise dans le corps du message.

  • TRACE : le corps du message contient le message de requête reçu par le serveur.

SOURCE: developer.mozilla.org

Essayons notre mot de passe sur la page de login:

Ceci termine notre chapitre sur le Repeater et l'Intruder, il y a biensûr encore des options à parcourir surtout dans la partie Intruder, on en discutera par la suite 😄