pfSense Plus MIM API toolkit b4acd7ca - Alta - Remoto - Privilégio remanescente - GET /services/acme despeja chaves
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acme-key-dump
Classe: Privilégio remanescente Alcance: Remoto
pfSense Plus Nexus Multi-instance Management OpenAPI toolkit b4acd7ca - Netgate
GET /services/acme (GetACMEConfig) retorna ACMEConfig sem flag write-only ou redigida. O schema 200 inclui a chave privada da conta ACME, toda chave privada de leaf emitida, qualquer chave de leaf personalizada e os tokens do provedor DNS usados para validação. O gerenciador de certificados ao menos tem um GET .../export-key dedicado. O ACME não tem nenhum. O GET de configuração é o dump.
Uma sessão de controlador que consegue fazer GET neste caminho copia toda chave de hostname que o firewall registra, além das credenciais DNS que provam o controle desses nomes.
Esta árvore é o OpenAPI público mais um cliente Python gerado. Não é o pacote REST do CE. O controlador MIM é exclusivo do Plus e não está no repositório do GitHub. Não conversei com um controlador ativo. plus-not-executed=1.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente (dump de segredo no GET de configuração) |
| Alcance | Remoto (controlador MIM autenticado; não comprovado sem autenticação) |
| 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 se um papel de leitura de serviços receber o corpo. Se apenas superusuário puder fazer GET, o dump ainda é a forma errada para uma listagem de configuração. |
| Produto | Netgate/pfsense-api OpenAPI para pfSense Plus Nexus MIM |
| Afetado | main público b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). Sem tags. |
| Autenticação | JWT do controlador de POST /login. Exemplos enviam Bearer. A especificação não tem securitySchemes. |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | Apenas 127.0.0.1:19151. Sem imagem Plus. |
Hub da série: pfSense Plus MIM leftovers. Esta é a parte 5. Encadeia com G9 stolen JWT (exemplos definem verify_ssl=False) e G6 fleet token (um Bearer de login é reutilizado para cada device_id). Dump irmão: G4 cert-manager export-key.
Requer uma sessão de controlador que consiga GET /services/acme. A documentação mapeia isso para mim_services_read / mim_services / mim_superuser. A especificação não vincula esses papéis ao caminho. O RBAC do Plus não foi executado.
Um JWT roubado do G9 (MITM dos exemplos oficiais) ou um token de frota de helpdesk do G6 é suficiente para apontar este GET para cada máquina registrada. Essa cadeia é inferida. Este remanescente é o corpo do GET.
| Método | Sink | Privilégio |
|---|---|---|
GET /services/acme | ACMEConfig.account_keys[].account_key (format: byte) | Comprovado em laboratório na spec publicada e no mock: o schema 200 inclui account_key; o corpo do mock faz round-trip de PFSENSE-API-ACME-KEY-DUMP-WITNESS. Inferido no Plus: copiar a chave privada da conta Let's Encrypt (ou outra conta ACME). Comunicar com a conta ACME fora da máquina. |
| Mesmo GET | certs[].issued_cert.privateKey (format: byte) | Comprovado em laboratório spec+mock. Inferido no Plus: copiar todas as chaves privadas de folhas emitidas que a firewall inscreveu. Personificação TLS fora da máquina para esses nomes. |
| Mesmo GET | certs[].custom_key (format: byte) | Comprovado em laboratório spec+mock. Inferido no Plus: copiar uma chave de folha personalizada quando key_type=custom. |
| Mesmo GET | certs[].domain_list[].config.credentials (additionalProperties: string) | Comprovado em laboratório spec+mock. Inferido no Plus: copiar segredos de validação DNS (tokens Cloudflare, chaves AWS, segredos RFC2136). Estes provam o controlo dos nomes. |
| Mesmo GET | emails de conta, URLs de servidor personalizados, action_list.command | Comprovado em laboratório que os campos estão no schema. A execução de hooks é um caminho de modificação, não este GET. |
Nenhuma pelo próprio GET. O uso posterior de chaves roubadas e tokens DNS é fora da máquina (emitir um certificado fraudulento, comunicar com a conta ACME, alterar DNS). Não exercitado.
Nenhuma. A listagem de configuração não revoga nem reescreve certificados.
Requer: acesso autenticado ao controlador MIM que tenha permissão para GET da tag ACME. Não comprovado sem autenticação. O _get_kwargs gerado para esta operação não adiciona Authorization; os exemplos ainda fazem login e enviam Bearer.
| Superfície | Porquê |
|---|---|
| Controlador pfSense Plus / Nexus em produção | Não executado. plus-not-executed=1. |
| Internet para 8443 sem autenticação | Os exemplos requerem POST /login. A ausência de security no OAS é uma lacuna da spec, não uma prova de servidor 200-sem-JWT. |
POST /services/acme/cert/{name}/issue e .../renew | Modificação de serviços pretendida. |
POST /services/acme/genprivatekey | Geração e devolução pretendidas de uma nova chave de conta. Não este resíduo. |
POST /diag/cmd/php / POST /diag/cmd/shell | Consola de administração pretendida. Superfície separada. O fornecedor trata Diagnostics: Command como pretendido (CVE-2025-69691 contestado). |
GET /system/certificates/{refid}/export-key | Resíduo separado: exportação dedicada de chaves no gestor de certificados. O ACME não tem operação de exportação equivalente. |
GET /services/acme/validmethods | Catálogo de métodos. Sem chaves. |
CE jaredhendrickson/pfsense-api | Produto diferente. |
Fixeio Netgate/pfsense-api público b4acd7ca após a vaga CE 2.9.0-DEVELOPMENT. Esta árvore é OpenAPI 3.0.3 (pfapi_openapi.yml, 486 paths, 755 ops) mais um cliente Python gerado para o controlador MIM Plus em :8443. Sem tags. O último commit público no dia em que clonei era 2026-05-25, "Add Snort-3 API definitions."
Doze caçadas sobre login/JWT, diagnósticos, inscrição MIM, TLS de cliente, utilizadores/certificados, pacotes, VPN/firewall, segurança OpenAPI, IDOR de dispositivos, git/firmware/feeds, mais um mock loopback de cada operação gerada.
Lista de exclusão primeiro: os cinco resíduos CE já enviados por email (QinQ parent-if, OpenVPN wizard CRLF, CARP VHID, limiter number, IPsec login banner). O pacote REST CE de terceiros. Diagnostics PHP/shell como RCE não publicado. securitySchemes em falta como não autenticado comprovado. POST /system/firmware não tem URL. Ping/DNS/traceroute são o diagnóstico.