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/24Cré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 IPMachine serveur web (post-production):

apt install apache2 php nano -y
service apache2 startDans 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 restartCré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 -yCré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 7878Enfin, 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 ?