OPNsense 26.7.6 - Alta - Remota - Privilégio remanescente - Bloqueio de fábrica de IP
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-lockout-factory-ip
Classe: Privilégio residual Alcance: Remoto
OPNsense core 26.7.6 (a842fe48) - opnsense.org
O login não autenticado na WebGUI ainda aciona o lockout_handler a partir de uma linha LOG_AUTH de fábrica que não possui IP de socket. O GHSA-2v2x fechou a divisão por CRLF e mudou a escolha do IP de bloqueio para o último token, de modo que o from REMOTE_ADDR final do authgui.inc prevalece. O AuthenticationFactory::authenticate() ainda faz syslog() do nome de usuário bruto sem sufixo de endereço. Um nome de usuário que corresponda a uma frase de bloqueio False mais um token IPv4 é o último (e único) endereço naquela linha. Após 5 tentativas espaçadas padrão: pfctl -t sshlockout -T add e pfctl -k. Padrão: bloqueio ativado, GUI na LAN.
| ID | sem CVE ainda |
| Classe | Privilégio residual |
| Alcance | Remoto (POST de login não autenticado na WebGUI) |
| CWE | CWE-117 / CWE-863 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produto | OPNsense core (Deciso B.V.) |
| Afetado | OPNsense core 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) AuthenticationFactory / lockout_handler |
| Autenticação | Não autenticado. Cookie CSRF + token do GET /. |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1 |
Fixe a tag 26.7.6. O laboratório é o lockout_handler fixado mais o stub pfctl no PATH, identidade de loopback 127.0.0.1:18800. Isto não é CRLF. Um registro syslog PHP permanece uma linha do handler. O último IP foi o endurecimento correto para o template authgui e o endurecimento errado para o template de fábrica.
| Método | Destino | Privilégio |
|---|---|---|
Nome de usuário LOG_AUTH de fábrica não autenticado com uma frase de bloqueio False mais um token IPv4 (6 linhas espaçadas) | fixar lockout_handler -> stub pfctl -t sshlockout -T add e pfctl -k | Integridade (comprovada em laboratório): tabela sshlockout mais argv de eliminação de estado. Laboratório: planted=203.0.113.77. |
| mesmo plantio, pf ativo | filter.lib.inc:293-314 from <sshlockout> to (self) portas 22/GUI | Disponibilidade (inferida): descartar novo TCP 22/GUI do host plantado; pfctl -k derruba estados existentes daquele IP. |
| mesmo nome de usuário apenas com o IPv4 (sem frase False) | lockout_handler | Negativo (comprovado em laboratório): nenhuma adição à tabela. negative-ip-only=no. |
linha authgui com from REMOTE_ADDR final | parser de último IP | Integridade do próprio IP (comprovada em laboratório): o último token do authgui permanece 198.51.100.10. |
| Corpo de login falho | nenhum | Recon (comprovadamente fechado em laboratório): "Wrong username or password." existente. Sem enumeração de usuários. |
Comprovado em laboratório vs inferido: plantio de fábrica, negativo apenas com nome de usuário e último IP do authgui são SUCESSO em laboratório. Bloqueio pf ativo e eliminação de sessão ativa são inferidos. lockout_handler fixado copiado sem alterações; syslog-ng e POST da WebGUI são stubs.
Requer: POST de login não autenticado na WebGUI. Cookie CSRF + token do GET /. Bloqueio ativado (system.no_sshlockout não definido). Instalação padrão.
| Superfície | Laboratório |
|---|---|
Sessão não autenticada / root / escrita em config.xml | fechada |
| Linha authgui plantando um IP estrangeiro | último token é REMOTE_ADDR (authgui-last-ip=198.51.100.10) |
readline() extra por CRLF | reescrita do GHSA-2v2x; um registro permanece uma linha |
| Login com senha vazia | authgui.inc exige senha não vazia |
| Redefinição por palavra-chave de sucesso do CVE-2026-44195 na linha authgui | regras de falha primeiro |
TypeError do pfctl -k str(ip) do Omar Habra no 26.7.6 | já presente neste pin |
| IP plantado como destino DNS/gateway | regras são from <sshlockout> to (self) apenas portas 22/GUI |
Sem salto de login. Sem RCE. Sem reescrita do config.xml. Não cria uma sessão.
cd lab
./run.sh
Loopback 127.0.0.1:18800. Projeto Compose opnsense-lockout-factory-ip. Tag da imagem opnsense-lockout-factory-ip:26.7.6. Testemunha OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS. Última linha:
SUCCESS opnsense-lockout-factory-ip planted=203.0.113.77 table=sshlockout negative-ip-only=no authgui-last-ip=198.51.100.10 OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS
Anexe o IP do socket ao template syslog(LOG_AUTH) de fábrica, com o mesmo from REMOTE_ADDR final do authgui.inc. Ou ignore IPs de bloqueio que não vieram do próprio par do handler. Não trate o último token como substituto para "o endereço do cliente".
a842fe48c21288d11a422cb944678e8eb308becfAuthenticationFactory.phplockout_handler