pfSense Plus MIM API toolkit b4acd7ca - 높음 - 원격 - 권한 잔존 - Paramiko AutoAddPolicy enroll
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-enroll-autoadd
분류: 권한 잔존 도달 범위: 원격
pfSense Plus MIM API (Netgate/pfsense-api) b4acd7ca - Netgate
example-add-devices.py는 Nexus 컨트롤러를 각 pfSense 장치에 등록하는 문서화된 방법입니다. 이 스크립트는 load_system_host_keys()를 절대 호출하지 않습니다. paramiko.AutoAddPolicy()를 설정한 다음 connect하고 exec_command(device_script)를 실행합니다. 주석에는 장치가 이미 known_hosts에 있을 때 AutoAdd를 제거하라고 되어 있습니다. 기본 배포 설정은 AutoAdd입니다.
새 장치에 대한 최초 접속 SSH는 응답하는 호스트 키를 그대로 수용합니다. 비밀번호 또는 키 인증이 해당 피어에 제시됩니다. stdout은 json.loads 처리되어 실제 컨트롤러로 POST /mim/devices됩니다.
이것은 서드파티 CE REST 패키지가 아닙니다. 이것은 pfSense Plus Nexus Multi-instance Management를 위한 공식 OpenAPI와 생성된 Python 클라이언트입니다. 서버는 Plus 전용입니다. 실습 환경은 Paramiko SSH 가젯입니다. 실제 Plus 컨트롤러와 통신하지는 않았습니다.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔존 (등록 SSH에서의 Paramiko AutoAddPolicy) |
| 도달 범위 | 원격 (최초 접속 시 장치 SSH에 대한 경로 상) |
| CWE | CWE-322 |
| CVSS | 높음: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 제품 | Netgate/pfsense-api (Plus Nexus MIM 클라이언트 툴킷) |
| 영향받음 | main b4acd7ca21dbca739a530403a1f62a7440f7726f example-add-devices.py |
| 인증 | 운영자가 공식 샘플을 실행하며, 공격자는 장치 SSH에 대한 경로 상에 위치 |
| 라이선스 | GNU Affero GPL v3.0 |
| 실습 환경 | 127.0.0.1:19111 전용. Plus 이미지 없음. |
AC:H는 최초 접속 / 경로 상을 의미합니다. 실제 장치 키가 이미 known_hosts에 있고 또한 AutoAdd 줄이 제거된 워크스테이션은 이 잔존 문제에 해당하지 않습니다.
동일한 핀 잔존 문제: 등록 셸에 대한 ControllerSummary의 JSON 보간 (G1) 및 샘플이 verify_ssl=False를 강제 (G9). 시리즈 허브: pfsense-api-nexus-mim.
운영자가 샘플을 실행하는 동안 pfsense_addresses에 있는 최초 접속 SSH 주소에 대한 경로 상에 위치합니다. AutoAdd는 여전히 켜져 있습니다.
| 방식 | 싱크 | 권한 |
|---|---|---|
pfsense_addresses의 최초 접촉 SSH 주소로 on-path에 앉기 | set_missing_host_key_policy(paramiko.AutoAddPolicy()) 후 connect (example-add-devices.py:151-160) | 무결성 (실험실 입증): 알 수 없는 호스트 키가 수용됨. 실험실: AutoAddPolicy 연결됨(autoadd=yes). RejectPolicy 실패(reject-control=yes). |
동일 세션, exec_command(device_script) 응답 | stdout이 DeviceIdentity로 파싱됨 (example-add-devices.py:161-187) | 무결성 (실험실 입증): exec가 PFSENSE-API-ENROLL-AUTOADD-WITNESS를 포함한 identity JSON을 반환함(identity-json=yes). |
| 동일 MITM, exec 페이로드 읽기 | device_script는 G1의 ControllerSummary curl -d 잔여물 | 정찰 (소스에서 추론): 컨트롤러 identity 키, Netgard vpn_pubkey / vpn_netkey / listen 주소. 이 실험실에서는 덤프되지 않음. |
| 동일 MITM, 비밀번호 또는 키 인증 | SSHUSER / SSHPASS 또는 agent/keys (example-add-devices.py:156-160) | 정찰 (추론): 가짜 호스트에 제시된 자격 증명 또는 키. 실험실에서는 샘플 SSHPASS 경로로만 비밀번호 인증을 사용함. |
동일 stdout JSON, add_controlled_device.sync | 실제 컨트롤러의 POST /mim/devices | 무결성 (추론): 공격자의 Noise/VPN 키와 address를 등록함. 또한 이 실험실에서는 핸드셰이크가 실행되지 않음. |
| MITM이 SSH 서버인 경우 | 클라이언트가 보낸 exec 그대로, SSHUSER로서 | 무결성 / 가용성 (추론): 등록 스크립트를 실행, 중단 또는 건너뜀. 실제 장치의 Unix-socket 호출은 MITM이 이를 전달할 때만 발생함. |
실험실 입증 vs 추론: AutoAdd 연결, RejectPolicy 실패, witness가 포함된 identity JSON은 실험실 결과임. 컨트롤러 키 덤프, 자격 증명 탈취, 가짜 장치의 POST /mim/devices, 실제 unix-socket curl 실행은 동일한 샘플 경로에서 추론한 것임.
요구 사항: 운영자가 호스트 키가 아직 고정되지 않은 SSH 주소에 대해 공식 샘플을 실행하고, AutoAdd가 켜져 있어야 함. 해당 SSH로의 네트워크 경로. AC:H는 최초 접촉 / on-path임.
| 표면 | 이유 |
|---|---|
동일한 알 수 없는 호스트에 대한 RejectPolicy | 실험실: reject-control=yes. Paramiko가 키를 거부함. |
known_hosts에 실제 장치 키가 있고 또한 AutoAdd 줄이 제거된 워크스테이션 | 주석의 의도된 모드. 호출을 추가하지 않는 한 샘플은 해당 키를 로드하지 않음. |
| HTTPS 컨트롤러 로그인 | verify_ssl=False는 형제 샘플 잔여물(G9)이며, 이 싱크가 아님. |
| 실제 방화벽의 Unix-socket MIM | MITM이 exec를 전달하는 경우에만 해당. 이 실험실은 /var/run/pfnet-controller.sock과 통신하지 않음. |
생성된 Client의 기본 verify_ssl=True | 라이브러리 기본값은 잔여물이 아님. 샘플은 False로 강제함. |
Plus RBAC / 라이브 :8443 | 이 실험실은 Paramiko 가젯임. Plus 컨트롤러와 통신하지 않았음. |
| 인증되지 않은 인터넷에서 8443으로 | 로그인은 여전히 JWT를 발급함. 이 발견 사항이 아님. |
| Diagnostics PHP/shell | 플릿 JWT에 대한 의도된 관리자 권한. 이 발견 사항이 아님. |
CE WebGUI 잔여물 이후 github.com/Netgate/pfsense-api main b4acd7ca21dbca739a530403a1f62a7440f7726f를 고정했음. 이 트리는 OpenAPI와 Plus Nexus MIM용 생성 Python임. example-add-devices.py의 등록 루프를 읽었음. 호스트 키 정책은 AutoAdd임. 시크릿은 동일한 exec 채널에 있음. 샘플은 load_system_host_keys()를 호출하지 않음.
이미 기록된 잘못된 방향: AutoAdd를 의도된 실험실 전용으로 취급(주석은 opt-out이지 opt-in이 아님); known_hosts가 로드된다고 가정; 이를 ControllerSummary shell 보간 잔여물에 포함; Plus를 라이브 실험실에서 테스트; 이것이 :8443에 대한 인증되지 않은 HTTPS라고 주장.
Theatre: 리버스 셸. 오라클은 RejectPolicy fail과 AutoAdd connect, 그리고 witness가 포함된 identity JSON이다.
python3 pfsense-api-enroll-autoadd-Abraxas-Labs.py
또는
cd lab
./run.sh
Loopback SSH 127.0.0.1:19111. Compose 프로젝트 pfsense-api-enroll-autoadd. CONTROL: RejectPolicy는 알 수 없는 호스트를 거부한다. INJECT: 공식 샘플 AutoAddPolicy, connect, 등록 스크립트의 exec_command; stdout은 witness가 포함된 identity JSON이다. 라이브 Plus 컨트롤러는 없다. Witness PFSENSE-API-ENROLL-AUTOADD-WITNESS. 실행 후 스택은 해체된다.
SUCCESS PFSENSE-API-ENROLL-AUTOADD autoadd=yes reject-control=yes identity-json=yes PFSENSE-API-ENROLL-AUTOADD-WITNESS
paramiko.RejectPolicy()를 사용하거나 known_hosts를 고정하세요. connect 전에 load_system_host_keys()(그리고 전용 known_hosts 파일)를 호출하세요. 공식 샘플에 AutoAddPolicy()를 포함하지 마세요. "모든 pfsense 장치가 known_hosts에 있다면 이 줄을 주석 처리하세요"라는 주석이 의도된 모드입니다. 이를 기본값으로 만드세요.
b4acd7ca21dbca739a530403a1f62a7440f7726fexample-add-devices.pyGNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 랩 전용. 보증 없음.