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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
pfsense-api-example-ssl-verify — pfSense Plus MIM API 툴킷 b4acd7ca - 중간 - 원격 - 권한 잔여 - 공식 샘플 verify_ssl=False | Kitploit
도구/GitHubGitHub/abraxas/pfsense-api-example-ssl-verify
Defensive ToolsVulnerability AnalysisExploitationInformation GatheringWeb SecurityNetwork SecurityPenetration TestingAuthenticationPapers & Research

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHubabraxas/pfsense-api-example-ssl-verify

pfsense-api-example-ssl-verify

pfSense Plus MIM API 툴킷 b4acd7ca - 중간 - 원격 - 권한 잔여 - 공식 샘플 verify_ssl=False

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

Abraxas Labs - pfsense-api-example-ssl-verify

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  pfsense-api-example-ssl-verify

pfsense-api-example-ssl-verify

분류: 권한 잔여물 도달 범위: 원격

pfSense Plus MIM API (Netgate/pfsense-api b4acd7ca) - Netgate

생성된 Client / AuthenticatedClient는 기본값으로 verify_ssl=True를 설정하고 이를 httpx에 전달합니다. 문서에서는 이미 verify_ssl=False를 보안 위험으로 규정하고 PEM 번들 경로를 먼저 제시합니다. 그런데 모든 공식 Python 샘플과 helper_funcs.py는 여전히 verify_ssl=False로 이들을 생성합니다. example.js는 NODE_TLS_REJECT_UNAUTHORIZED=0을 설정하므로, Node 프로세스 전체가 검증을 건너뜁니다. 로그인 JSON은 사용자 이름과 비밀번호를 base64로 넣습니다. 이는 OpenAPI 계약이지 암호화가 아닙니다. TLS가 기밀성 계층입니다.

:8443의 경로상 피어가 아무 인증서나 제시합니다. 샘플은 여전히 /login에 POST합니다. 대체 서버가 base64 관리자 로그인을 캡처하고 JWT를 발급합니다. 그 토큰이 사슬입니다: G4 export-key, G5 ACME dump, G6 fleet JWT, G7 ACB userkey, 의도된 php/shell, 그리고 G1이 SSH로 보간하는 JSON.

이 문서는 pfSense Plus MIM API 툴킷의 Part 9입니다. Medium 등급이지만 이 잔여물을 먼저 읽으십시오. 탈취된 JWT가 나머지를 example.py를 복사한 워크스테이션에서 도달 가능하게 만드는 방법입니다.

ID아직 CVE 없음
분류권한 잔여물 (샘플 TLS 검증 꺼짐)
도달 범위원격 (:8443에 대한 경로상)
CWECWE-295
CVSSMedium: 6.8 CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N
제품Netgate/pfsense-api (Plus Nexus MIM 클라이언트; CE REST 패키지 아님)
영향받음공개 main b4acd7ca21dbca739a530403a1f62a7440f7726f (2026-05-25) 공식 샘플 및 helper_funcs.py
인증운영자가 샘플을 복사하여 컨트롤러에 대해 실행; 추가 컨트롤러 역할 없음
라이선스GNU Affero GPL v3.0
랩127.0.0.1:19191 전용. pfSense Plus를 구성하지 않음.

AC:H는 운영자 워크스테이션과 MIM 컨트롤러 사이의 경로상입니다. UI:R은 샘플을 복사/실행하는 것입니다.

공격자가 할 수 있는 일

피해자: https://controller:8443에 대해 공식 샘플이나 helper_funcs.py를 실행하는 운영자 워크스테이션. 공격자: 해당 HTTPS에 대한 경로상(LAN, rogue DHCP, 침해된 VPN 홉, ARP). 인증되지 않은 인터넷-방화벽 간이 아닙니다.

