pfSense Plus MIM API toolkit b4acd7ca - Alta - Remoto - IDOR - URL de capacidade de userkey ACB
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acb-userkey
Classe: IDOR Alcance: Remoto
pfSense Plus MIM API (Netgate/pfsense-api b4acd7ca) - Netgate
GET /services/acb e GET /services/acb/bkp aceitam userkey como parâmetro de consulta irrestrito. O cliente Python gerado coloca essa chave na query string. O YAML não possui securitySchemes. A posse da chave do dispositivo do Auto Config Backup é a verificação. Isso é uma URL de capacidade.
Uma userkey do ACB roubada ou vazada lista os backups hospedados daquele dispositivo e obtém o corpo de uma revisão. A configuração completa está nesses blobs. Mesma classe da chave ACB do CE CVE-2024-57273 / SA-25_03 se a chave vazar. Essa CVE era derivação de banner SSH. Este resquício é o irmão do parâmetro de consulta da Plus MIM API. Não estou re-registrando a derivação de banner.
Este é o OpenAPI público + cliente gerado para o pfSense Plus Nexus Multi-instance Management (controlador em :8443). Não é o pacote REST do CE (jaredhendrickson/pfsense-api / pfrest.org). O servidor é exclusivo do Plus (pago). Não executei o pfSense Plus.
| ID | sem CVE ainda |
| Classe | IDOR (URL de capacidade) |
| Alcance | Remoto |
| CWE | CWE-639 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N se esses GETs honrarem userkey sem vincular um JWT ao dispositivo |
| Produto | Netgate/pfsense-api (pfSense Plus MIM OpenAPI + cliente gerado) |
| Afetado | pin b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25). Sem tags. |
| Autenticação | Especificação: nenhuma (securitySchemes ausente). userkey é o segredo da consulta. JWT/RBAC do Plus não foi executado. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:19171. Sem imagem Plus. |
Hub da série: pfsense-api-nexus-mim (esta é a parte 7).
Requer uma userkey do ACB roubada ou vazada (especificação: "hexidecimal encoded 32-byte random bytes", 64 hex). A especificação não vincula essa chave a um JWT ou ao dispositivo do chamador. GET /services/acb/config da classe G11 retorna a userkey ativa. As amostras G9 definem verify_ssl=False, então um MITM de :8443 pode ver a chave no tráfego. Esses são caminhos de vazamento. Este resquício é o que a chave compra depois que ela vaza.
| Método | Sink | Privilégio |
|---|---|---|
GET /services/acb?userkey=<stolen> | GetACBList (pfapi_openapi.yml). Gerado get_acb_list.py params["userkey"]. | Comprovado em laboratório (mock): lista os backups hospedados desse dispositivo. Testemunho em backups[].reason. |
GET /services/acb/bkp?userkey=<stolen>&revision= | GetACB -> RetrievedBackup.backup. Gerado get_acb.py params["userkey"] + params["revision"]. | Comprovado em laboratório (mock): obtém o corpo da revisão. Testemunho em backup. |
| Mesma string de backup num controlador ativo | blob ACB hospedado | Inferido: config.xml completo (utilizadores, chaves, pacotes) uma vez legível. O mock devolveu XML de testemunho em texto simples. Não contactei acb.netgate.com nem desencriptei um blob ativo. |
GET /services/acb/config | ACBConfigInfo.userkey, ACBConfig.encryption_password | Especificação, não este laboratório: segredo de capacidade ativa e palavra-passe de desencriptação. Classe G11 secrets-on-GET. Não exercitado. |
| Método | Sink | Privilégio |
|---|---|---|
POST /services/acb/restore | RestoreACB corpo { timestamp } | Adjacente fechado: as amostras ainda enviam um JWT. Não este resquício. Não executado. |
POST /services/acb/config substituir userkey | SaveACBConfig | Adjacente fechado: não é um URL de capacidade GET. Não executado. |
GET list / GET bkp não eliminam. DELETE /services/acb/bkp/{timestamp} é uma operação diferente. Não exercitada.
userkey errada e userkey em falta não devolveram testemunho (comprovado em laboratório).
Comprovado em laboratório vs inferido: a lista e o bkp com chave roubada devolveram o testemunho. Chave errada e chave em falta não. O Plus não foi executado. O conteúdo do config.xml ativo e a desencriptação são inferidos do esquema público (RetrievedBackup.backup é uma string; encryption_password está em ACBConfig).
Requer: caminho de rede para os GETs ACB do controlador MIM, mais uma userkey roubada/divulgada. CVSS 7.5 se esses GETs honrarem a chave de consulta sem vincular um JWT ao dispositivo. Honestamente: este pacote prova que a especificação pública modela esse contrato, em loopback.
| Superfície | Porquê |
|---|---|
| Controlador pfSense Plus | não executado. Sem imagem Plus neste pacote. |
| Pacote REST CE | servidor diferente (jaredhendrickson/pfsense-api / pfrest.org). |
| Derivação de chave ACB via SSH-banner | CVE-2024-57273 / SA-25_03. Não reportar novamente. |
POST /services/acb/restore como este achado | as amostras ainda enviam um JWT. |
php/shell não autenticado a partir do security omitido no OAS | resquício de documentação. O mock não é uma prova de servidor 200-sem-JWT. |
userkey em falta | laboratório 403, sem testemunho. |
userkey errada | laboratório lista vazia / bkp 403, sem testemunho. |
verify_ssl da biblioteca gerada | predefinição True. O G9 são as amostras a desativá-lo, não a predefinição do pacote. |
Fixeio Netgate/pfsense-api main b4acd7ca (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 dispositivo, git/firmware/feeds, mais um mock em loopback de cada operação gerada.
Primeiro a lista de exclusão: resquícios do CE WebGUI já reportados (QinQ parent if, OpenVPN wizard CRLF, CARP VHID, limiter number, IPsec login banner). Diagnósticos PHP/shell como poder de administrador pretendido. O pacote REST CE de terceiros. Derivação de banner CVE-2024-57273.