SSRF (wfuzz) - Pentesting Web
Installation premier scénario (vulnérabilité SSRF) :
docker pull ubuntu:latest
docker run -dit --name ssrf_first_lab ubuntu
docker exec -it ssrf_first_lab bash
apt update
apt install apache2 php nano python3 lsof -y
service apache2 start
lsof -i:80 # vérifier si le site web est actifDans le répertoire /var/www/html, créer un fichier utility.php avec le contenu suivant :
<?php
if (isset($_GET['url'])) {
$url = $_GET['url'];
echo "\n[+] Listing the content of the website " . $url . ":\n\n";
include($url);
} else {
echo "\n[!] No value has been provided for the URL parameter\n\n";
}
?>Dans ce cas, le script ne fonctionne pas comme prévu. Il faut modifier le fichier "/etc/php/8.1/apache2/php.ini" en mettant allow_url_include à "on".


Créez un fichier login.html dans le répertoire /tmp/ simulant une page de connexion en production :
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> Login Page </title>
<style>
Body {
font-family: Calibri, Helvetica, sans-serif;
background-color: pink;
}
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> Student Login Form (PRO) </h1> </center>
<form>
<div class="container">
<label>Username : </label>
<input type="text" placeholder="Enter Username" name="username" required>
<label>Password : </label>
<input type="password" placeholder="Enter Password" name="password" required>
<button type="submit">Login</button>
<input type="checkbox" checked="checked"> Remember me
<button type="button" class="cancelbtn"> Cancel</button>
Forgot <a href="#"> password? </a>
</div>
</form>
</body>
</html>Redémarrez le service apache2 après la modification :
service apache2 restartCréez un serveur web Python3 visible uniquement depuis le réseau interne :
python3 -m 4646 --bind 127.0.0.1Dessin technique pour comprendre le premier scénario (Il y a un site web sur le port 8089 qui n'est visible que depuis les ordinateurs du réseau interne):

Grâce au script utility.php, nous spécifions une URL et nous voyons qu'il l'interprète :

Si nous essayons de nous connecter depuis notre machine normale, nous n'avons pas accès au site web :

Mais si nous nous connectons avec le script utility.php en indiquant l'URL du réseau interne, nous voyons qu'il l'interprète :

Dans un cas hypothétique où nous ne connaissons pas le port, nous allons utiliser l'outil Wfuzz pour lancer une attaque de force brute :

Maintenant, nous filtrons pour n'indiquer que les sites web différents d'une taille de 4 caractères :
Il détecte les ports 80 et 4646 :

Mis à jour