Solucion al reto 18 "un pendrive y el caso de los coches robados"

Ante todo daros las gracias por lo bien que lo he pasado leyendo vuestros reportes en referencia a la solución del reto, ha habido de todo un poco... rápidas, acertadas, menos acertadas..."ha estao guay!!".

Como podréis haber visto la solución en cuestión no era nada difícil... y hemos querido darle aires de realidad enfrentándonos al problema desde un enfoque práctico y sencillo... pero os prometo que el próximo será más complicado.

Como acostumbramos veremos la manera más automática y rápida de hacerlo y la menos automática o, digamos, más artesanal.

Para resolver la ecuación tan solo teníamos la imagen iso de un pendrive, lo cual nos dejaba más o menos el camino claro y unas pocas incógnitas.

Deberíamos ver qué sistema de archivos era y luego montarlo... y si pensamos un poco más allá quizás recuperar archivos, etc, etc...

Es ahí donde llega nuestra primera decisión: pensar en una herramienta que nos dé todo en este tipo de problemas, es decir, el camino más corto que sería tirar de tool especializada o, como ya veremos, hacerlo más a pelo como a mí más me gusta.

Primera solución:

Creo que a estas alturas a la mente de todos nos llega AUTOPSY...
 
Autopsy es un frontal Web que permite realizar operaciones de análisis forense sirviendo como interfaz gráfico del popular juego de herramientas forenses The Sleuth Kit (TSK). TSK es un referente en el mundo del análisis forense mediante línea de comandos, y permite a los investigadores lanzar auditorías forenses no intrusivas en los sistemas a investigar. 

El programa Autopsy corre en diversos sistemas operativos como Linux, Unix y hasta en el sistema operativo Microsoft y por supuesto es LIBRE... así que ¡vamos a usarlo!  (alguno de vosotros ha tirado de otra herramienta auxiliar para montar la imagen, aunque no es necesario en nuestro caso porque Autopsy lo hace por sí solo)

http://sleuthkit.org/autopsy/v2/download.php

Para instalar Autopsy lo podemos hacer como queramos desde los repos, bajándolo y compilando, etc, etc.

#autopsy

Cuando arrancamos la aplicación... tendremos que conectar con el frontend:

http://localhost:9999/autopsy

la secuencia es la siguiente 'open case', 'new case' (rellenamos con el nombre del caso, detalles y nombre del agente o investigador), 'new case' (para confirmar), 'ad host' (datos del host para diferenciarlo de otros casos), 'add host' para confirmar... hasta aquí mera burocracia....

Ahora añadiremos la imagen del pendrive en cuestión, cargándola como partición, 'Symlink' y le daremos a 'next': 
 

Ignoraremos el hash (no es necesario en esta ocasión, aunque podría haberlo sido), punto de montaje C: y sistema de archivos fat32.

Como hemos visto Autopsy ha detectado que clase de sistema de archivos era. Aplicaremos los cambios dándole a 'next' y nos aparece la siguiente pantalla:



Procederemos a analizar la imagen "ANALIZE" y posteriormente haremos un análisis de ficheros:



Lo cual nos llevará a una pantalla donde podremos recuperar los archivos previamente borrados:



Tras recuperar los archivos pasaremos a su examen..

Como podemos ver tenemos un archivo png y tres .cap mucha gente a optado por recuperar los .cap y examinarlos con otro programa como por ejemplo Wireshark, pero esto también lo podemos hacer directamente con Autopsy...

En nuestro primer examen a los archivos .cap nos encontramos con la siguiente pista:



Como vemos en un mail dirigido a un tal Carlo: 

"Que pasa tio? 
Te mando nuestro pequeño secreto "KNIFELONG1234" 
bye 
ya me pondre en contacto 
un saludo yuri"
  
Siguiendo con el examen de los .cap no damos con más información relevante, así que es hora de pasar al otro archivo encontrado: 'rubiaca.png'. Para ello directamente con Autopsy haremos una copia del archivo a nuestro disco para su posterior análisis.

Haciendo una primera exploración el archivo parece ser un png normal y corriente pero veamos qué pasa si le "preguntamos" más...

