
pfSense CE 2.9.0-DEVELOPMENT - Alto - Remoto - RCE - CARP VHID residuo
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-carp-vhid
Classe: RCE Portata: Remota
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
La modifica del Virtual IP memorizza il VHID CARP dal POST senza alcun controllo 1-255. Le opzioni di Form_Select sono solo HTML. L'applicazione CARP applica escapeshellarg al VHID. L'applicazione di IP Alias impilati 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 rimane tra apici, la sostituzione di comando viene comunque eseguita sotto /bin/sh -c. Il privilegio è modifica VIP + applicazione, 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 VIP + applicazione (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 di ipalias impilati e exec di stato. Loopback 127.0.0.1:18830.
| Metodo | Sink | Privilegio |
|---|---|---|
POST del carp VIP con un VHID non intero, poi applicare un IP Alias impilato su quel parent _vip{uniqid} | mwexec ifconfig ... alias {$gateway} {$vhid} (interfaces.inc:3238) | Integrità (dimostrata in 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 status_carp.php o rendering di carp_status.widget.php | pipeline grep exec (pfsense-utils.inc:794) | Integrità (dimostrata in 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 (inferita): config.xml, chiavi. |
Shell root o ifconfig compromesso | dispositivi CARP / alias | Disponibilità (inferita): interruzione di interfaccia / CARP / filtro. |
Dimostrato in lab vs inferito: carp-escaped, il witness di ipalias-unescaped e il witness di sostituzione di comando dello status sono dimostrati in lab. La ricognizione del filesystem e l'interruzione del filtro sono inferite da PHP-FPM root.
Richiede: page-firewall-virtualipaddress-edit (salvataggio) e page-firewall-virtualipaddresses (applicazione). Sink di stato: page-status-carp o qualsiasi dashboard con il widget CARP. CSRF sul 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 | rimane 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
Limitare il VHID a un intervallo intero 1-255 al salvataggio. Applicare escapeshellarg al VHID sull'applicazione di IP Alias impilati e sul grep di stato, allo stesso modo in cui l'applicazione CARP già fa.
9363ac5b8651a1c7a333180425ce7719070f95f9firewall_virtual_ip.inc saveVIPinterfaces.inc mwexec di ipalias impilatipfsense-utils.inc grep di stato CARP