pfSense Plus MIM API toolkit b4acd7ca - Alta - Remota - Privilegio residual - Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
Clase: Privilegio residual Alcance: Remoto
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py es la forma documentada de registrar el controlador Nexus en cada dispositivo pfSense. Nunca llama a load_system_host_keys(). Establece paramiko.AutoAddPolicy(), luego connect y después exec_command(device_script). El comentario dice que se debe eliminar AutoAdd cuando los dispositivos ya están en known_hosts. La configuración predeterminada de envío es AutoAdd.
El primer contacto SSH con una máquina nueva acepta cualquier clave de host que responda. La autenticación por contraseña o clave se presenta a ese par. La salida estándar se pasa por json.loads y se envía mediante POST /mim/devices al controlador real.
Este no es el paquete REST CE de terceros. Este es el OpenAPI oficial más el cliente Python generado para pfSense Plus Nexus Multi-instance Management. El servidor es exclusivo de Plus. El laboratorio es un gadget SSH de Paramiko. No me comuniqué con un controlador Plus en vivo.
| ID | sin CVE todavía |
| Clase | Privilegio residual (Paramiko AutoAddPolicy en el SSH de enrolamiento) |
| Alcance | Remoto (en ruta hacia el SSH del dispositivo en el primer contacto) |
| CWE | CWE-322 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Producto | Netgate/pfsense-api (kit de herramientas del cliente Plus Nexus MIM) |
| Afectado | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Autenticación | El operador ejecuta el ejemplo oficial; el atacante está en ruta hacia el SSH del dispositivo |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | Solo 127.0.0.1:19111. Sin imagen Plus. |
AC:H es primer contacto / en ruta. Una estación de trabajo que ya tiene las claves reales del dispositivo en known_hosts y tiene la línea AutoAdd eliminada no presenta este residuo.
Mismos residuos del pin: interpolación JSON de ControllerSummary en el shell de enrolamiento (G1) y los ejemplos fuerzan verify_ssl=False (G9). Centro de la serie: pfsense-api-nexus-mim.
Situarse en ruta hacia una dirección SSH de primer contacto en pfsense_addresses mientras el operador ejecuta el ejemplo. AutoAdd sigue activado.
| Método | Sink | Privilegio |
|---|---|---|
Situarse on-path ante una dirección SSH de primer contacto en pfsense_addresses | set_missing_host_key_policy(paramiko.AutoAddPolicy()) y luego connect (example-add-devices.py:151-160) | Integridad (probado en laboratorio): se acepta la clave de host desconocida. Laboratorio: AutoAddPolicy conectó (autoadd=yes). RejectPolicy falló (reject-control=yes). |
Misma sesión, responder exec_command(device_script) | stdout parseado como DeviceIdentity (example-add-devices.py:161-187) | Integridad (probado en laboratorio): exec devolvió un JSON de identidad que contenía PFSENSE-API-ENROLL-AUTOADD-WITNESS (identity-json=yes). |
| Mismo MITM, leer el payload de exec | device_script es el -d de curl sobrante de G1 de ControllerSummary | Recon (inferido del código fuente): clave de identidad del controlador, vpn_pubkey / vpn_netkey / direcciones de escucha de Netgard. No volcado por este laboratorio. |
| Mismo MITM, autenticación por contraseña o clave | SSHUSER / SSHPASS o agente/claves (example-add-devices.py:156-160) | Recon (inferido): credenciales o claves presentadas al host falso. El laboratorio usó autenticación por contraseña solo como la ruta de ejemplo SSHPASS. |
Mismo JSON de stdout, add_controlled_device.sync | POST /mim/devices en el controlador real | Integridad (inferido): registra claves Noise/VPN del atacante y address. Además, el handshake no se ejecutó en este laboratorio. |
| El MITM es el servidor SSH | cualquier exec que el cliente envió, como SSHUSER | Integridad / disponibilidad (inferido): ejecutar, descartar u omitir el script de enrolamiento. Las llamadas al socket Unix en el dispositivo real ocurren solo si el MITM las reenvía. |
Probado en laboratorio vs inferido: la conexión AutoAdd, el fallo de RejectPolicy y el JSON de identidad con el testigo son de laboratorio. El volcado de la clave del controlador, el robo de credenciales, el POST /mim/devices de un dispositivo falso y la ejecución de los curls reales al socket Unix se infieren de la misma ruta de ejemplo.
Requiere: que el operador ejecute el ejemplo oficial contra una dirección SSH cuya clave de host no esté ya fijada, con AutoAdd activado. Ruta de red hacia ese SSH. AC:H es primer contacto / on-path.
| Superficie | Por qué |
|---|---|
RejectPolicy en el mismo host desconocido | Laboratorio: reject-control=yes. Paramiko rechaza la clave. |
Estación de trabajo con claves de dispositivo reales en known_hosts y la línea AutoAdd eliminada | El modo previsto por el comentario. El ejemplo nunca carga esas claves a menos que añadas la llamada. |
| Inicio de sesión HTTPS del controlador | verify_ssl=False es un sobrante de un ejemplo hermano (G9), no este sink. |
| MIM por socket Unix en el firewall real | Solo si el MITM reenvía exec. Este laboratorio nunca habla con /var/run/pfnet-controller.sock. |
Client generado con verify_ssl=True por defecto | El valor por defecto de la biblioteca no es el sobrante. Los ejemplos fuerzan False. |
Además RBAC / :8443 en vivo | Este laboratorio es un gadget de Paramiko. No hablé con un controlador Plus. |
| Internet no autenticado hacia 8443 | El inicio de sesión sigue emitiendo un JWT. No es este hallazgo. |
| Diagnósticos PHP/shell | Poder de administrador previsto para un JWT de flota. No es este hallazgo. |
Fijé github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f tras los sobrantes del WebGUI de CE. Este árbol es OpenAPI más Python generado para Plus Nexus MIM. Leí el bucle de enrolamiento en example-add-devices.py. La política de clave de host es AutoAdd. Los secretos están en el mismo canal exec. El ejemplo nunca llama a load_system_host_keys().