pfSense Plus MIM API toolkit b4acd7ca - Alta - Remoto - Privilégio remanescente - Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
Classe: Privilégio remanescente Alcance: Remoto
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py é a forma documentada de registrar o controlador Nexus em cada dispositivo pfSense. Ele nunca chama load_system_host_keys(). Ele define paramiko.AutoAddPolicy(), depois connect, depois exec_command(device_script). O comentário diz para remover o AutoAdd quando os dispositivos já estiverem em known_hosts. O padrão de envio é AutoAdd.
O SSH de primeiro contato com uma nova máquina aceita qualquer chave de host que responder. Autenticação por senha ou chave é apresentada a esse par. A stdout é passada por json.loads e enviada via POST /mim/devices para o controlador real.
Este não é o pacote REST CE de terceiros. Este é o OpenAPI oficial mais o cliente Python gerado para o pfSense Plus Nexus Multi-instance Management. O servidor é exclusivo do Plus. O laboratório é um gadget SSH Paramiko. Não conversei com um controlador Plus real.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente (Paramiko AutoAddPolicy no SSH de enrollment) |
| Alcance | Remoto (on-path para o SSH do dispositivo no primeiro contato) |
| 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 |
| Produto | Netgate/pfsense-api (kit de ferramentas do cliente Plus Nexus MIM) |
| Afetado | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| Autenticação | O operador executa o exemplo oficial; o atacante está on-path para o SSH do dispositivo |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | Apenas 127.0.0.1:19111. Sem imagem Plus. |
AC:H é primeiro contato / on-path. Uma estação de trabalho que já tem as chaves reais do dispositivo em known_hosts e tem a linha AutoAdd removida não é este remanescente.
Mesmos remanescentes de pin: interpolação JSON de ControllerSummary no shell de enrollment (G1) e exemplos forçam verify_ssl=False (G9). Hub da série: pfsense-api-nexus-mim.
Ficar on-path para um endereço SSH de primeiro contato em pfsense_addresses enquanto o operador executa o exemplo. O AutoAdd ainda está ativado.
| Método | Sink | Privilégio |
|---|---|---|
Ficar on-path para um endereço SSH de primeiro contacto em pfsense_addresses | set_missing_host_key_policy(paramiko.AutoAddPolicy()) e depois connect (example-add-devices.py:151-160) | Integridade (comprovada em laboratório): chave de host desconhecida é aceite. Laboratório: AutoAddPolicy ligou-se (autoadd=yes). RejectPolicy falhou (reject-control=yes). |
Mesma sessão, responder a exec_command(device_script) | stdout interpretado como DeviceIdentity (example-add-devices.py:161-187) | Integridade (comprovada em laboratório): exec devolveu JSON de identidade contendo PFSENSE-API-ENROLL-AUTOADD-WITNESS (identity-json=yes). |
| Mesmo MITM, ler o payload do exec | device_script é o -d do curl do G1 remanescente de ControllerSummary | Recon (inferido do código-fonte): chave de identidade do controlador, vpn_pubkey / vpn_netkey / endereços de escuta do Netgard. Não foi extraído por este laboratório. |
| Mesmo MITM, autenticação por palavra-passe ou chave | SSHUSER / SSHPASS ou agent/keys (example-add-devices.py:156-160) | Recon (inferido): credenciais ou chaves apresentadas ao host falso. O laboratório usou autenticação por palavra-passe apenas como o caminho de exemplo SSHPASS. |
Mesmo stdout JSON, add_controlled_device.sync | POST /mim/devices no controlador real | Integridade (inferido): regista chaves Noise/VPN do atacante e address. Além disso, o handshake não foi executado neste laboratório. |
| O MITM é o servidor SSH | o que quer que o exec que o cliente enviou, como SSHUSER | Integridade / disponibilidade (inferido): executar, descartar ou ignorar o script de enrollment. Chamadas a unix-socket no dispositivo real só acontecem se o MITM as reencaminhar. |
Comprovado em laboratório vs inferido: a ligação AutoAdd, a falha do RejectPolicy e o JSON de identidade com o witness são de laboratório. A extração da chave do controlador, o roubo de credenciais, o POST /mim/devices de um dispositivo falso e a execução dos curls reais para o unix-socket são inferidos do mesmo caminho de exemplo.
Requer: o operador executa o exemplo oficial contra um endereço SSH cuja chave de host ainda não está fixada, com o AutoAdd ativo. Caminho de rede até esse SSH. AC:H é primeiro contacto / on-path.
| Superfície | Porquê |
|---|---|
RejectPolicy no mesmo host desconhecido | Laboratório: reject-control=yes. O Paramiko recusa a chave. |
Estação de trabalho com chaves de dispositivo reais em known_hosts e linha AutoAdd removida | O modo pretendido pelo comentário. O exemplo nunca carrega essas chaves a menos que adiciones a chamada. |
| Login HTTPS no controlador | verify_ssl=False é um resquício de exemplo irmão (G9), não este sink. |
| MIM por unix-socket na firewall real | Apenas se o MITM reencaminhar o exec. Este laboratório nunca comunica com /var/run/pfnet-controller.sock. |
Client gerado com verify_ssl=True por omissão | A omissão da biblioteca não é o resquício. Os exemplos forçam False. |
Além disso RBAC / :8443 em produção | Este laboratório é um gadget Paramiko. Não comuniquei com um controlador Plus. |
| Internet não autenticada para 8443 | O login ainda emite um JWT. Não é este achado. |
| Diagnósticos PHP/shell | Poder de administrador pretendido para um JWT de frota. Não é este achado. |
Fixeio github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f após os resquícios da WebGUI CE. Esta árvore é OpenAPI mais Python gerado para o Plus Nexus MIM. Li o ciclo de enrollment em example-add-devices.py. A política de chave de host é AutoAdd. Os segredos ficam no mesmo canal exec. O exemplo nunca chama load_system_host_keys().