venerdì 14 novembre 2008

BrutalStego, steganografia semplice ma efficace


Per divertirmi mi sono chiesto, cosa succederebbe ad un'immagine JPG o ad un MP3 se inserissi del codice esadecimale o del testo al loro interno, senza un orientamento ben preciso, insomma una steganografia manuale.
Quindi ho deciso di provare a tradurre in esadecimale una frase:


$ echo "ciao mondo! Uffa sempre questa come frase esempio :)" xxd -p

6369616f206d6f6e646f2120556666612073656d70726520717565737461
20636f6d65206672617365206573656d70696f203a290a

Ottenendo la conversione in esadecimale della frase, poi aprendo con un editor esadecimale una JPG ho provato ad incollare il suddetto codice, partendo dall'offset 11 (in decimale), salvo l'immagine modificata e provo a visualizzarla...tutto ok! L'immagine non presenta alterazioni visibili. :)


Se faccio l'operazione inversa:
$ echo "6369616f206d6f6e646f2120556666612073656d70726520717565737461
20636f6d65206672617365206573656d70696f203a290a" xxd -r -p
ciao mondo! Uffa sempre questa come frase esempio :)


Quindi ho pensato di automatizzare il procedimento di steganografia ed è nato bsteg.sh che riporto qui:



#!/bin/bash
# BrutalStego - by Nanni Bassetti - http://www.nannibassetti.com -
nannib@libero.it
# a simple steganographic tool for Linux
echo "Insert the message to hide:"
read ms

echo "Insert the file where to hide:"
read fl
echo "Insert the file name of the new file:"
read nfl
echo $ms | xxd -p>steg.bin
len=$(wc -c steg.bin)
dd if=$fl of=temp1.jpg bs=1c count=11
dd if=$fl of=temp2.jpg bs=1c skip=11
cat temp1.jpg steg.bin temp2.jpg > $nfl
len=$(wc -c steg.bin|awk '{print $1 }')
echo "Mesg lenght: "$len" for revealing the hidden message you have to cut from 11 to "$len
echo "dd if="$nfl" bs=1c skip=11 count="$len" | xxd -r -p"
rm temp1.jpg
rm temp2.jpg
rm steg.bin
echo " "
echo " -------------------------- "
echo " "
dd if=$nfl bs=1c skip=11 count=$len status=noxfer | xxd -r -p


Lo script funziona così:
1) Chiede il messaggio da nascondere
2) Chiede il nome del file si vuol nascondere il messaggio
3) Chiede il NUOVO nome del file alterato (così da non sovrascirvere l'originale)
4) Crea un file "steg.bin" che contiene il messaggio codificato in esadecimale
5) Calcola la lunghezza del file steg.bin
6) Ritaglia la "testa" del file dove si andrà a nascondere il messaggio, la testa è dal byte 0 al byte 11
7) Ritaglia il resto del file dal byte 11 in poi
8) Concatena e salva nel file nuovo i pezzi: testa + steg.bin + restante_del_file
9) A video ci dice qual'è la lunghezza del messaggio codificato e ci mostra la decodifica, per dimostrare che tutto è andato bene.


Alla fine, a qualcuno basterebbe avere la lunghezza del messaggio codificato es. "112" e sapendo che deve cominciare dal byte 11, con un semplice editor esadecimale o con un dd dovrebbe tagliare la parte da 11 a 112 del file per ottenere il messaggio originale.


Testato su JPG e MP3 e tutto funziona benissimo....chiaramente ci si può sbizzarrire parametrizzando anche il punto di partenza, che non deve essere necessariamente 11.
Un esempio per passare la lunghezza all'amico che dovrà decodificare il messaggio?


"Ciao, ma con tutto il casino che hai combinato ieri dovevamo chiamare il 112? : - D"


Facile no? ;)


FKLook - cerca keyword e copia i file

ecco il mio nuovo nato FKLook trattasi di uno script bash per Linux, che vi permette di cercare le keyword in una directory piena zeppa di file e copiare tutti quelli che la contengono in una directory di vostra scelta, in modo tale da avere un repository di file selezionati in base alla keyword.
Testatelo!
ciao

# /bin/bash/
# File Keywords searching tool by Nanni bassetti http://www.nannibassetti.com - nannib@libero.it
echo "#########################################"
echo "FKLOOK - by Nanni Bassetti http://www.nannibassetti.com - nannib@libero.it"
echo "by this script you can search for a keyword in many files"
echo "and it copies only the files those match with the keyword, in a separated directory you chose"
echo "########################################"
echo " "

echo "Write the output directory where you to save the files (eg. /media/myfiles):"
read outdi
data=$(date | sed 's/ //g' | sed 's/://g' | sed 's/[[:alpha:]]//g')
mkdir $outdi$data
outdir=$outdi$data
echo "This is the directory for your repository: ".$outdir
echo "Write directory contains the files where you want to looking for the keyword:"
read indir
echo "Write the keyword search:"
read key
grep -aR -i $key $indir/*.* > $outdir/filelist.txt
fn="$(cat $outdir/filelist.txt | awk -F ":" '{print $1}'|sed 's/*//')"
cp $indir/$fn $outdir 2>/dev/null
cd $outdir
ls -l