SSRF (curl) - Pentesting Web

Installation deuxième scénario (vulnérabilité SSRF):
  • Suppression des images du conteneur précédent :

docker rm $(docker ps -a -q) --force
docker network create --driver=bridge network1 --subnet=10.10.0.0/24
  • Création de trois conteneurs (post-production, web ouvert et attaquant):

docker run -dit --name PRO ubuntu
docker network connect network1 PRO # pour associer l'adresse IP

Machine serveur web (post-production):

apt install apache2 php nano -y
service apache2 start
  • Dans le répertoire /var/www/html, création d'un fichier utility.php

<?php
if (isset($_GET['url'])) {
    $url = $_GET['url'];
    echo "\n[+] Listing du contenu du site Web " . $url . ":\n\n";
    include($url);
} else {
    echo "\n[!] Aucune valeur n'a été fournie pour le paramètre d'URL\n\n";
}
?>
  • Dans ce cas, il ne le représente pas correctement :

  • Pour ce faire, il faut modifier ce fichier : "/etc/php/8.1/apache2/php.ini" en mettant allow_url_include sur on :

  • Redémarrer le service apache2 :

service apache2 restart
  • Création d'un fichier login.html dans le répertoire /tmp/ qui simule une connexion sur le site public :

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page de connexion</title>
<style>
Body {
  font-family: Calibri, Helvetica, sans-serif;
  background-color: rose;
}
button {
       background-color: #4CAF50;
       width: 100%;
        color: orange;
        padding: 15px;
        margin: 10px 0px;
        border: none;
        cursor: pointer;
         }
 form {
        border: 3px solid #f1f1f1;
    }
 input[type=text], input[type=password] {
        width: 100%;
        margin: 8px 0;
        padding: 12px 20px;
        display: inline-block;
        border: 2px solid green;
        box-sizing: border-box;
    }
 button:hover {
        opacity: 0.7;
    }
  .cancelbtn {
        width: auto;
        padding: 10px 18px;
        margin: 10px 5px;
    }


 .container {
        padding: 25px;
        background-color: lightblue;
    }
</style>
</head>
<body>
    <center><h1>Formulaire de connexion étudiant (PRO)</h1></center>
    <form>
        <div class="container">
            <label>Nom d'utilisateur :</label>
            <input type="text" placeholder="Entrez le nom d'utilisateur" name="username" required>
            <label>Mot de passe :</label>
            <input type="password" placeholder="Entrez le mot de passe" name="password" required>
            <button type="submit">Connexion</button>
            <input type="checkbox" checked="checked"> Souviens-toi de moi
            <button type="button" class="cancelbtn">Annuler</button>
            Oublié <a href="#">mot de passe ?</a>
        </div>
    </form>
</body>
</html>
  • Maintenant, il est temps de configurer la machine Post-Production :

docker run -dit --name PRE --network=network1 ubuntu

apt install nano python3 curl -y
  • Création d'un fichier Html dans /tmp avec le contenu suivant qui normalement ne devrait pas être visible en dehors du réseau interne :

Vous ne devriez pas être en mesure de voir ce contenu car il n'est pas exposé à l'extérieur et correspond à un service Web hébergé sur une machine dans le réseau interne de l'entreprise.

  • Création d'un serveur web avec Python3 sur le port 7878 :

python3 -m http.server 7878
  • Enfin, création de la machine attaquante :

docker run -dit --name ATTACKER ubuntu

Dessin technique pour comprendre le deuxième scénario (Il y a un site web sur une machine Linux sur le port 8089 qui n'est visible que depuis le réseau interne):

Depuis le conteneur de l'Attaquant avec curl, nous essayons d'accéder à la machine avec le serveur web mais nous voyons que cela ne fonctionne pas :

Mais si nous utilisons la technique de SSRF, nous obtenons l'accès au fichier caché :

Mis à jour

Ce contenu vous a-t-il été utile ?