Testo nelle immagini

Naked Security illustra i dettagli di un tipo di attacco molto subdolo.

Si tratta di nascondere un codice JavaScript nei pixel di un’immagine a toni di grigio; una versione modificata ad arte di jQuery è in grado di decodificare i dati contenuti nel file ed eseguirli come JavaScript.

Questo metodo potrebbe evadere molti, se non tutti, tipi di scansione perché il codice JavaScript non è riconoscibile come pattern.

Incuriosito da questa tecnica, ho provato a ricreare il metodo per codificare e decodificare un testo in un’immagine PNG.

Questi sono gli strumenti che ho utilizzato:

Ovviamente si possono ottenere gli stessi risultati con linguaggi, tool o piattaforme diversi. Mi scuserete per la poca eleganza del mio codice C.

Innanzi tutto, ho preso un testo di prova, nel mio caso ho utilizzato le prime 34 righe di /etc/rc.d/rc.sysinit di una CentOS 6.

Come prima cosa il testo va modificato in modo da triplicare ogni carattere, ovvero Hello world! deve diventare HHHeeellllllooo   wwwooorrrlllddd!!! questo perché bisogna creare un file RGB raw a toni di grigio in cui ogni pixel ha lo stesso valore per ciascuno dei tre componenti di colore.

Per fare ciò ho utilizzato questo semplice programma C che prende in stdin il testo normale e restituisce in stout quello triplicato:

#include <stdio.h>

int main() {
  int c;

  while (c != EOF) {
    c = getchar();
    putchar(c);
    putchar(c);
    putchar(c);
  }

  return 0;
}

Il file creato deve essere rinominato con estensione .rgb. Si sceglie quindi la dimensione del file risultante, nel mio caso ho scelto 50 pixel di lato. Il comando per trasformare il testo triplicato in PNG è

convert -depth 8 -size "50x50" testo3.rgb immagine.png

Il risultato è questo:

Immagine con testo

Come si può vedere questa immagine può essere scambiata tranquillamente per un file danneggiato e comunque non desta molti sospetti anche se si esamina il file con un dump esadecimale:

hexdump

Per convertire l’immagine PNG in RGB e, quindi in testo con i caratteri ripetuti tre volte il comando è

convert -depth 8 -size "50x50" immagine.png immagine.rgb

Da qui con questo semplice programma si ottiene il testo iniziale:

#include <stdio.h>

int main() {
  int c;

  while (c != EOF) {
    c = getchar();
    c = getchar();
    c = getchar();
    putchar(c);
  }

  return 0;
}

Questo è solamente un esempio semplice. Anziché utilizzare un’immagine ad hoc si sarebbe potuto utilizzare un’area ad alto rumore di un’immagine in bianconero, nel qual caso l’individuazione del testo nascosto sarebbe stata più difficile perché avrebbe dato meno nell’occhio.

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento