
pfSense Plus MIM API toolkit b4acd7ca - 높음 - 로컬 - 권한 잔여 - unix sock enroll no JWT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-unix-sock-noauth
분류: 권한 잔존 도달 범위: 로컬
pfSense Plus MIM API b4acd7ca - Netgate
github.com/Netgate/pfsense-api는 pfSense Plus Nexus Multi-instance Management용 공개 OpenAPI와 생성된 Python입니다. CE REST 패키지가 아닙니다. 공식 enroll 샘플은 Bearer JWT로 HTTPS :8443에 로그인한 다음, 각 방화벽에 POSIX 스크립트를 SSH로 전송합니다. 해당 스크립트는 Authorization 없이 /var/run/pfnet-controller.sock과 통신합니다.
curl --unix-socket /var/run/pfnet-controller.sock -H "Content-Type: application/json" -d "{controller JSON}" http://unix/api/mim/controllers
curl --unix-socket /var/run/pfnet-controller.sock http://unix/api/mim/device/identity
Deprecated fallbacks /api/system/controller와 /api/system/mim/devid는 동일하다: Bearer 없음. HTTPS 로그인은 여전히 JWT를 발급한다. 그 토큰은 온디바이스 sock에 적용되지 않는다. 이는 :8443과 mim_* 그룹과는 별개의 신뢰 경계다.
Nexus MIM 시리즈의 3부. G1 / G2가 박스에 적용된 후, 이 sock은 로컬 플레인이다.
sock에 connect(2)할 수 있는 로컬 프로세스는 JWT 없이 컨트롤러를 등록하고 디바이스 아이덴티티를 덤프할 수 있다. Plus는 실행되지 않았다. 실제 sock DAC는 알 수 없다.
| ID | 아직 CVE 없음 |
| Class | 권한 잔존 |
| Reach | 로컬 (/var/run/pfnet-controller.sock에 connect(2)) |
| CWE | CWE-306 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (sock 모드가 다른 로컬 uid의 연결을 허용하는 경우). 솔직히: DAC 알 수 없음, Plus 실행되지 않음. |
| Product | Netgate/pfsense-api (Plus Nexus MIM 툴킷) |
| Affected | public main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) |
| Auth | 공식 unix-socket enroll curl에 없음 |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:19121만. Unix HTTP mock. Plus 이미지 없음. |
행위자는 pfSense 디바이스에서 /var/run/pfnet-controller.sock에 connect(2)할 수 있는 모든 프로세스다. 이 예시에서는 원격 TCP가 아니다 (curl --unix-socket만). HTTPS :8443 JWT와 mim_* 그룹은 이 fd에 적용되지 않는다.
| Method | Sink | Privilege |
|---|---|---|
Authorization 없이 공식 device_script POST | POST http://unix/api/mim/controllers | Integrity: mock이 enroll JSON을 수락함. Hit log authorization_present=false. |
Authorization 없이 공식 device_script GET | GET http://unix/api/mim/device/identity | Recon: mock이 PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS를 포함한 DeviceIdentity 형태의 JSON을 반환함. |
Authorization: Bearer lab-jwt를 포함한 동일 GET | 동일 identity 경로 | Lab control: 401, witness가 body에 없음. present vs absent를 구분함. Plus 결과는 아님. |
이들은 공식 샘플과 mim 태그가 디바이스에 올리는 것과 동일한 OpenAPI op이다. 프로토콜로서만 입증되었으며, Plus 200으로는 아님.
| Method | Sink | Privilege |
|---|---|---|
공격자 ControllerIdentity (key, vpn_pubkey, vpn_listenaddr, vpn_netkey, cert)를 포함한 POST /mim/controllers (fallback POST /api/system/controller) | SetController | Integrity: 적대적 컨트롤러를 등록함. Spec: 디바이스는 "10초마다 연결 요청을 계속 발행할 것" (Netgard VPN이 공격자에게 연결됨). |
GET /mim/device/identity (fallback GET /api/system/mim/devid) | GetDeviceIdentity | Recon: 디바이스 Noise/VPN 공개 키, address, controller_add curl 텍스트. |
GET /mim/controllers | GetControllers | Recon: 컨트롤러 목록과 디바이스 정보 (ControllerInfo.noise_secret, 키). |
GET /mim/controllers/id/{key} | GetMIMController | Recon: 컨트롤러 레코드 하나. |
DELETE /mim/controllers/id/{key} | DeleteMIMController | Integrity / availability: 실제 컨트롤러를 등록 해제함 (key hex 또는 base64-URL). |
공격자 privkey / pubkey를 포함한 POST /mim/device/pubkey | SetDevicePublicKey (DevicePublicKeyOption에 privkey 포함) | Integrity: 디바이스 ED25519 아이덴티티를 교체함. 이후 컨트롤러 핸드셰이크가 공격자 키를 신뢰함. |
그 자체로 호스트 root 셸을 부여하지는 않는다. MIM 플레인을 부여한다: 디바이스가 컨트롤러로 신뢰하는 대상, 그리고 pubkey POST가 존중될 경우 디바이스 Noise 개인 키.
요구 사항: /var/run/pfnet-controller.sock에 대한 로컬 connect(2). DAC(모드, 소유자, 그룹, SO_PEERCRED)는 공개 클라이언트 트리에 없습니다. 데몬이 0600 root로 바인딩하면 이는 이미 root인 로컬(헬퍼, 패키지 또는 /var/run을 볼 수 있는 탈출에 대한 confused deputy)입니다. 소켓이 다른 uid에서 접근 가능하면 점수대로 CVSS 7.8입니다.
:8443의 /mim/controllers에 대한 인증되지 않은 원격 TCP. 해당 포트는 User Manager JWT로 문서화되어 있습니다. 이 잔여물은 unix fd입니다.POST /login은 여전히 Bearer JWT를 발급합니다. AuthenticatedClient는 여전히 이를 CONTROLLER_URL+"/api"로 보냅니다.verify_ssl=True. 경로 매개변수는 ../를 퍼센트 인코딩합니다.security: MISSING은 스키마 공백이며, 입증된 인증되지 않은 HTTPS 우회가 아닙니다.동일한 핀, 원격 등록 플레인: pfsense-api-enroll-json-ssh 및 pfsense-api-enroll-autoadd. 시리즈 맵: pfsense-api-nexus-mim.
Netgate/pfsense-api b4acd7ca21dbca739a530403a1f62a7440f7726f를 핀하고 공식 등록 루프를 읽었습니다: 로그인, GET /mim/controller/identity, 문자열화, unix-socket POST/GET의 SSH exec, POST /mim/devices. HTTPS는 AuthenticatedClient(token=...)를 사용합니다. 소켓 curl은 사용하지 않습니다.
잘못된 방향: 누락된 securitySchemes를 인증되지 않은 HTTPS로 취급(로그인에도 누락되어 있음; 예제는 항상 Bearer가 먼저). 소켓이 전 세계 쓰기 가능하다고 가정(모드는 이 저장소에 없음). Plus 200 주장. 여기서 입증된 잔여물은 공개된 등록 프로토콜입니다.
극장: 리버스 셸. 오라클은 공식 curl 형태에 identity 본문의 증인과 Bearer 401 컨트롤을 더한 것입니다.
python3 pfsense-api-unix-sock-noauth-Abraxas-Labs.py
또는
cd lab
./run.sh
Loopback 전용: 127.0.0.1:19121. Compose 프로젝트 pfsense-api-unix-sock-noauth. /var/run/pfnet-controller.sock에서 unix HTTP 모의. Witness PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS. Docker unix-socket 모의. Plus 이미지 없음.
예상 마지막 줄:
SUCCESS PFSENSE-API-UNIX-SOCK-NOAUTH auth-absent=yes identity-witness=yes bearer-401=yes PFSENSE-API-UNIX-SOCK-NOAUTH-WITNESS
/var/run/pfnet-controller.sock에 디바이스 JWT 또는 SO_PEERCRED를 요구하십시오. 소켓을 0600 root로 바인딩하십시오. 인증되지 않은 유닉스 피어로부터의 POST /mim/controllers, POST /mim/device/pubkey, 또는 identity GET을 허용하지 마십시오.
b4acd7ca21dbca739a530403a1f62a7440f7726fexample-add-devices.py device_script (유닉스 curl, Authorization 없음)pfapi_openapi.yml /mim/controllers, /mim/device/identity, /mim/device/pubkeyGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 랩 전용. 보증 없음.