
pfSense CE 2.9.0-DEVELOPMENT - Alto - Remoto - RCE - CARP VHID residuo
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Write-up: https://abraxaslabs.tech/research/pfsense-carp-vhid
Classe: RCE Portata: Remota
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La modifica di un Virtual IP memorizza il VHID CARP proveniente dalla POST senza alcun controllo 1-255. Le opzioni di Form_Select sono solo HTML. L'applicazione CARP applica escapeshellarg al VHID. L'applicazione di un IP Alias sovrapposto interpola vhid {$carpvip['vhid']} al di fuori di escapeshellarg. Lo stato CARP interpola lo stesso VHID memorizzato in una pipeline grep con doppi apici; il punto e virgola resta tra apici, la sostituzione di comando viene comunque eseguita sotto /bin/sh -c. Il privilegio richiesto è modifica + applicazione VIP, non Diagnostics: Command.
| ID | nessuna CVE al momento |
| Classe | RCE |
| Portata | Remota (WebGUI autenticata) |
| CWE | CWE-78 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | pfSense CE |
| Affetto | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) CARP VHID |
| Auth | Sessione WebGUI con modifica + applicazione VIP (lo status/widget è un trigger successivo) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Ho fissato il master pubblico 9363ac5. Il lab è un gadget PHP composto da interface_carp_configure fissato, mwexec dell'ipalias sovrapposto e exec dello status. Loopback 127.0.0.1:18830.
| Metodo | Sink | Privilegio |
|---|---|---|
POST di un VIP carp con un VHID non intero, poi applicazione di un IP Alias sovrapposto su quel parent _vip{uniqid} | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | Integrità (dimostrata nel lab): shell root. Lab: ipalias-unescaped ha scritto il witness. L'applicazione CARP dello stesso VHID non ha scritto nulla (carp-escaped=yes). |
Stesso VHID memorizzato, poi GET di status_carp.php o rendering di carp_status.widget.php | pipeline grep exec (pfsense-utils.inc:794) | Integrità (dimostrata nel lab): la sostituzione di comando all'interno dei doppi apici è stata eseguita e ha scritto il witness (status-sink=yes, status-subst=yes). Il punto e virgola è rimasto tra apici. Il trigger del widget può essere un'altra sessione GUI. |
| Stessa shell root | filesystem dell'host | Ricognizione (dedotta): config.xml, chiavi. |
Shell root o ifconfig compromesso | dispositivi CARP / alias | Disponibilità (dedotta): interruzione di interfaccia / CARP / filtro. |
Dimostrato nel lab vs dedotto: carp-escaped, il witness di ipalias-unescaped e il witness di sostituzione di comando dello status sono dimostrati nel lab. La ricognizione del filesystem e l'interruzione del filtro sono dedotte dal PHP-FPM root.
Richiede: page-firewall-virtualipaddress-edit (salvataggio) e page-firewall-virtualipaddresses (applicazione). Sink dello status: page-status-carp o qualsiasi dashboard con il widget CARP. CSRF sulla POST.
| Superficie | Lab |
|---|---|
| L'applicazione CARP stessa | escapeshellarg sul VHID, carp-escaped=yes |
| Password CARP / advbase / advskew / subnet | is_ipaddr / escaped |
| Non autenticato | chiuso |
| Applicazione xmlrpc degli stessi oggetti senza credenziali HA | skip-list SA-26_22 |
| Diagnostics: Command | resta chiuso se non concesso esplicitamente |
cd lab
./run.sh
Loopback 127.0.0.1:18830. Progetto Compose pfsense-carp-vhid. Tag immagine pfsense-carp-vhid:2.9.0-dev. Witness PFSENSE-CARP-VHID-WITNESS. Ultima riga:
SUCCESS PFSENSE-CARP-VHID carp-escaped=yes ipalias-unescaped=yes status-sink=yes PFSENSE-CARP-VHID-WITNESS
Limita il VHID all'intervallo di interi 1-255 al salvataggio. Applica escapeshellarg al VHID durante l'applicazione degli IP Alias impilati e sul grep di stato, allo stesso modo in cui lo fa già l'applicazione CARP.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc mwexec degli ipalias impilatipfsense-utils.inc grep di stato CARP