MethodSinkPrivilege
샘플이 verify_ssl=False / NODE_TLS_REJECT_UNAUTHORIZED=0로 /login 또는 /api/login에 POST하는 동안 아무 인증서나 제시httpx verify=False (Python 샘플) 또는 Node TLS reject-unauthorized 0기밀성 (실험실 입증): 로그인 JSON을 읽는다. 실험실: 대역이 base64 admin / lab-controller-secret을 캡처함 (captured_b64_admin=yes). 디코딩은 base64 -d 한 번.
동일 MITM, 200 LoginResponse샘플이 아무 인증서나 수용기밀성 (실험실 입증): 액세스 JWT를 탈취한다. 실험실: INJECT가 PFSENSE-API-EXAMPLE-SSL-VERIFY-WITNESS를 담은 토큰을 획득함.
동일 MITM, 로그인 시 Set-Cookie샘플이 client.get_httpx_client().cookies를 AuthenticatedClient로 복사기밀성 (실험실 입증 쿠키, 재생 추론): 24시간 리프레시 JWT. 해당 쿠키와 base64 사용자 이름으로 리프레시 TTL까지 POST /login/refresh를 재생한다. 실험실에서 Set-Cookie: refresh=...를 캡처함. 실제 컨트롤러에 대한 리프레시는 실행되지 않음.
탈취한 Bearer를 실제 컨트롤러로 재생 (공격자가 해당 컨트롤러로 라우팅할 수도 있는 경우)Plus MIM /api 및 /api/device/pfsense/{device_id}/api무결성 (추론): 이 API에서 로그인한 사용자와 동등한 admin 권한. 스키마에는 POST /diag/cmd/php, POST /diag/cmd/shell, POST /diag/editfile, POST /diag/backup/restore, POST /diag/control halt/reboot가 포함됨. 여기서는 실행되지 않음. 이 실험실은 컨트롤러 대역이지 Plus가 아님.
탈취한 Bearer를 leftover 6 (fleet 토큰)으로 재생모든 device_id에 대해 하나의 POST /login JWT 재사용무결성 (추론): 방화벽 A용으로 의도된 사용자로 인증한 후 방화벽 B와 통신. LoginResponse에는 디바이스별 허용 목록이 없음. 팩: pfsense-api-fleet-jwt. Plus RBAC는 실행되지 않음.
탈취한 Bearer를 leftover 4로 재생GET /system/certauth/{refid}/export-key, GET /system/certificates/{refid}/export-key, GET /system/certificates/{refid}/export-p12기밀성 (추론): CA 및 리프 개인 키를 추출하고, PKCS12는 비밀번호 보호 없이 문서화되어 있으므로 VPN / WebGUI TLS / IPsec을 사칭. 팩: pfsense-api-export-key-get.
탈취한 Bearer를 leftover 5로 재생GET /services/acme기밀성 (추론): 방화벽이 등록하는 모든 호스트 이름에 대한 Let's Encrypt 계정 키와 발급된 인증서 키를 탈취. 팩: pfsense-api-acme-key-dump.
탈취한 Bearer를 재생하거나, ACB를 GET하는 샘플에서 userkey를 유출하여 leftover 7로 사용GET /services/acb?userkey= 및 GET /services/acb/bkp?userkey=기밀성 (추론): Auto Config Backup 블롭(전체 구성)을 나열하고 가져옴. 팩: pfsense-api-acb-userkey.
ControllerSummary JSON을 leftover 1 방향으로 조작verify_ssl=False HTTPS의 MITM이 example-add-devices.py가 따옴표 이스케이프한 후 .format으로 SSH에 삽입하는 JSON을 공급무결성 (추론): 컨트롤러 필드 내 $() / 백틱 / 개행이 pfsense_addresses의 모든 주소에서 SSHUSER로 실행됨. 팩: pfsense-api-enroll-json-ssh.
클라이언트 방향으로 응답 주입skip-verify가 아무 인증서나 수용무결성 (실험실 입증 토큰, 추론된 fleet): 샘플이 유지할 JWT를 발행. 실험실: witness가 포함된 INJECT 토큰. 실제 샘플에 대한 가짜 디바이스 목록 / 업그레이드 진행률 / 로그인 성공도 동일한 관문임.
POST /diag/control, 펌웨어 POST, 손상된 백업 복원 (탈취한 Bearer 이후)TLS가 사라진 후 의도된 admin 표면가용성 (추론): halt / reboot / 손상된 이미지. 동일한 Bearer. 실험실 검증 안 됨.

