abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-lockout-factory-ip
类别: 权限残留 可达性: 远程
OPNsense 核心 26.7.6 (a842fe48) - opnsense.org
未认证的 WebGUI 登录仍会通过一条出厂 LOG_AUTH 记录驱动 lockout_handler,而该记录没有套接字 IP。GHSA-2v2x 修复了 CRLF 拆分,并将锁定 IP 的选取切换为最后一个 token,因此 authgui.inc 末尾的 from REMOTE_ADDR 会胜出。AuthenticationFactory::authenticate() 仍会以 syslog() 记录原始用户名,且不带地址后缀。一个同时匹配锁定 False 短语和 IPv4 token 的用户名,会成为该行上最后一个(也是唯一一个)地址。在默认的 5 次间隔尝试后:执行 pfctl -t sshlockout -T add 和 pfctl -k。默认:锁定开启,LAN GUI。
| ID | 暂无 CVE |
| 类别 | 权限残留 |
| 可达性 | 远程(未认证的 WebGUI 登录 POST) |
| CWE | CWE-117 / CWE-863 |
| CVSS | 高危:7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| 产品 | OPNsense core(Deciso B.V.) |
| 受影响版本 | OPNsense core 26.7.6(a842fe48c21288d11a422cb944678e8eb308becf)AuthenticationFactory / lockout_handler |
| 认证 | 未认证。CSRF cookie + token 来自 GET /。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
我固定了标签 26.7.6。实验环境是固定版本的 lockout_handler 加上 PATH 桩 pfctl,回环身份 127.0.0.1:18800。这不是 CRLF。一条 PHP syslog 记录仍保持为一行 handler 记录。Last-IP 对 authgui 模板是正确的加固,但对 factory 模板是错误的加固。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
未认证的 factory LOG_AUTH 用户名,包含锁定 False 短语加 IPv4 token(6 行间隔) | 固定 lockout_handler -> 桩 pfctl -t sshlockout -T add 和 pfctl -k | 完整性(实验环境已证实): 表 sshlockout 加上状态终止 argv。实验环境:planted=203.0.113.77。 |
| 同样的植入,实时 pf | filter.lib.inc:293-314 from <sshlockout> to (self) 端口 22/GUI | 可用性(推断): 丢弃来自被植入主机的新的 TCP 22/GUI;pfctl -k 拆除来自该 IP 的现有状态。 |
| 同样的用户名但仅含 IPv4(无 False 短语) | lockout_handler | 否定(实验环境已证实): 无表添加。negative-ip-only=no。 |
authgui 行末尾带 from REMOTE_ADDR | last-IP 解析器 | 自身 IP 的完整性(实验环境已证实): authgui 最后一个 token 保持为 198.51.100.10。 |
| 失败登录响应体 | 无 | 侦察(实验环境已证实关闭): 现有的 "Wrong username or password."。无用户枚举。 |
实验环境已证实 vs 推断: factory 植入、仅用户名否定、authgui last-IP 均为实验环境 SUCCESS。实时 pf 阻断和实时会话终止为推断。固定版本的 lockout_handler 原样复制;syslog-ng 和 WebGUI POST 为桩实现。
前提条件: 未认证的 WebGUI 登录 POST。CSRF cookie + token 来自 GET /。锁定开启(system.no_sshlockout 未设置)。默认安装。
| 攻击面 | 实验环境 |
|---|---|
未认证会话 / root / config.xml 写入 | 关闭 |
| authgui 行植入外部 IP | 最后一个 token 是 REMOTE_ADDR(authgui-last-ip=198.51.100.10) |
CRLF 额外 readline() | GHSA-2v2x 重写;一条记录保持一行 |
| 空密码登录 | authgui.inc 要求非空密码 |
| CVE-2026-44195 在 authgui 行上的成功关键字重置 | 失败规则优先 |
26.7.6 Omar Habra pfctl -k str(ip) TypeError | 已在此固定版本上 |
| 被植入的 IP 作为 DNS/网关目标 | 规则仅为 from <sshlockout> to (self) 端口 22/GUI |
无登录跳过。无 RCE。无 config.xml 重写。不会铸造会话。
cd lab
./run.sh
回环 127.0.0.1:18800。Compose 项目 opnsense-lockout-factory-ip。镜像标签 opnsense-lockout-factory-ip:26.7.6。见证 OPNSENSE-LOCKOUT-FACTORY-IP-WITNESS。最后一行:
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
将套接字 IP 追加到 factory syslog(LOG_AUTH) 模板,与 authgui.inc 相同的末尾 from REMOTE_ADDR。或者忽略并非来自 handler 自身对端的锁定 IP。不要将 last-token 视为 "客户端地址" 的替代品。
a842fe48c21288d11a422cb944678e8eb308becfAuthenticationFactory.phplockout_handler