Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
pfsense-api-acme-key-dump — pfSense Plus MIM API 툴킷 b4acd7ca - 높음 - 원격 - 권한 잔존 - GET /services/acme가 키를 덤프함 | Kitploit
도구/GitHubGitHub/abraxas/pfsense-api-acme-key-dump
Vulnerability AnalysisExploitationData ExfiltrationInformation GatheringWeb SecurityPenetration TestingSecret DetectionPapers & ResearchAPI Security
GitHubabraxas/pfsense-api-acme-key-dump

pfsense-api-acme-key-dump

pfSense Plus MIM API 툴킷 b4acd7ca - 높음 - 원격 - 권한 잔존 - GET /services/acme가 키를 덤프함

11일 전아직 검토되지 않음
저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Abraxas Labs - pfsense-api-acme-key-dump

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  pfsense-api-acme-key-dump

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 컨트롤러, 미인증은 입증되지 않음)
CWECWE-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 본문입니다.

정찰

MethodSinkPrivilege
GET /services/acmeACMEConfig.account_keys[].account_key (format: byte)공개된 스펙과 mock에서 실험실 검증 완료: 200 스키마에 account_key가 포함됨; mock 본문이 PFSENSE-API-ACME-KEY-DUMP-WITNESS를 왕복함. Plus에서 추론됨: Let's Encrypt(또는 다른 ACME) 계정 개인 키를 복사함. 박스 외부에서 ACME 계정과 통신함.
동일 GETcerts[].issued_cert.privateKey (format: byte)스펙+mock 실험실 검증 완료. Plus에서 추론됨: 방화벽이 등록한 모든 발급된 리프 개인 키를 복사함. 해당 이름들에 대한 박스 외부 TLS 사칭.
동일 GETcerts[].custom_key (format: byte)스펙+mock 실험실 검증 완료. Plus에서 추론됨: key_type=custom일 때 사용자 정의 리프 키를 복사함.
동일 GETcerts[].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",
}

Lab

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

수정 사항

도구 다운로드