실험실 입증 vs 추론: CONTROL 핸드셰이크 실패, INJECT 토큰, 캡처된 base64 admin 로그인은 127.0.0.1:19191에서 실험실 입증됨. 해당 Bearer를 실제 Plus 컨트롤러로 재생, diag php/shell, G4-G7, G1 JSON 조작, 그리고 새 액세스 JWT의 리프레시 쿠키 발행은 OpenAPI와 샘플에서 추론됨.

요구 사항: 운영자가 example.py, example-add-devices.py, example-upgrade-devices.py, example-set-alias.py / example-upgrade-devices-async.py를 helper_funcs.py를 통해 복사 및 실행하거나, example.js를 실행합니다. 공격자는 :8443으로 가는 경로 상에 위치합니다.

닫힌 상태로 유지되는 인접 공격 표면

표면닫힌 이유
kwargs 없이 생성된 Client(base_url=...)verify_ssl=True. Lab CONTROL: CERTIFICATE_VERIFY_FAILED, HTTP 캡처 0건.
크로스 호스트 3xx 자격 증명 전달생성된 follow_redirects=False.
이 클라이언트가 로그인으로 수락하는 위조된 JWT클라이언트는 리소스 서버가 아니며, 페이로드 파싱은 exp 표시용임.
운영자 클라이언트 없이 8443에 대한 비인증 인터넷 접근Plus MIM 바인드/ACL은 닫힌 서버이며, 이 툴킷이 아님.
example.conf에 커밋된 비밀번호PASSWORD 줄이 주석 처리됨.
CE REST 패키지 (jaredhendrickson / pfrest.org)다른 제품.
pfSense Plus 자체이 GitHub 트리에 없음; 이 랩은 Plus를 구성하지 않음.

검증 생략 샘플만으로는 pfSense 박스에서 비인증 RCE를 제공하지 않습니다. 이는 샘플을 복사한 운영자에 대한 MITM을 제공합니다. Shell/PHP 진단은 탈취된 관리자 Bearer 이후 추론된 스키마 권한입니다.

client = Client(base_url=CONTROLLER_URL+"/api",
				verify_ssl=False,
				headers={"Content-Type": "application/json"})

example.py:47, example.py:78, example.py:120; helper_funcs.py:135, helper_funcs.py:167, 그리고 createDeviceApiChild / clone; example-add-devices.py:64, example-add-devices.py:94; example-upgrade-devices.py:57, :86, :132. helper_funcs.get_settings()에는 (PASSWORD와 달리) VERIFY_SSL 환경 변수가 없습니다.

// To be able to use with self-signed Controller TLS certificates:
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

생성된 기본값으로, 샘플에서 재정의됩니다:

_verify_ssl: str | bool | ssl.SSLContext = field(default=True, kw_only=True, alias="verify_ssl")

py/pfapi/client.py:42와 AuthenticatedClient의 동일한 필드. 둘 다 verify=self._verify_ssl을 httpx에 전달한다. py/README.md는 verify_ssl="/path/to/certificate_bundle.pem"을 먼저 보여주고, 그다음 False와 함께 this is a security risk라고 표시한다.

발견 방법

b4acd7ca를 고정하고 생성된 클라이언트를 손으로 작성한 샘플 옆에서 읽었다. 라이브러리 기본값은 True다. 모든 공식 구성이 여전히 False를 전달한다. JS는 프로세스 전역이다. 게시된 패키지가 검증하기 때문에 나는 이것을 gist-class-not-this로 거의 넘길 뻔했다. 그런 다음 샘플 호출 지점을 세었다. Python 13개. 전부 False. 그다음 루프백에 자체 서명 컨트롤러를 세웠다.

도구 다운로드