pfSense Plus MIM API toolkit b4acd7ca — высокий — удалённый — остаточные привилегии — Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
Класс: Остаточные привилегии Достижимость: Удалённая
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py — это документированный способ регистрации контроллера Nexus на каждом устройстве pfSense. Он никогда не вызывает load_system_host_keys(). Он устанавливает paramiko.AutoAddPolicy(), затем connect, затем exec_command(device_script). В комментарии сказано убрать AutoAdd, когда устройства уже находятся в known_hosts. Поставляемое значение по умолчанию — AutoAdd.
SSH-соединение при первом контакте с новым устройством принимает любой ключ хоста, который ответит. Пароль или ключ аутентификации передаётся этому узлу. stdout пропускается через json.loads и отправляется через POST /mim/devices на реальный контроллер.
Это не сторонний REST-пакет CE. Это официальный OpenAPI плюс сгенерированный Python-клиент для pfSense Plus Nexus Multi-instance Management. Сервер поддерживается только в Plus. Лабораторная установка — это SSH-гаджет на Paramiko. Я не взаимодействовал с живым контроллером Plus.
| ID | CVE пока нет |
| Класс | Остаточные привилегии (Paramiko AutoAddPolicy при SSH-регистрации) |
| Достижимость | Удалённая (на пути к SSH-устройству при первом контакте) |
| CWE | CWE-322 |
| CVSS | Высокий: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Продукт | Netgate/pfsense-api (набор инструментов клиента Plus Nexus MIM) |
| Затронуто | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Аутентификация | Оператор запускает официальный пример; атакующий находится на пути к SSH-устройству |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:19111. Без образа Plus. |
AC:H — это первый контакт / нахождение на пути. Рабочая станция, у которой уже есть реальные ключи устройства в known_hosts и строка AutoAdd удалена, не является этим остатком.
Такие же остатки в закреплённой версии: JSON-интерполяция ControllerSummary в shell-скрипт регистрации (G1) и примеры принудительно устанавливают verify_ssl=False (G9). Центр серии: pfsense-api-nexus-mim.
Находиться на пути к адресу SSH первого контакта в pfsense_addresses, пока оператор запускает пример. AutoAdd всё ещё включён.
| Метод | Sink | Привилегия |
|---|---|---|
Расположиться на пути к адресу SSH первого контакта в pfsense_addresses | set_missing_host_key_policy(paramiko.AutoAddPolicy()) затем connect (example-add-devices.py:151-160) | Целостность (доказано в лаборатории): неизвестный ключ хоста принимается. Лаборатория: AutoAddPolicy подключился (autoadd=yes). RejectPolicy не сработал (reject-control=yes). |
Та же сессия, ответ exec_command(device_script) | stdout парсится как DeviceIdentity (example-add-devices.py:161-187) | Целостность (доказано в лаборатории): exec вернул identity JSON, содержащий PFSENSE-API-ENROLL-AUTOADD-WITNESS (identity-json=yes). |
| Тот же MITM, чтение полезной нагрузки exec | device_script — это оставшийся от G1 curl -d для ControllerSummary | Разведка (выведено из исходного кода): ключ идентичности контроллера, Netgard vpn_pubkey / vpn_netkey / адреса прослушивания. В этой лаборатории не выгружалось. |
| Тот же MITM, аутентификация по паролю или ключу | SSHUSER / SSHPASS или agent/keys (example-add-devices.py:156-160) | Разведка (выведено): учётные данные или ключи, предъявленные поддельном хосту. В лаборатории использовалась только аутентификация по паролю как путь примера SSHPASS. |
Тот же stdout JSON, add_controlled_device.sync | POST /mim/devices на реальном контроллере | Целостность (выведено): регистрирует ключи Noise/VPN атакующего и address. Плюс рукопожатие в этой лаборатории не выполнялось. |
| MITM является SSH-сервером | любой exec, отправленный клиентом, как SSHUSER | Целостность / доступность (выведено): выполнить, отбросить или пропустить скрипт регистрации. Вызовы Unix-сокета на реальном устройстве происходят только если MITM их перенаправляет. |
Доказано в лаборатории vs выведено: подключение AutoAdd, сбой RejectPolicy и identity JSON со свидетелем — это лаборатория. Дамп ключа контроллера, кража учётных данных, POST /mim/devices поддельного устройства и выполнение реальных curl-запросов к unix-сокету выведены из того же пути примера.
Требуется: оператор запускает официальный пример против SSH-адреса, ключ хоста которого ещё не закреплён, при включённом AutoAdd. Сетевой путь к этому SSH. AC:H — это первый контакт / на пути.
| Поверхность | Почему |
|---|---|
RejectPolicy на том же неизвестном хосте | Лаборатория: reject-control=yes. Paramiko отклоняет ключ. |
Рабочая станция с реальными ключами устройства в known_hosts и удалённой строкой AutoAdd | Режим, подразумеваемый комментарием. Пример никогда не загружает эти ключи, если вы не добавите вызов. |
| Вход в HTTPS-контроллер | verify_ssl=False — это оставшийся от соседнего примера фрагмент (G9), а не этот sink. |
| Unix-сокет MIM на реальном межсетевом экране | Только если MITM перенаправляет exec. Эта лаборатория никогда не обращается к /var/run/pfnet-controller.sock. |
Сгенерированный Client по умолчанию verify_ssl=True | Значение по умолчанию библиотеки — это не оставшийся фрагмент. Примеры принудительно устанавливают False. |
Плюс RBAC / живой :8443 | Эта лаборатория — это гаджет Paramiko. Я не обращался к контроллеру Plus. |
| Неаутентифицированный доступ из Интернета к 8443 | Вход всё равно выдаёт JWT. Это не данная находка. |
| Диагностика PHP/shell | Преднамеренная административная возможность для fleet JWT. Это не данная находка. |
Я закрепил github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f после оставшихся фрагментов CE WebGUI. Это дерево — OpenAPI плюс сгенерированный Python для Plus Nexus MIM. Я прочитал цикл регистрации в example-add-devices.py. Политика ключа хоста — AutoAdd. Секреты находятся на том же канале exec. Пример никогда не вызывает load_system_host_keys().