pfSense CE 2.9.0-DEVELOPMENT — высокий уровень — удалённое выполнение кода — RCE — IPsec login_banner start-scripts
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-ipsec-login-banner
Класс: RCE Доступ: Удалённый
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
Баннер входа IPsec Mobile сохраняется только с проверкой длины, а затем без кавычек вставляется в strongswan.conf как charon.plugins.attr.28672. strongSwan завершает значение без кавычек на }. Безопасный для Form_Input баннер (без переводов строк) может закрыть attr / plugins и открыть charon.start-scripts. Применение на этой странице — это strongswanrc restart. charon вызывает popen для путей start-scripts при запуске. Привилегия — page-vpn-ipsec-mobile, а не IPsec advanced / Diagnostics: Command.
| ID | CVE пока нет |
| Класс | RCE |
| Доступ | Удалённый (аутентифицированный WebGUI) |
| CWE | CWE-74 |
| CVSS | Высокий: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Продукт | pfSense CE |
| Затронуто | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) IPsec login_banner |
| Аутентификация | Сессия WebGUI с page-vpn-ipsec-mobile |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Я зафиксировал публичный master 9363ac5. Лаборатория зафиксирована на ipsec_strongswan_confgen плюс реальный /usr/lib/ipsec/charon. Loopback 127.0.0.1:18850. Префикс include не использовался.
| Метод | Точка сброса | Привилегия |
|---|---|---|
POST vpn_ipsec_mobile.php save с login_banner_enable + баннер, который закрывает attr/plugins и открывает charon.start-scripts, затем POST apply | ipsec_strongswan_confgen без кавычек key = {$value} (ipsec.inc:1378-1384); charon popen для start-scripts | Целостность (доказано в лаборатории): реальный charon загрузил сгенерированный конфиг и вызвал popen для пути start-scripts (charon=yes). Контрольный баннер Welcome остался внутри attr (control-no-scripts=yes). |
| Тот же popen | файловая система хоста | Разведка (предположительно): config.xml, ключи. |
Недействительный strongswan.conf или перезапуск IPsec | charon | Доступность (предположительно): туннели IPsec сбрасываются или не запускаются. Apply уже перезапускает IPsec. |
Доказано в лаборатории vs предположительно: control-no-scripts, start-scripts в сгенерированном конфиге и реальный charon popen доказаны в лаборатории. Разведка файловой системы выведена из этого popen. Фиктивные секции после внедрённого блока поглощают три закрывающих элемента confgen, чтобы файл оставался допустимым деревом настроек.
Требуется: сессия WebGUI с page-vpn-ipsec-mobile. CSRF-токен. Save, затем Apply на той же странице. Не требует page-all, page-vpn-ipsec-editphase1 или текстовой области raw-config IPsec.
| Поверхность | Лаборатория |
|---|---|
Контрольный баннер Welcome | остаётся внутри attr, без start-scripts |
| Неаутентифицированный / CSRF без токена | закрыто |
OpenVPN config.ovpn | другой остаток (G2) |
| P1 HTML XSS | SA-26_14 skip-list |
page-vpn-ipsec-editphase1 | не требуется |
| Diagnostics: Command | остаётся закрытым, если не предоставлен дополнительно |
IPsec mobile dns_domain на этой странице уже использует is_domain().
cd lab
./run.sh
Loopback 127.0.0.1:18850. Проект Compose pfsense-ipsec-login-banner. Тег образа pfsense-ipsec-login-banner:2.9.0-dev. Свидетель PFSENSE-IPSEC-LOGIN-BANNER-WITNESS. Последняя строка:
SUCCESS PFSENSE-IPSEC-LOGIN-BANNER control-no-scripts=yes start-scripts=yes charon=yes PFSENSE-IPSEC-LOGIN-BANNER-WITNESS
Заключить в кавычки / экранировать login_banner в ipsec_strongswan_confgen. Отклонять } # и переводы строк при сохранении (HTML-виджет уже является однострочным Form_Input). is_domain() уже существует на этой странице для DNS-домена; баннеру нужна такая же проверка.
9363ac5b8651a1c7a333180425ce7719070f95f9vpn_ipsec_mobile.phpipsec.inc ipsec_strongswan_confgen / ipsec_setup_strongswancharon.start-scripts