Burp Intruder est un outil permettant d'automatiser des attaques sur des applications Web. Quelques cas d'utilisation :
Enumération d'identifiants
Fuzzing (brute-force sur des formulaires d'authentification)
Injection SQL
Cross Site Scripting
Dépassement de tampon (buffer overflow)
Prédiction de token de session
Vol de session (session hijacking)
Attaques sur les accès concurrents
Déni de serive (DoS)
etc.
Onglets
target
Cet onglet permet de spécifier une cible :
host : adresse IP ou nom d'hôte
port : port cible
use SSL : utilisation du protocole SSL (fixe la valeur du port à 443 par défaut)
positions
Template
S'il est possible de paramétrer manuellement la fonction "intruder", il est beaucoup plus simple de sélectionner l'option "send to intruder" à partir du menu contextuel sur l'écran Target > Site map.
Les captures qui suivent présentent le code et le résultat d'une application de test PHP qui permet de tester la fonctionnalité d'importation automatique :
Le résultat capturé dans BurpSuite :
Comme on peut le constater, les onglets "target" et "positions" sont remplis automatiquement. Les variables sur lesquelles "intruder" va intervenir apparaissent entre des marqueurs de position (§) en gras et en rouge dans l'onglet "positions". Il est possible de modifier le template une fois importé. Les boutons présents autour du template sont expliqués ci-dessous :
add § : insère un caractère § à l'endroit du curseur
clear § : supprime tous les caractères § du template
auto § : détection automatique des variables du template
refresh : recalcule les couleurs du template
clear : supprime l'intégralité du template
Attack type
Une fois le template rempli, il est nécessaire de préciser le type d'attaque parmi le choix suivant :
Type attaque
Description
Nombre de combinaisons
Cas d'utilisation
sniper
Utilise une liste unique de payloads; les paramètres sont testés un à un avec chacune des valeurs de payload
(nb de champs encadrés par des marqueurs de position) x (nb de payloads de la liste des payloads)
permet de tester la vulnérabilité de champs de formulaire à des attaques (par exemple XSS)
battering ram :
Utilise une liste unique de payloads; insère le même contenu (payload) dans chaque champ entouré des marqueurs de position
Utilisé dans des attaques nécessitant la même valeur à plusieurs endroits de la requête HTTP (par exemple un nom d'utilisateur apparaissant dans l'en-tête Cookie et dans le corps du message)
nb de payloads contenus dans la liste des payloads
pitchfork :
Utilise autant de liste de payloads que de paramètres (dans la limite de 8); Les listes de payloads sont déchargées dans les paramètres jusqu'au dernier payload de la liste des payloads la plus courte.
Utilisé dans des attaques nécessitant des paramètres liés au sein de la requête HTTP (par exemple un nom d'utilisateur dans un champ et son numéro identifiant dans un autre champ)
nb de payloads contenus dans la plus petite liste des payloads
cluster bomb :
Utilise autant de liste de payloads que de paramètres (dans la limite de 8); toutes les combinaisons sont testées, à la manière de molettes de cadenas à code. Par exemple, sur 2 deux listes de payloads, le premier payload de la première liste est testé avec chacune des valeurs de payloads de la deuxième liste. Le deuxième payload de la première liste est ensuite testé avec chaque valeur de payload de la deuxième liste, et ainsi de suite.
Utilisé dans des attaques de brute-force (par exemple, une combinaison de noms d'utilisateurs et de mots de passe)
(nb de payloads contenus dans la première liste) x (nb de payloads contenus dans la deuxième liste) x ...
payloads
payload sets
Cet onglet permet de préciser les payloads de l'attaque, c'est à dire la liste des valeurs à tester.
Des pré-configuration sont disponibles dans la liste déroulante :
preset list
Permet de contruire une liste de valeurs libres. Les boutons sur la droite permettent d'ajouter des éléments (add), de charger la liste à partir d'un fichier (load), de coller une valeur (paste), de supprimer un valeur (delete) ou de supprimer toutes les valeurs de la liste (clear).
runtime file
Permet de charger un fichier externe (select file)
custom iterator
Permet de construire des "masques". Par exemple, si un identifiant est constitué d'une lettre, d'un point et de 4 chiffres, nous aurons le masque suivant §p1§§p2§§p3§§p4§ paramétré comme suit :
character substitution
Cette option permet de tester différentes variantes de mots en fonction de caractères de substitution. Par exemple, si nous avons
a > 4
z > 2
e > 3
r
t > 7
y
alors les combinaisons possibles pour azerty seront :
azerty
4zerty
42erty
423rty
423r7y
...
case substitution
Cette option permet, à partir d'un liste, d'effectuer des substitutions sur la casse (minuscules et majuscules). Par exemple, pour la chaîne "jimCarreY" :
Substitution
Résultat
no change
jimCarreY (aucun changement)
to lower case
jimcarrey (toutes les lettres en minuscules)
to upper case
JIMCARREY (toutes les lettres en majuscules)
to Propername
Jimcarrey (la première lettre en majuscules, toutes les suivantes en minuscules)
to ProperName
JimCarreY (la première lettre en majuscules, toutes les suivantes inchangées)
recursive grep
INCOMPLETE SECTION OR ARTICLE
This section/article is being written and is therefore not complete. Thank you for your comprehension.
illegal unicode
L'attaque consiste en l'utilisation d'un caractère joker pour le remplacer itérativement par une liste de caractères unicode illégaux. Ce type d'attaque peut être utilisé afin de forcer de masques de validation basé sur le "pattern-matching" (par exemple la fonction PHP preg_match).
Les options sont les suivantes :
Option
Description
max overlong UTF-8 length
Par défaut, les caractères unicodes sont encodés sur un byte, mais il est possible de les encoder sur plusieurs bytes (overlong encoding). Ce champ permet de spécifier la longueur à utiliser (jusqu'à 6 bytes). En fonction de cette valeur, certaines options ne sont pas disponibles (voir description par option).
max encodings
Fixe un plafond sur le nombre d'encodages illégaux générés, ce qui peut être utile dans le cas par exemple où "max permutations" est coché.
illegal UTF-8 variants
Cette option n'est disponible que pour des valeurs de "max overlong UTF-8 length" > 1 byte. La Cette option permet de malformer les bytes suivant le premier. La forme normale des bytes suivants le premier est du type 10XXXXXX. Dans la mesure où le premier byte contient des informations sur le nombre de bytes suivants, les deux premiers bits des bytes suivants le premier peuvent être ignorés par les routines de décodage. Cela permet d'ajouter les variantes suivantes : 00XXXXXX, 01XXXXXX et 11XXXXXX.
max permutations (1ère ligne)
Cette option n'est disponible que si :
le champ "max overlong UTF-8 length" > 2 bytes
l'option "illegal UTF-8 variants" est cochée
Lorsque cette option n'est pas activée, les bytes d'extension sont générés chacun avec une variante (voir option "illegal UTF-8 variants"). Lorsque l'option est activée, toutes les combinaisons sont testées. Ceci peut être utile pour forcer des contrôles avancés de pattern-matching.
add % prefix
Permet l'insertion du caractère % devant chaque groupe de 2 caractères hexadécimaux
illegal hex
Permet l'encodage hexédécimal (A à F pour remplacer les nombres 10 à 15) des payloads générés
max permutations (2ème ligne)
Cette option est disponible si "max overlong ITF-8 length" est supérieur à 1 byte et que l'option "illegal hex" est cochée. Lorsque cette option n'est pas activée, les bytes sont générés chacun avec un code hexadécimal illégal (voir option "illegal hex"). Lorsque l'option est activée, toutes les combinaisons sont testées. Ceci peut être utile pour forcer des contrôles avancés de pattern-matching.
lower case hex
Force l'utilisation de minuscules dans l'écriture des caractères hexadécimaux.
character blocks
Cette attaque permet la génération de suite d'un même caractère.
base string : caractère de base, à dupliquer
min length : taille minimale de la chaîne
max length : taille maximale de la chaîne
step : pas (incrément) de taille de chaîne entre deux itérations
numbers
Range :
from : définit la borne inférieure de l'intervalle
to : définit la borne supérieure de l'intervalle
step : Uniquement disponible pour le mode "sequential". Définit le pas (incrément) entre deux générations.
how many : Uniquement disponible pour le mode "random". Définit le nombre d'éléments à générer
format :
min integer digits : Permet de définir le nombre de caractères minimaux que doit contenir la partie entière. Complète éventuellement par des "0". Par exemple "1" sera transformé en "01" avec une valeur de "2" dans ce champ.
max integer digits : Permet de définir le nombre de caractères maximaux que doit contenir la partie entière. Tronque le nombre généré le cas échéant. Par exemple, "1234" sera transformé en "12" avec une valeur de "2" dans ce champ.
min fraction digits : Uniquement disponible pour le mode "decimal". Définit le nombre de caractères minimaux que doit contenir la partie décimale. Complète éventuellement par des "0". Par exemple, "12,3" sera transformé en "12.30" pour une valeur de "2" dans ce champ.
max fraction digits : Uniquement disponible pour le mode "decimal". Tronque la partie décimale le cas échéant. Par exemple, "12,345" sera transformé en "12,34" pour une valeur de "2" dans ce champ.
modes :
sequential vs random : le mode sequential permet une génération continue entre les deux bornes (champs "from" et "to") de l'intervalle alors que le mode random permet une génération de nombres aléatoires, compris entre les deux bornes de l'intervalle.
decimal vs hex : le mode decimal permet une génération de nombres décimaux alors que le mode hex généères des nombres au format hexadécimal.
dates
Ce type de payload permet de générer automatiquement des dates comme payload. Les champs sont détaillés ci-dessous :
from : date de début
to : date de fin
step : pas (incrément) entre deux dates générées
format : format pré-défini ou personnalisé. Pour ce dernier, la syntaxe permet de construire n'importe quel format de date avec :
Caractère
Description
Exemple
E
Nom abrégé (3 caractères) du jour de la semaine
Mon, Tue, ..., Sun
EEEE
Nom complet du jour de la semaine
Monday, Tuesday, ..., Sunday
d
Numéro du jour dans le mois
1, 2, ..., 31
dd
Numéro du jour (sur 2 caractères) dans le mois
01, 02, ..., 31
M
Numéro du mois dans l'année
1, 2, ..., 12
MM
Numéro du mois (sur 2 caractères) dans l'année
01, 02, ..., 12
MMM
Nom abrégé (3 caractères) du mois
Jan, Feb, ..., Dec
MMMM
Nom complet du mois
January, February, ..., December
yy
Année (sur 2 caractères)
08, 09, 10, ...
yyyy
Année (sur 4 caractères)
2008, 2009, 2010
brute forcer
Cette attaque permet de tester toutes les combinaisons possibles, à partir d'un jeu de caractères, dans une taille définie entre une borne inférieure et une borne supérieure.
null payloads
Cette attaque permet d'envoyer une chaîne vide (NULL) à l'emplacement du marqueur de position. Si d'autres paramètres sont précisés dans la requête sans marqueur de position, cela permet d'exécuter la requête sans modification un nombre de fois limité (generate) ou illimité (continue indefinitely). Cette attaque peut être utilisée pour tester une application face à un déni de service (DoS pour Denial of Service en anglais).
Traitements sur les payloads
Les options qui suivent (case, match/replace et encode) s'appliquent au titre de traitements additionnels sur les payloads.
case
do not modify : N'effectue aucune modification concernant la casse (majuscules/minuscules).
to lower case : transpose tous les payloads en minusules
to upper case : transpose tous les payloads en majuscules
to Propername : transpose tous les payloads avec la première lettre en majuscule et toutes les suivantes en minuscules
to ProperName : transpose tous les payloads avec la première lettre en majuscule (les lettres suivantes restant inchangées).
match/replace
match regex : permet de spécifier un masque d'expression régulière pour modification de tout payload correspondant au masque.
replace with : permet de spécifier le remplacement à opérer sur le payload.
replace all : Si cette option n'est pas cochée, seule la première occurence est remplacée. Dans le cas contraire, toutes les occurences sont impactées par le remplacement.
encode
do not encode : Pas de traitement des payloads concernant l'encodage.
URL-encode these characters : Permet d'encoder une liste de caractères dans la norme URL-encode.
base-64 encode : Permet d'encoder les payloads dans la norme base-64.
hash : Permet de d'encoder chaque payload dans l'une des normes suivantes : SHA-256, SHA-512, SHA, SHA-384, MD5, MD2
add prefix : Ce champ n'est disponible que pour les options "base-64 encode" et "hash". Il permet d'ajouter un préfixe qui ne sera pas encodé. Ceci peut être utilisé par exemple pour des opérations de brute-force à partir d'un identifiant connu, et sur lequel on recherche le mot de passe.
add suffix : Ce champ n'est disponible que pour les options "base-64 encode" et "hash". Il permet d'ajouter un suffixe qui ne sera pas encodé.
Menu
Une fois le paramétrage de l'attaque effectué, c'est à partir de l'option "Start" du menu que l'attaque est lancée.
Fenêtre d'attaque
La fenêtre d'attaque a la forme suivante (voir capture ci-contre). Il est possible de double-cliquer sur les entrées pour afficher le détail de la requête, mais également d'envoyer chacune des requêtes vers le "repeater" ou le "comparer" en cliquant avec le bouton droit de la souris sur les entrées.