mercoledì 30 dicembre 2015

“IP disclosure” di un’applicazione MyBB sotto cloudflare/tor/proxy

Questa procedura sfrutta un evento non previsto, in particolare una richiesta HTTP viene effettuata dall’applicazione verso un server remoto, causando il “disclosure” (o “leak“) dell’indirizzo IP. La gravità di questa vulnerabilità dipende dal contesto in cui si trova l’applicazione web: per ovvi motivi aumenterà nei casi in cui MyBB fosse installato in un hidden-service tor, rendendo di fatto possibile determinare la corrispodenza dell’.onion con il rispettivo IP, violandone l’anonimità. Nei casi più estremi è possibile aggirare Clouflare, il server proxy, il firewall e altri.

Passando all’analisi concreta della vulnerabilità, la richiesta HTTP avviene nel momento in cui un utente registrato desidera impostare come avatar un’immagine remota attraverso il proprio pannello di controllo.

Vediamo prima cosa succede nel dettaglio: andiamo a vedere il codice sorgente di MyBB, presente nella rispettiva repository su GitHub. In particolare, ci interessa la pagina del pannello utente “usercp.php”:


Sostanzialmente, come è possibile notare, quando si inserisce un link all’immagine (remota) dell’avatar, il server effettua tre passaggi:
  1. verifica l’estensione del file tramite un’analisi regex del link; 
  2. scarica l’immagine attraverso la funzione fetch_remote_file;
  3. salva l’immagine su un file in locale e verifica che le dimensioni dell’immagine siano inferiori alla soglia stabilita nel file di configurazione;
La funzione fetch_remote_file, definita nel file functions.php, consiste in una richiesta HTTP attraverso cURL o, se non fosse installato, attraverso fsockopen. Da qui, come già detto, deduciamo la nostra vulnerabilità.

L’attacco pertanto può essere organizzato in questo modo:
  1. Creiamo uno script in PHP, rinominato in formato .PNG, che salvi l’indirizzo IP del visitatore su un file locale;
  2. Aggiungiamo una direttiva nel file .htaccess che permetta al server l’interpretazione dei file .PNG come PHP. Ad esempio "AddType application/x-httpd-php .png";
  3. Cambiamo l’immagine dell’avatar e controlliamo il file di log.
Per fixare la problematica consiglierei di modificare opportunamente il codice riguardante la funzione fetch_remote_file facendo passare le richieste sotto un proxy o, se proprio necessario, disabilitare la funzionalità.

Edit: dopo un esame della funzione get_extension, sono giunto alla conclusione che l’analisi del link per stabilire l’estensione è alquanto “buggata”: infatti è possibile aggirare l’eventuale blocco aggiungendo come prefisso “?.png”, “?.jpg” ecc…

Ho realizzato inoltre un video che illustra velocemente il Proof of Concept, utilizzando come obiettivo un hidden service:


Nessun commento:

Posta un commento