
OPNsense 26.7.6 - 높음 - 원격 - 권한 잔존 - 팩토리 잠금 IP
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-lockout-factory-ip
분류: 권한 잔여 도달 범위: 원격
OPNsense core 26.7.6 (a842fe48) - opnsense.org
인증되지 않은 WebGUI 로그인은 여전히 소켓 IP가 없는 팩토리 LOG_AUTH 라인에서 lockout_handler를 구동합니다. GHSA-2v2x는 CRLF 분할을 차단하고 lockout IP 선택을 마지막 토큰으로 전환하여 authgui.inc의 후행 from REMOTE_ADDR이 우선하도록 했습니다. AuthenticationFactory::authenticate()는 여전히 주소 접미사 없이 원시 사용자 이름을 syslog()에 기록합니다. lockout False 구문과 IPv4 토큰에 일치하는 사용자 이름이 해당 라인의 마지막(유일한) 주소가 됩니다. 기본 5회 간격 시도 후: pfctl -t sshlockout -T add 및 pfctl -k. 기본값: lockout 켜짐, 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 |
| 인증 | 인증 불필요. GET /에서 CSRF 쿠키 + 토큰. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
태그 26.7.6을 고정했습니다. 랩은 고정된 lockout_handler와 PATH 스텁 pfctl, 루프백 아이덴티티 127.0.0.1:18800으로 구성됩니다. 이것은 CRLF가 아닙니다. 하나의 PHP syslog 레코드는 하나의 핸들러 라인으로 유지됩니다. Last-IP는 authgui 템플릿에는 올바른 강화였지만 팩토리 템플릿에는 잘못된 강화였습니다.
| 방법 | 싱크 | 권한 |
|---|---|---|
인증되지 않은 팩토리 LOG_AUTH 사용자 이름에 lockout False 구문과 IPv4 토큰 포함 (6개의 간격을 둔 라인) | lockout_handler 고정 -> 스텁 pfctl -t sshlockout -T add 및 pfctl -k | 무결성 (랩 입증): 테이블 sshlockout 및 상태 킬 argv. 랩: planted=203.0.113.77. |
| 동일한 plant, 라이브 pf | filter.lib.inc:293-314 from <sshlockout> to (self) 포트 22/GUI | 가용성 (추론): plant된 호스트로부터의 새로운 TCP 22/GUI 드롭; pfctl -k는 해당 IP로부터의 기존 상태를 해제합니다. |
| IPv4만 있는 동일한 사용자 이름 (False 구문 없음) | lockout_handler | 부정 (랩 입증): 테이블 추가 없음. negative-ip-only=no. |
후행 from REMOTE_ADDR이 있는 authgui 라인 | last-IP 파서 | 자체 IP의 무결성 (랩 입증): authgui 마지막 토큰은 198.51.100.10으로 유지됩니다. |
| 실패한 로그인 본문 | 없음 | 정찰 (랩 입증, 차단됨): 기존 "Wrong username or password." 사용자 열거 없음. |
랩 입증 vs 추론: 팩토리 plant, 사용자 이름 전용 부정, authgui last-IP는 랩 SUCCESS입니다. 라이브 pf 차단과 라이브 세션 킬은 추론입니다. lockout_handler 고정은 변경 없이 복사됨; syslog-ng와 WebGUI POST는 스텁됨.
요구 사항: 인증되지 않은 WebGUI 로그인 POST. GET /에서 CSRF 쿠키 + 토큰. Lockout 켜짐 (system.no_sshlockout 미설정). 기본 설치.
| 표면 | 랩 |
|---|---|
인증되지 않은 세션 / root / config.xml 쓰기 | 차단됨 |
| 외부 IP를 plant하는 authgui 라인 | 마지막 토큰은 REMOTE_ADDR (authgui-last-ip=198.51.100.10) |
CRLF 추가 readline() | GHSA-2v2x 재작성; 하나의 레코드는 한 라인으로 유지 |
| 빈 비밀번호 로그인 | authgui.inc는 비어 있지 않은 비밀번호를 요구 |
| authgui 라인의 CVE-2026-44195 성공 키워드 리셋 | 실패 규칙이 먼저 |
26.7.6 Omar Habra pfctl -k str(ip) TypeError | 이미 이 핀에 존재 |
| DNS/게이트웨이 목적지로서의 Planted IP | 규칙은 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. Witness 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
팩토리 syslog(LOG_AUTH) 템플릿에 소켓 IP를 추가하세요, authgui.inc와 동일한 후행 from REMOTE_ADDR을 사용합니다. 또는 핸들러 자체의 피어에서 오지 않은 lockout IP를 무시하세요. last-token을 "클라이언트 주소"의 대체물로 취급하지 마세요.
a842fe48c21288d11a422cb944678e8eb308becfAuthenticationFactory.phplockout_handler