
pfSense Plus MIM API 툴킷 b4acd7ca - 높음 - 원격 - 권한 잔존 - GET /services/acme가 키를 덤프함
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-api-acme-key-dump
분류: 권한 잔여물 도달 범위: 원격
pfSense Plus Nexus 다중 인스턴스 관리 OpenAPI 툴킷 b4acd7ca - Netgate
GET /services/acme (GetACMEConfig)는 쓰기 전용 또는 마스킹 플래그 없이 ACMEConfig를 반환합니다. 200 스키마에는 ACME 계정 개인 키, 발급된 모든 리프 개인 키, 모든 사용자 지정 리프 키, 그리고 검증에 사용되는 DNS 제공자 토큰이 포함됩니다. 인증서 관리자는 최소한 전용 GET .../export-key를 가지고 있습니다. ACME에는 없습니다. 설정 GET이 곧 덤프입니다.
이 경로를 GET할 수 있는 컨트롤러 세션은 방화벽이 등록하는 모든 호스트 이름 키와, 해당 이름에 대한 제어를 증명하는 DNS 자격 증명을 복사합니다.
이 트리는 공개 OpenAPI와 생성된 Python 클라이언트입니다. CE REST 패키지가 아닙니다. MIM 컨트롤러는 Plus 전용이며 GitHub 저장소에 없습니다. 실제 컨트롤러와 통신하지 않았습니다. plus-not-executed=1.
| ID | 아직 CVE 없음 |
| 분류 | 권한 잔여물 (설정 GET 시 비밀 덤프) |
| 도달 범위 | 원격 (인증된 MIM 컨트롤러, 미인증은 입증되지 않음) |
| CWE | CWE-200 |
| CVSS | 높음: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N (서비스 읽기 역할이 본문을 받는 경우). 슈퍼유저만 GET할 수 있는 경우에도, 이 덤프는 설정 목록에 맞지 않는 형태입니다. |
| 제품 | Netgate/pfsense-api pfSense Plus Nexus MIM용 OpenAPI |
| 영향받는 버전 | 공개 main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25, Add Snort-3 API definitions). 태그 없음. |
| 인증 | POST /login에서 발급된 컨트롤러 JWT. 예제는 Bearer를 전송합니다. 스펙에 securitySchemes가 없습니다. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:19151 전용. Plus 이미지 없음. |
시리즈 허브: pfSense Plus MIM leftovers. 이 글은 5부입니다. G9 탈취된 JWT (샘플이 verify_ssl=False로 설정) 및 G6 플릿 토큰 (하나의 로그인 Bearer가 모든 device_id에 재사용됨)과 연계됩니다. 형제 덤프: G4 cert-manager export-key.
GET /services/acme를 수행할 수 있는 컨트롤러 세션이 필요합니다. 문서는 이를 mim_services_read / mim_services / mim_superuser에 매핑합니다. 스펙은 해당 역할을 경로에 연결하지 않습니다. Plus RBAC는 실행되지 않았습니다.
G9에서 탈취한 JWT(공식 샘플의 MITM) 또는 G6의 헬프데스크 플릿 토큰이면 이 GET을 모든 등록된 장비로 향하게 하기에 충분합니다. 이 연계는 추론된 것입니다. 이 잔여물은 GET 본문입니다.
| Method | Sink | Privilege |
|---|---|---|
GET /services/acme | ACMEConfig.account_keys[].account_key (format: byte) | 공개된 스펙과 mock에서 실험실 검증 완료: 200 스키마에 account_key가 포함됨; mock 본문이 PFSENSE-API-ACME-KEY-DUMP-WITNESS를 왕복함. Plus에서 추론됨: Let's Encrypt(또는 다른 ACME) 계정 개인 키를 복사함. 박스 외부에서 ACME 계정과 통신함. |
| 동일 GET | certs[].issued_cert.privateKey (format: byte) | 스펙+mock 실험실 검증 완료. Plus에서 추론됨: 방화벽이 등록한 모든 발급된 리프 개인 키를 복사함. 해당 이름들에 대한 박스 외부 TLS 사칭. |
| 동일 GET | certs[].custom_key (format: byte) | 스펙+mock 실험실 검증 완료. Plus에서 추론됨: key_type=custom일 때 사용자 정의 리프 키를 복사함. |
| 동일 GET | certs[].domain_list[].config.credentials (additionalProperties: string) | 스펙+mock 실험실 검증 완료. Plus에서 추론됨: DNS 검증 비밀(Cloudflare 토큰, AWS 키, RFC2136 비밀)을 복사함. 이는 해당 이름들에 대한 제어를 증명함. |
| 동일 GET | 계정 이메일, 사용자 정의 서버 URL, action_list.command | 해당 필드가 스키마에 존재함을 실험실 검증 완료. 훅 실행은 수정 경로이며 이 GET이 아님. |
GET 자체로 인한 것은 없음. 탈취한 키와 DNS 토큰의 이후 사용은 박스 외부에서 이루어짐(악성 인증서 발급, ACME 계정과 통신, DNS 변경). 실행되지 않음.
없음. 구성 목록 조회는 인증서를 폐기하거나 재작성하지 않음.
요구 사항: ACME 태그를 GET할 수 있는 인증된 MIM 컨트롤러 접근. 인증 없이 가능함은 입증되지 않음. 이 작업에 대해 생성된 _get_kwargs는 Authorization을 추가하지 않음; 예제는 여전히 로그인하고 Bearer를 전송함.
| 표면 | 이유 |
|---|---|
| 라이브 pfSense Plus / Nexus 컨트롤러 | 실행되지 않음. plus-not-executed=1. |
| 인증되지 않은 인터넷에서 8443으로 | 예제는 POST /login을 요구함. OAS security 누락은 스펙 공백이며, JWT 없이 200을 반환한다는 서버 증명이 아님. |
POST /services/acme/cert/{name}/issue 및 .../renew | 의도된 services-modify. |
POST /services/acme/genprivatekey | 의도된 새 계정 키 생성 및 반환. 이 잔여물이 아님. |
POST /diag/cmd/php / POST /diag/cmd/shell | 의도된 관리자 콘솔. 별개 표면. 벤더는 Diagnostics: Command를 의도된 것으로 취급함(CVE-2025-69691 이의 제기됨). |
GET /system/certificates/{refid}/export-key | 별개의 잔여물: 인증서 관리자의 전용 키 내보내기. ACME에는 이에 상응하는 내보내기 작업이 없음. |
GET /services/acme/validmethods | 메서드 카탈로그. 키 없음. |
CE jaredhendrickson/pfsense-api | 다른 제품. |
CE 2.9.0-DEVELOPMENT 웨이브 이후 공개된 Netgate/pfsense-api b4acd7ca를 고정했다. 이 트리는 OpenAPI 3.0.3(pfapi_openapi.yml, 486개 경로, 755개 작업)과 :8443의 Plus MIM 컨트롤러용 생성된 Python 클라이언트로 구성된다. 태그는 없다. 클론한 날 최신 공개 커밋은 2026-05-25, "Add Snort-3 API definitions."였다.
login/JWT, diagnostics, MIM enrollment, client TLS, users/certs, packages, VPN/firewall, OpenAPI security, device IDOR, git/firmware/feeds에 걸친 12번의 추적과, 모든 생성된 작업에 대한 루프백 mock.
먼저 건너뛸 목록: 이미 메일로 보고한 5개의 CE 잔여물(QinQ parent-if, OpenVPN wizard CRLF, CARP VHID, limiter number, IPsec login banner). 서드파티 CE REST 패키지. 미공개 RCE로서의 Diagnostics PHP/shell. 입증된 무인증으로서의 securitySchemes 누락. POST /system/firmware에는 URL이 없음. Ping/DNS/traceroute는 진단 기능임.
GET /services/acme를 읽었다. 200 $ref는 ACMEConfig이다. 속성을 따라가면 키 필드에 format: byte가 있는 account_key, privateKey, custom_key, credentials에 도달한다. 생성된 클라이언트 get_acme_config.py는 GET /services/acme를 호출하고 ACMEConfig를 파싱한다.
잘못된 방향: POST /services/acme/genprivatekey를 잔여물로 취급함(그 발급은 기능임); securitySchemes 누락을 입증된 무인증으로 취급함(예제는 여전히 Bearer를 전송함); 비슈퍼유저 역할이 Plus에서 실제로 키를 수신한다고 주장함.
극적인 요소: 라이브 Plus 박스. 오라클은 공개된 스키마와 루프백 mock 200이다.
pfapi_openapi.yml GET /services/acme:
/services/acme:
get:
tags:
- services
summary: Get ACME Config
operationId: GetACMEConfig
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ACMEConfig'
ACMEAccountKey.account_key:
account_key:
type: string
description: |
if key_type is not "custom", system will overwrite this field with generated private key
format: byte
ACMEIssuedCert.privateKey:
privateKey:
type: string
format: byte
ACMECertificate.custom_key는 format: byte입니다. ACMEValidationMethodConfig.credentials는 additionalProperties: string입니다.
생성된 클라이언트 py/pfapi/api/services/get_acme_config.py _get_kwargs:
_kwargs: dict[str, Any] = {
"method": "get",
"url": "/services/acme",
}
python3 pfsense-api-acme-key-dump-Abraxas-Labs.py
또는:
cd lab
./run.sh
Loopback 전용: http://127.0.0.1:19151. Compose 프로젝트 pfsense-api-acme-key-dump. Witness PFSENSE-API-ACME-KEY-DUMP-WITNESS. Pin b4acd7ca21dbca739a530403a1f62a7440f7726f는 런타임에 클론 또는 복사됩니다. Docker 필요. Plus 이미지 없음.
PoC는 해당 네 개의 secret 필드에 대해 pin OpenAPI를 순회하고, 생성된 _get_kwargs(GET /services/acme, Authorization 없음)를 로드하며, mock 200을 통해 witness를 왕복시킵니다.
IOC plus-not-executed=1 mock=http://127.0.0.1:19151 pin=b4acd7ca21dbca739a530403a1f62a7440f7726f
IOC schema-get-acme account_key=1 privateKey=1 custom_key=1 credentials=1
IOC mock-get http=200 account_key=1 privateKey=1 custom_key=1 credentials=1
SUCCESS pfsense-api-acme-key-dump schema=account_key,privateKey,custom_key,credentials mock-http=200 plus-not-executed=1 PFSENSE-API-ACME-KEY-DUMP-WITNESS