
pfSense Plus MIM API toolkit b4acd7ca - Alta - Remoto - Privilegio residual - GET /services/acme vuelca claves
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acme-key-dump
Clase: Privilegio residual Alcance: Remoto
pfSense Plus Nexus Multi-instance Management OpenAPI toolkit b4acd7ca - Netgate
GET /services/acme (GetACMEConfig) devuelve ACMEConfig sin flag de solo escritura ni de redacción. El esquema 200 incluye la clave privada de la cuenta ACME, cada clave privada de hoja emitida, cualquier clave de hoja personalizada y los tokens del proveedor DNS usados para la validación. El gestor de certificados al menos tiene un GET .../export-key dedicado. ACME no tiene ninguno. El GET de configuración es el volcado.
Una sesión de controlador que pueda hacer GET a esta ruta copia cada clave de nombre de host que el firewall inscribe, además de las credenciales DNS que prueban el control de esos nombres.
Este árbol es el OpenAPI público más un cliente Python generado. No es el paquete CE REST. El controlador MIM es exclusivo de Plus y no está en el repositorio de GitHub. No me comuniqué con un controlador en vivo. plus-not-executed=1.
| ID | sin CVE todavía |
| Clase | Privilegio residual (volcado de secretos en el GET de configuración) |
| Alcance | Remoto (controlador MIM autenticado; no probado sin autenticación) |
| CWE | CWE-200 |
| CVSS | Alto: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N si un rol de lectura de servicios recibe el cuerpo. Si solo el superusuario puede hacer GET, el volcado sigue siendo la forma incorrecta para un listado de configuración. |
| Producto | Netgate/pfsense-api OpenAPI para pfSense Plus Nexus MIM |
| Afectado | main público b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Sin etiquetas. |
| Autenticación | JWT del controlador desde POST /login. Los ejemplos envían Bearer. La especificación no tiene securitySchemes. |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:19151. Sin imagen Plus. |
Centro de la serie: pfSense Plus MIM leftovers. Esta es la parte 5. Se encadena con G9 stolen JWT (los ejemplos establecen verify_ssl=False) y G6 fleet token (un Bearer de inicio de sesión se reutiliza para cada device_id). Volcado hermano: G4 cert-manager export-key.
Requiere una sesión de controlador que pueda GET /services/acme. La documentación lo asigna a mim_services_read / mim_services / mim_superuser. La especificación no adjunta esos roles a la ruta. El RBAC de Plus no se ejecutó.
Un JWT robado de G9 (MITM de los ejemplos oficiales) o un token de flota de helpdesk de G6 es suficiente para dirigir este GET a cada equipo inscrito. Esa cadena es inferida. Este residual es el cuerpo del GET.
| Método | Sink | Privilegio |
|---|---|---|
GET /services/acme | ACMEConfig.account_keys[].account_key (format: byte) | Probado en laboratorio sobre la especificación publicada y el mock: el esquema 200 incluye account_key; el cuerpo del mock hace round-trip de PFSENSE-API-ACME-KEY-DUMP-WITNESS. Inferido en Plus: copiar la clave privada de la cuenta de Let's Encrypt (u otra ACME). Comunicarse con la cuenta ACME desde fuera del equipo. |
| Mismo GET | certs[].issued_cert.privateKey (format: byte) | Probado en laboratorio spec+mock. Inferido en Plus: copiar cada clave privada de hoja emitida que el firewall haya inscrito. Suplantación TLS fuera del equipo para esos nombres. |
| Mismo GET | certs[].custom_key (format: byte) | Probado en laboratorio spec+mock. Inferido en Plus: copiar una clave de hoja personalizada cuando key_type=custom. |
| Mismo GET | certs[].domain_list[].config.credentials (additionalProperties: string) | Probado en laboratorio spec+mock. Inferido en Plus: copiar secretos de validación DNS (tokens de Cloudflare, claves de AWS, secretos RFC2136). Estos demuestran el control de los nombres. |
| Mismo GET | correos de cuenta, URLs de servidor personalizadas, action_list.command | Probado en laboratorio que los campos están en el esquema. La ejecución de hooks es una ruta de modificación, no este GET. |
Ninguna por el propio GET. El uso posterior de claves robadas y tokens DNS ocurre fuera del equipo (emitir un certificado fraudulento, comunicarse con la cuenta ACME, cambiar el DNS). No ejercitado.
Ninguna. El listado de configuración no revoca ni reescribe certificados.
Requiere: acceso autenticado al controlador MIM que tenga permitido el GET de la etiqueta ACME. No probado sin autenticación. El _get_kwargs generado para esta operación no añade Authorization; los ejemplos igualmente hacen login y envían Bearer.
| Superficie | Motivo |
|---|---|
| Controlador pfSense Plus / Nexus en vivo | No ejecutado. plus-not-executed=1. |
| Internet-a-8443 sin autenticación | Los ejemplos requieren POST /login. La ausencia de security en la OAS es una laguna de la especificación, no una prueba de un 200 del servidor sin JWT. |
POST /services/acme/cert/{name}/issue y .../renew | Modificación de servicios prevista. |
POST /services/acme/genprivatekey | Generación y devolución previstas de una nueva clave de cuenta. No este remanente. |
POST /diag/cmd/php / POST /diag/cmd/shell | Consola de administración prevista. Superficie separada. El proveedor considera Diagnostics: Command como previsto (CVE-2025-69691 en disputa). |
GET /system/certificates/{refid}/export-key | Remanente separado: exportación de clave dedicada en el gestor de certificados. ACME no tiene una operación de exportación equivalente. |
GET /services/acme/validmethods | Catálogo de métodos. Sin claves. |
CE jaredhendrickson/pfsense-api | Producto diferente. |
Fijé el Netgate/pfsense-api público b4acd7ca tras la oleada de CE 2.9.0-DEVELOPMENT. Este árbol es OpenAPI 3.0.3 (pfapi_openapi.yml, 486 rutas, 755 operaciones) más un cliente Python generado para el controlador MIM de Plus en :8443. Sin etiquetas. El último commit público el día que cloné era 2026-05-25, "Add Snort-3 API definitions."
Doce búsquedas sobre login/JWT, diagnósticos, inscripción MIM, TLS de cliente, usuarios/certificados, paquetes, VPN/firewall, seguridad OpenAPI, IDOR de dispositivos, git/firmware/feeds, más un mock de loopback de cada operación generada.