Sospechando sabiamente que esta rubia esconde algo más que sus pechos, vamos hacer pasar un primer filtro que aunque, poco ortodoxo, si me ha sido de ayuda en muchos casos. Echaremos un vistazo rápido a las cadenas de caracteres que contiene el archivo... con strings:

#strings rubiaca.png

)@fW
!c*l(`
g#+cY@
k|R)]
,Dn$6
kl=a2z
cL4W
c4qO
$2
Zq98
6/\b
W(R&
"oUA
feD,
N~,,i
8&@VF6
'UW?-q9
J\Gh
78RNC
R>QP
Y;(In

autopsy.jpeg

 
¡¡¡Pero qué demonios: autopsy.jpg!!! Veamos qué es esto sometemos el archivo a un editor hexadecimal buscando esa cadena de texto que nos hace sospechar.



Ok, eso no debería estar ahí en un png normal. Algo huele a que están ocultando algo en este png, veamos si puede ser un fichero zip:


En efecto lo que sospechábamos... Llegados a este punto hay varias formas de extraer el archivo, pero quizás la mas ilustrativa sea simplemente renombrarlo.

cp rubiaca.png rubiaca.zip

Para nuestra sorpresa al intentar abrirla nos pide un password. Qué tal si probamos con el pequeño secreto que antes vimos cuando husmeábamos en los .cap KNIFELONG (sin los números).

Voilá!!! nos da como resultado de la descompresión una bonita imagen de los coches robados......



Parece plausible que el delincuente o un colega tomase la foto con su terminal, no habrán sido tan... pues veamos qué información podemos "arrancarle" a la foto tirando de metadatos...



Tan solo nos falta pasar esa dirección a Google y ¡¡¡bingo!!!

Damos con el paradero de los coches robados:

AVENIDA de la costa 10-11 MONACO 

Unos garajes muy coquetos al igual que sospechosos:



Segunda solución

Veo oportuno publicar el siguiente reporte de la solución porque creo que como en todo hay mil formas de hacer las cosas y esta es una de las que más me sorprendió.

Aun siendo todas las soluciones válidas, de esta podemos aprender algo todos...

La solución en cuestión viene de la mano de Bruno Heras y sin más dilación aquí os la adjunto:

HackPlayers - Reto #18
Write Up - Bruno Heras - b0nk
-----------------------------


Bueno, para la resolución del reto, estos son los pasos que he seguido:

1. Descarga del archivo de imagen y primer análisis
===================================================

Primero he procedido a descargar el archivo y ejecutar "file" con tal de comprobar el tipo de sistema de ficheros que contenía:

% file image.iso
image.iso: x86 boot sector, mkdosfs boot message display, code offset 0x58, OEM-ID " mkdosfs", Media descriptor 0xf8, heads 125, sectors 102400 (volumes > 32 MB) , FAT (32 bit), sectors/FAT 788, serial number 0xc9694824, label: "           "

 

Acto seguido, he montado la imagen:

% hdiutil mount image.iso
/dev/disk1                                              /Volumes/Untitled


Al comprobar qué había, tan sólo encontré el directorio ".Trash-1000", totalmente vacío:

./.Trash-1000:
total 5
1 drwxrwxrwx  1 srm  staff   512 13 ago 03:32 .
1 drwxrwxrwx@ 1 srm  staff   512 16 ago 23:48 ..
1 drwxrwxrwx  1 srm  staff   512 13 ago 03:32 files
2 drwxrwxrwx  1 srm  staff  1024 13 ago 03:32 info

./.Trash-1000/files:
total 2
1 drwxrwxrwx  1 srm  staff  512 13 ago 03:32 .
1 drwxrwxrwx  1 srm  staff  512 13 ago 03:32 ..

./.Trash-1000/info:
total 3
2 drwxrwxrwx  1 srm  staff  1024 13 ago 03:32 .
1 drwxrwxrwx  1 srm  staff   512 13 ago 03:32 ..


Así que desmonté el volumen:

% hdiutil unmount /Volumes/Untitled
"/Volumes/Untitled" unmounted successfully.


2. Segundo análisis
===================

En este segundo análisis, eché mano de The Sleuth Kit con tal de analizar el volumen más a fondo. Una primera pasada, me mostró lo siguiente:

% fls -a -d -f fat -u -p -r image.iso

r/r * 4:  captura1.pcap
r/r * 6:  captura2.cap
r/r * 8:  captura3.cap
r/r * 10: rubiaca.png
d/d 12: .Trash-1000
d/d 12: .Trash-1000/.
d/d 2:  .Trash-1000/..
d/d 205014: .Trash-1000/info
d/d 205014: .Trash-1000/info/.
d/d 12: .Trash-1000/info/..
r/r * 205031: .Trash-1000/info/captura1.pcap.trashinfo
r/r * 205034: .Trash-1000/info/captura2.cap.trashinfo
r/r * 205037: .Trash-1000/info/captura3.cap.trashinfo
r/r * 205040: .Trash-1000/info/rubiaca.png.trashinfo
r/r * 205108: .Trash-1000/info/rubiaca.png.trashinfo.YBMO1W
d/d 205016: .Trash-1000/files
d/d 205016: .Trash-1000/files/.
d/d 12: .Trash-1000/files/..
r/r * 205046: .Trash-1000/files/captura1.pcap
r/r * 205048: .Trash-1000/files/captura2.cap
r/r * 205050: .Trash-1000/files/captura3.cap
r/r * 205052: .Trash-1000/files/rubiaca.png
v/v 1612675:  $MBR
v/v 1612676:  $FAT1
v/v 1612677:  $FAT2
d/d 1612678:  $OrphanFiles
-/d * 212230: $OrphanFiles/INFO
-/d * 212232: $OrphanFiles/FILES
-/r * 212359: $OrphanFiles/_APTUR~1.TRA
-/r * 212362: $OrphanFiles/_APTUR~2.TRA
-/r * 212365: $OrphanFiles/_APTUR~3.TRA
-/r * 212368: $OrphanFiles/_UBIAC~1.TRA
-/r * 212372: $OrphanFiles/_UBIAC~1.N8H
-/r * 212486: $OrphanFiles/_APTUR~1.PCA
-/r * 212488: $OrphanFiles/_APTURA2.CAP
-/r * 212490: $OrphanFiles/_APTURA3.CAP
-/r * 212492: $OrphanFiles/_UBIACA.PNG
-/r * 220816: $OrphanFiles/_~1.TRA
-/r * 220817: $OrphanFiles/_est.tmp
-/d * 220819: $OrphanFiles/TRASHE~1
-/d * 220821: $OrphanFiles/_SEVEN~1
-/d * 220827: $OrphanFiles/SPOTLI~1
-/r * 220830: $OrphanFiles/_DTUNE~1.EXE
-/d * 220832: $OrphanFiles/_SOLINUX
-/r * 220835: $OrphanFiles/_OTION~1.AVI
-/r * 220838: $OrphanFiles/_HDTUN~1.EXE
-/d * 220840: $OrphanFiles/_RESEED
-/r * 220842: $OrphanFiles/_BNPATHL.TXT
-/r * 220845: $OrphanFiles/_EADME~1.DIS
-/r * 220849: $OrphanFiles/_BUNTU
-/r * 232196: $OrphanFiles/_MP2CM~2.IDX
-/r * 232197: $OrphanFiles/_MP1CM~1.NEW
-/r * 232202: $OrphanFiles/_MP1CM~1.IDX
-/r * 232207: $OrphanFiles/_MP1CM~2.IDX
-/r * 232211: $OrphanFiles/_MP0CM~1.IDX
-/r * 232216: $OrphanFiles/_MP0CM~2.IDX
-/d * 939142: $OrphanFiles/STORE-V2
-/d * 939144: $OrphanFiles/STORE-V1
-/r * 939147: $OrphanFiles/VOLUME~1.PLI
-/d * 939272: $OrphanFiles/68870F~1
-/r * 939399: $OrphanFiles/VOLUME~1.PLI
-/d * 939783: $OrphanFiles/JOURNA~1.REP
-/r * 939784: $OrphanFiles/psid.db
-/r * 939787: $OrphanFiles/TMP~1.SNO
-/r * 939789: $OrphanFiles/0~3.IND
-/r * 939791: $OrphanFiles/LION~1.CRE
-/r * 939793: $OrphanFiles/INDEXS~1
-/r * 939796: $OrphanFiles/0~1.IND
-/r * 939799: $OrphanFiles/0~2.IND
-/r * 939801: $OrphanFiles/0~4.IND
-/r * 939804: $OrphanFiles/0~1.SHA
-/r * 939806: $OrphanFiles/0~5.IND
-/r * 939808: $OrphanFiles/0~6.IND
-/r * 939811: $OrphanFiles/0~1.DIR
-/r * 939815: $OrphanFiles/0DIREC~1.SHA
-/r * 939818: $OrphanFiles/0~2.SHA
-/r * 939821: $OrphanFiles/0~7.IND
-/r * 939824: $OrphanFiles/0~8.IND
-/r * 939827: $OrphanFiles/0~9.IND
-/r * 939829: $OrphanFiles/SHUTDO~1
-/r * 939831: $OrphanFiles/PERMST~1
-/r * 939833: $OrphanFiles/_~9.IND
-/r * 939836: $OrphanFiles/_~1.IND
-/r * 939839: $OrphanFiles/_~8.IND
-/r * 939842: $OrphanFiles/_~2.IND
-/r * 939845: $OrphanFiles/_~2.IND
-/r * 939846: $OrphanFiles/_~1.IND
-/r * 939848: $OrphanFiles/_~3.IND
-/r * 939851: $OrphanFiles/_~1.SHA
-/r * 939853: $OrphanFiles/_~4.IND
-/r * 939855: $OrphanFiles/_~5.IND
-/r * 939858: $OrphanFiles/_MPMER~1.IND
-/r * 939859: $OrphanFiles/_MP2CM~1.SHA
-/r * 939862: $OrphanFiles/_~2.SHA
-/r * 939863: $OrphanFiles/store.db
-/r * 939865: $OrphanFiles/STORE~1.DB
-/r * 939868: $OrphanFiles/REVERS~1
-/r * 939870: $OrphanFiles/LION~1.MOD
-/d * 939872: $OrphanFiles/JOURNA~1.LIV
-/r * 939875: $OrphanFiles/JOURNA~1
-/d * 939877: $OrphanFiles/JOURNA~1.SCA
-/r * 939881: $OrphanFiles/REVERS~1.SHA
-/r * 939884: $OrphanFiles/_~1.IND
-/r * 939886: $OrphanFiles/_~5.IND
-/r * 939889: $OrphanFiles/LIVE0~1.SHA
-/r * 939892: $OrphanFiles/LIVE0~1.IND
-/r * 939895: $OrphanFiles/LIVE0~2.SHA
-/r * 939897: $OrphanFiles/_~4.IND
-/r * 939900: $OrphanFiles/_~1.SHA
-/r * 939904: $OrphanFiles/_DIREC~1.SHA
-/r * 962437: $OrphanFiles/_ournal.1
-/r * 962438: $OrphanFiles/retire.1
-/r * 962565: $OrphanFiles/_ournal.1
-/r * 962566: $OrphanFiles/_ournal.9
-/r * 962567: $OrphanFiles/retire.17
-/r * 966531: $OrphanFiles/_~7.SHA
-/r * 966533: $OrphanFiles/_~3.IND
-/r * 966536: $OrphanFiles/_~1.DIR
-/r * 966538: $OrphanFiles/_~6.IND
-/r * 966542: $OrphanFiles/LIVE0~3.SHA
-/r * 966545: $OrphanFiles/_~5.SHA
-/r * 966548: $OrphanFiles/LIVE0~6.IND
-/r * 966551: $OrphanFiles/LIVE0~1.DIR
-/r * 966555: $OrphanFiles/_DIREC~1.SHA
-/r * 966556: $OrphanFiles/_~3.IND
-/r * 966559: $OrphanFiles/LIVE0~4.SHA
-/r * 966561: $OrphanFiles/STORE~1.UPD
-/r * 966564: $OrphanFiles/REVERS~1.UPD
-/r * 966567: $OrphanFiles/_MPMER~2.IND
-/r * 966570: $OrphanFiles/_MPMER~3.IND
-/r * 966573: $OrphanFiles/_MPMER~4.IND
-/r * 966575: $OrphanFiles/_EMAPP~1
-/r * 966576: $OrphanFiles/_MPMER~5.IND
-/r * 966579: $OrphanFiles/_~8.IND
-/r * 966582: $OrphanFiles/_MPMER~6.IND
-/r * 966585: $OrphanFiles/LIVE0~7.SHA
-/r * 966589: $OrphanFiles/_MPMER~1.SHA
-/r * 966593: $OrphanFiles/LIVE0~2.IND
-/r * 966596: $OrphanFiles/LIVE0~3.IND
-/r * 966599: $OrphanFiles/LIVE0~4.IND
-/r * 966602: $OrphanFiles/LIVE0~9.IND
-/r * 966605: $OrphanFiles/LIVE0~11.IND
-/r * 966607: $OrphanFiles/_MP~5.IND
-/r * 966610: $OrphanFiles/LIVE0~10.IND
-/r * 966613: $OrphanFiles/_MPMER~8.IND
-/r * 966616: $OrphanFiles/LIVE0~5.IND
-/r * 966619: $OrphanFiles/LIVE0~7.IND
-/r * 966622: $OrphanFiles/LIVE0~8.IND
-/r * 966626: $OrphanFiles/LIVE0~5.SHA
-/r * 966630: $OrphanFiles/_MPMER~9.IND
-/r * 966633: $OrphanFiles/_MPME~10.IND
-/r * 966634: $OrphanFiles/_MP2CM~6.IND
-/r * 966635: $OrphanFiles/_DIREC~1.SHA
-/r * 966639: $OrphanFiles/LIVE0~6.SHA
-/r * 966643: $OrphanFiles/LIVE0D~1.SHA
-/r * 966646: $OrphanFiles/_MPME~11.IND
-/r * 966650: $OrphanFiles/_MPMER~1.DIR
-/r * 966654: $OrphanFiles/_MPMER~2.SHA
-/r * 966658: $OrphanFiles/_MPMER~3.SHA

La primera columna corresponde al tipo de archivo, la tercera columna es el inodo y la cuarta hace referencia al nombre del archivo.

Las opciones que pasé son las siguientes:

-a:   Muestra los directorios "." y "..".
-d:   Sólo muestra los elementos eliminados.
-f:   Especifico el sistema de archivos, en este caso, "fat".
-u:   Muestra elementos *no* eliminados.
-p:   Muestra la ruta completa del archivo.
-r:   Recursivo.

Decido guardar la lista:

% fls -a -d -f fat -u -p -r image.iso > lista_archivos.txt

Una vez tengo la lista en mi poder, hago un pequeño script para recuperar los archivos. Para ello hice un pequeño script que recorría la lista obtenida con fls, recuperaba el archivo y generaba el hash md5 correspondiente:


--------- recuperar.sh --------- 

#!/bin/bash
# recuperar.sh
#
# uso: ./recuperar.sh -l|-r  
#       -l:   lista los archivos encontrados basándose en la lista
#       -r:   recupera archivos encontrados y genera md5
# fls -a -d -f fat -u -p -r image.iso

# Listamos archivos a recuperar
function list {
echo "Listando archivos a recuperar..."
echo "--------------------------------"

cat $1 |
while read line; do
  tipo=$(echo "$line" | awk {'print $1'})
  inode=$(echo "$line" | awk {'print $3'})
  inode=${inode%:}
  nombre=$(echo "$line" | awk {'print $4'})

    if [ $tipo == "v/v" ]; then
      nombre=$(echo $line | awk {'print $3'})
      echo "[!] Omitiendo archivo $nombre"
    elif [ $tipo == "d/d" ]; then
      inode=$(echo "$line" | awk {'print $2'})
      inode=${inode%:}
      nombre=$(echo "$line" | awk {'print $3'})
      echo "[D] Se creará directorio $nombre"
    else
      echo "[A] Se recuperará el archivo $nombre"
    fi
done
}

# Recuperamos archivos
function recuperar {
echo "Recuperando archivos..."
echo "-----------------------"

if [ -f "lista.md5" ]; then
  rm lista.md5
fi
        
cat $1 |
  while read line; do
    tipo=$(echo "$line" | awk {'print $1'})
    inode=$(echo "$line" | awk {'print $3'})
    inode=${inode%:}
    nombre=$(echo "$line" | awk {'print $4'})

    if [ $tipo == "v/v" ]; then
      echo "[!] Omitiendo archivo $nombre"
    elif [ $tipo == "d/d" ]; then
      inode=$(echo "$line" | awk {'print $2'})
      inode=${inode%:}
      nombre=$(echo "$line" | awk {'print $3'})
      echo "[D] Recuperando directorio $nombre"
      mkdir "$nombre"
    else
      icat -f fat -r -s $2 "$inode" > "$nombre"
      if [ $? -eq 0 ]; then
        # md5 en OS X, md5sum en Linux
        md5=$(md5 "$nombre" | cut -d\= -f2)
        echo "$nombre - $md5" >> lista.md5
        echo "[A] Recuperando archivo $nombre con md5:$md5"
      else
        echo "[!] Error! No se ha podido recuperar $nombre!"
      fi
    fi
done
}

# Args
case $1 in
  "-l" )
    list $2 $3;;
  "-r" )
    recuperar $2 $3;;
  * )
    echo "Uso: -l|-r  ";;
esac

3. Un primer vistazo a los resultados
=====================================

Los archivos que más llaman la atención son las capturas de tráfico de red y la foto de la rubiaca.

Si abrimos la foto nos vamos a encontrar a la rubiaca en cuestión, en los pcaps vemos un poco de todo. Después de echarles un vistazo por encima, se observa, en el segundo archivo (captura2.cap), el envío de un correo electrónico en texto plano. Para obtener todo el dialógo, podemos utilizar tshark con el siguiente filtro:

---------
% tshark -r captura2.cap -Y "ip.src eq 192.168.1.190 and tcp.port eq 25"
34 109.055673 192.168.1.190 -> 173.194.67.27 TCP 74 45978 > smtp [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=6759518 TSecr=0 WS=64
36 109.100969 192.168.1.190 -> 173.194.67.27 TCP 66 45978 > smtp [ACK] Seq=1 Ack=1 Win=14656 Len=0 TSval=6759530 TSecr=1740062804
38 109.142837 192.168.1.190 -> 173.194.67.27 TCP 66 45978 > smtp [ACK] Seq=1 Ack=52 Win=14656 Len=0 TSval=6759540 TSecr=1740062849
39 109.142959 192.168.1.190 -> 173.194.67.27 SMTP 78 C: EHLO thosi
42 109.188853 192.168.1.190 -> 173.194.67.27 SMTP 103 C: MAIL FROM:
SIZE=411
44 109.229845 192.168.1.190 -> 173.194.67.27 SMTP 93 C: RCPT TO:

47 109.629477 192.168.1.190 -> 173.194.67.27 SMTP 72 C: DATA
50 109.670184 192.168.1.190 -> 173.194.67.27 IMF 480 subject: COCHES, from: YURI@gmail.com\r\n, , Que pasa tio?  , Te mando nuestro peque\303\261o secreto "KNIFELONG1234"  , bye  , ya me pondre en contacto  ,   , un saludo yuri
52 109.731985 192.168.1.190 -> 173.194.67.27 SMTP 72 C: QUIT
53 109.732057 192.168.1.190 -> 173.194.67.27 TCP 66 45978 > smtp [FIN, ACK] Seq=503 Ack=361 Win=15680 Len=0 TSval=6759688 TSecr=1740063439
55 109.772157 192.168.1.190 -> 173.194.67.27 TCP 54 45978 > smtp [RST] Seq=503 Win=0 Len=0
57 109.777856 192.168.1.190 -> 173.194.67.27 TCP 54 45978 > smtp [RST] Seq=503 Win=0 Len=0
59 109.778430 192.168.1.190 -> 173.194.67.27 TCP 54 45978 > smtp [RST] Seq=504 Win=0 Len=0

tshark: The file "captura2.cap" appears to have been cut short in the middle of a packet.
---------


Bueno, ya tenemos algo. El pequeño secreto OMAGAWD!

4. La rubiaca
=============

Después de ojear las capturas de tráfico, me lancé a por la rubia. Si miramos la cabecera del archivo, tiene toda la pinta de ser un PNG normal y corriente:

---------
00000000   89 50 4E 47  0D 0A 1A 0A  00 00 00 0D  49 48 44 52  00 00 00 F0  00 00 01 90  08 02 00 00  00 1F B4 7A  .PNG........IHDR...............z
00000020   2B 00 00 00  09 70 48 59  73 00 00 0B  13 00 00 0B  13 01 00 9A  9C 18 00 00  00 07 74 49  4D 45 07 DD  +....pHYs.................tIME..
00000040   08 0D 01 0E  1F B2 27 7C  01 00 00 00  41 74 45 58  74 43 6F 6D  6D 65 6E 74  00 43 52 45  41 54 4F 52  ......'|....AtEXtComment.CREATOR
00000060   3A 20 67 64  2D 6A 70 65  67 20 76 31  2E 30 20 28  75 73 69 6E  67 20 49 4A  47 20 4A 50  45 47 20 76  : gd-jpeg v1.0 (using IJG JPEG v
00000080   36 32 29 2C  20 71 75 61  6C 69 74 79  20 3D 20 39  30 0A B0 45  58 93 00 00  20 00 49 44  41 54 78 DA  62), quality = 90..EX... .IDATx.
---------

Si seguimos observando el fichero, veremos que en la posición 0x12865 (75877 bytes) acaba la que debería ser la última parte de un fichero PNG según la especificación (http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.IEND), que debería estar vacía. Seguimos mirando y vemos referencias a autopsy.jpeg, exactamente en 0x12883.

Así pues, me da por echarle un ojo al archivo con 7zip:

---------
% 7z l rubiaca.png                                                                                                                   v:⇣  l:0.66 0.79 0.80

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=utf8,Utf16=on,HugeFiles=on,2 CPUs)

Listing archive: rubiaca.png

--
Path = rubiaca.png
Type = zip
Physical Size = 27486
Offset = 75877

   Date      Time    Attr         Size   Compressed  Name
   ------------------- ----- ------------ ------------  ------------------------
   2013-08-13 02:52:20 .....        27537        27342  autopsy.jpeg
   ------------------- ----- ------------ ------------  ------------------------
                                    27537        27342  1 files, 0 folders

---------


Vaya por dios! Podéis ver el offset? Otra pasada...

---------
% 7z l -slt rubiaca.png                                                                                                              v:⇣  l:0.69 0.79 0.80

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=utf8,Utf16=on,HugeFiles=on,2 CPUs)

Listing archive: rubiaca.png

--
Path = rubiaca.png
Type = zip
Physical Size = 27486
Offset = 75877

----------
Path = autopsy.jpeg
Folder = -
Size = 27537
Packed Size = 27342
Modified = 2013-08-13 02:52:20
Created =
Accessed =
Attributes = .....
Encrypted = +
Comment =
CRC =
Method = AES-128 Deflate
Host OS = Unix
Version = 51
---------


Bueno, ya tenemos el offset, la fecha en que se modificó el archivo y sabemos, además, que está cifrado. Hice un pequeño script en python para crear un archivo nuevo a partir del offset indicado:

--------- parte_rubiacas.py ---------


#!/usr/bin/python
# encoding: utf-8

import sys

# Abrimos ambos archivos:
f = open(sys.argv[1], "rw+")
print "[+] Archivo original: ", f.name
f2 = open(sys.argv[2], "arw+b")
print "[+] Archivo a crear: ", f2.name
print "[+] Offset: ", sys.argv[3]

# Nos vamos a la posición indicada
f.seek(int(sys.argv[3]))

# Escribimos el nuevo archivo
for line in f:
  f2.write(line)

# Cerramos ambos archivos
f.close()
f2.close()


------------------
Bien, esto lo ejecutamos tal que así: "./parto_rubiacas.py rubiaca.png rubiaca.zip 75877"

% ./parto_rubiacas.py rubiaca.png rubiaca.zip 75877                                                                                  v:⇣  l:0.64 0.70 0.75
[+] Archivo original:  rubiaca.png
[+] Archivo a crear:  rubiaca.zip
[+] Offset:  75877


Y nos genera el archivo zip, el cual descomprimimos con 7z y comprobamos si el tamaño de autopsy.jpeg es el correcto:

% 7z e rubiaca.zip                                                                                                                   v:⇣  l:1.02 0.82 0.79

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=utf8,Utf16=on,HugeFiles=on,2 CPUs)

Processing archive: rubiaca.zip

Extracting  autopsy.jpeg
Enter password (will not be echoed) :


Everything is Ok

Size:       27537
Compressed: 27547


Nos pide contraseña, así que he utilizado "KNIFELONG", que ha colado sin problemas. El tamaño del archivo descomprimido es el mismo que nos indicaba 7zip cuando hemos dado el primer vistazo.

5. La afoto dentro de la afoto dentro de la...
==============================================

Abrimos la imagen y vemos coches y varias piezas, nada sospechoso. Tiramos exiftags:

---------
% exiftags autopsy.jpeg                                                                                                              v:⇣  l:0.42 0.54 1.06

Camera-Specific Properties:


Image-Specific Properties:

Horizontal Resolution: 1 dp
Vertical Resolution: 1 dp
Latitude:  43� 44' 16
Longitude:  7� 25' 22.3

---------

Si introducimos las coordenadas en google maps, nos vamos a mónaco, lo que parece ser un garaje:

https://maps.google.com/maps?q=%2B43%C2%B0+44%27+16.00%22,+7%C2%B0+25%27+22.30%22&um=1&ie=UTF-8&sa=N&tab=wl

Si echamos un vistazo a las capturas de tráfico y al resto de archivos huérfanos que hemos rescatado anteriormente, veremos que hay muchas peticiones a una web de alquiler y renting de vehículos de alta gama, por lo que todo apunta a que esta gente alquilaba los coches y ya no los devolvía, o simplemente lo utilizaba para consultar los modelos y robarlos directamente "a pelo" en la calle.

En cualquier caso los hacían desaparecer del mapa, en el edificio con 3 puertas de garaje en Mónaco, porque ahí no daban la nota los cochecillos del estilo.

Agradecimientos y ganadores

Como siempre daros las gracias a todos aquellos que os hayais esforzado en trabajar y resolver el reto, con especial mención a los ganadores que han conseguido el honor de permanecer en nuestro hall de la fama para la eternidad.

¡Hasta el próximo reto!

6 comentarios :

  1. Sin desperdicio, esa segunda solucion me gusto bastante, el tipo es hard way xD Muy didactica la verdad.

    Saludos.

    ResponderEliminar
  2. Muy recientemente descubri tu blog y tengo que decir que me lo he leido practicamente entero, muy buenos articulos, de una calidad buena respecto a argumento, exposición y actualidad.

    Un 10, por cierto estoy con Neutron respecto a la solución ademas muy bien resuelta, lástima que la ley antes de intentar yo mismo el reto, intentare estar pendiente del siguiente, lo dicho, felicidades por el blog.

    ResponderEliminar
  3. Seguramente llegue tarde. Me gustaría saber porque induce a pensar que hay un zip escondido en rubiaca.png. Gracias por crear estos retos.

    ResponderEliminar
  4. donde bajo la imagen para realizar el reto?

    ResponderEliminar
    Respuestas
    1. https://mega.co.nz/#!DB9QXCAY!amntT3h21JbqKyu6Q1but1KAeJtR2Mvrug0NrCLuvdU

      Eliminar