18 mayo 2011

El verano pasado me tocó hacer un análisis forense de un móvil iphone. Uno de esos trabajos que conociendo la historia no quieres hacer, pero no te queda más remedio.

El resultado del trabajo fue muy claro y el objetivo se cumplió: algunos SMS recuperados, agenda y otras evidencias que fueron sobradamente contundentes como para hacer un informe donde no cupieran dudas. 

Con el paso del tiempo y los nuevos avances cuando leo novedades vuelvo a mirar aquella copia de datos y únicamente como ejercicio práctico intento averiguar sucesos nuevos que me hubiesen ayudado en aquel momento. Respuesta a algunas preguntas que aún están sin despejar pese a que el juicio ya se ha celebrado.

Hace unos días me encontré iPhone Backup Analyzer, el resultado del estudio de investigación de Mario Piccinelli. Una aplicación libre desarrollada en Python que analiza la copia de seguridad de un iPhone.

La herramienta ofrece un interfaz en Tk que permite navegar entre los archivos instalados. En su momento se me escapó, por ejemplo, las últimas direcciones introducidas en el GPS que ofrece Movistar. No es que estuviera demasiado escondido, de hecho, es otro archivo sqlite como los demás. Imagino que aquí influyó que tarde un par de horas en obtener resultados (excusa de desarrollador).



Otra característica a la que nos tiene acostumbrados el software de forense para móviles, es el análisis de contactos, sms, histórico de llamadas, marcadores de Safari, etcétera.


Por último, averigüé que no solo los iPhone 4 registraban las localizaciones tal y como había entendido. También cualquier otro dispositivo con iOS4, como el iPhone 3GS, genera el archivo "consolidated.db" o "4096c9ec676f2847dc283405900e284a7c815836". Esto me ha aportado bastante luz. Usando los scripts de Juanito para WiFi y triangulación de celdas, he sacado un mapa muy completo. En el caso de versiones anteriores, este archivo cambia de formato, siendo un "plist" y solo se puede obtener si el iPhone tiene jailbreak en la ruta: "/private/var/root/Library/Caches/locationd/cells.plist"

Para ampliar un poco la funcionalidad, he cambiado el contenido de los iconos, añadiendo la fecha de la detección. El resultado fue un mapa con justo lo que buscaba: evidencia de los lugares en los que había estado en determinadas fechas, incluido el día 9 de Julio: Vallecas, Vicalvaro, Leganes, Loranca, Rivas, etc. Las horas también han sido interesantes, ya que implica que los hechos no sólo ocurrían al medio día. Si no también después de las 19:00, lo que implica a un menor.



El script (al que realmente he añadido 4 líneas) para WiFi:

#Horrible Script para extraer las coordenadas WIFI junto con su MAC del fichero Consolidated.db
#El fichero se encuentra en el directorio private/var/root/Library/Caches/locationd
#Horriblemente codeado por Silverhack
import sys, sqlite3
from PyMaps import Map, PyMap
from datetime import datetime
# Creamos un mapa
NewMap = Map()
NewMap.zoom = 3
connection = sqlite3.connect("consolidated.db")
cursor=connection.cursor()
cursor.execute("SELECT MAC, Latitude, Longitude, timestamp from WifiLocation")
for row in cursor:
 

     # Latitud y longitud
     # Importamos de la BD consolidated a las variables
     # que posteriormente pasaremos al Script PyMaps

 mac= str(row[0])
 latitud= str(row[1])
 longitud = str(row[2])

  # Insertamos codigo html
 pointhtml = str(row[0])
 appledate = row[3]
 tstamp = appledate + 978307200
 tstamp = str(datetime.fromtimestamp(int(tstamp)))
 content = tstamp + " " + mac

# print "La MAC es %s, La latitud es %s, y la longitud es %s el dia %s" % (mac,latitud,longitud,tstamp)
     # Anyadimos el punto al mapa
 point = (latitud, longitud, content)

 NewMap.setpoint(point)
 gmap = PyMap(key="clave", maplist=[NewMap])

 mapcode = gmap.pymapjs()
showhtml = gmap.showhtml()
print showhtml
file = open('WiFi.html', 'w')
file.writelines(showhtml)
# Cerramos el fichero
file.close()

El otro script:
#Horrible Script para extraer las coordenadas del fichero Consolidated.db
#El fichero se encuentra en el directorio private/var/root/Library/Caches/locationd
#Horriblemente codeado por Silverhack
import sys, sqlite3
from PyMaps import Map, PyMap
from datetime import datetime
# Creamos un mapa
NewMap = Map()
NewMap.zoom = 3
connection = sqlite3.connect("consolidated.db")
cursor=connection.cursor()
cursor.execute("SELECT Latitude,Longitude,timestamp from CellLocation")
for row in cursor:
     # Latitud y longitud
     # Importamos de la BD consolidated a las variables
     # que posteriormente pasaremos al Script PyMaps

 latitud= str(row[0])
 longitud = str(row[1])
 appledate = row[2]
 tstamp = appledate + 978307200
 tstamp = str(datetime.fromtimestamp(int(tstamp)))
# print "La latitud es %s, y la longitud es %s el dia %s" % (str(row[0]),str(row[1]),str(tstamp))

  # Insertamos codigo html
 pointhtml = tstamp

     # Anyadimos el punto al mapa
 point = (latitud, longitud, pointhtml)

 NewMap.setpoint(point)
 gmap = PyMap(key="clave", maplist=[NewMap])

 mapcode = gmap.pymapjs()
showhtml = gmap.showhtml()
print showhtml
file = open('Coordenadas.html', 'w')
file.writelines(showhtml)
# Cerramos el fichero
file.close()

6 comments :

Madrikeka dijo...

Ya en serio, tengo que volver a aprender a programar....para entender perfectamente todo lo que nos pones, aunque tengo que decir que tus scripts son super claros!! 

Pedro Sanchez dijo...

Alex, ¿en que versión exactamente?, las ultimas adquisiciones que me están llegando ya no vienen.

Silverhack dijo...

#Alejandro
Eres una puta máquina tío!!
#Pedro Sánchez
En la versión 4.3.3 se soluciona el fallo, así que mira la versión!
http://support.apple.com/kb/DL1358

Saludos! 

Alejandro Ramos dijo...

Ehm. fail. Era un iPhone3GS con IOS4.0. El consolidated.db en el acaso de IOS3 es un .plist localizado en  "/root/Library/caches/locationd/h-cells.plist", Solo accesible si hay jailbreak. De eso es el siguiente post.

Actualizo la entrada con el tema.

Alejandro Ramos dijo...

Imagino que Pedro se refiere a nuevos "viejos" móviles que le toca analizar. He cambiado la entrada con el tema y ya publicaré sobre el parseo del plist la próxima semana.

Btw, buen trabajo con el script, mucho mejor que lo que había de calor. Aunque he pensado en otra mejora, eliminar puntos repetidos muy cercanos que ocurren exactamente a la misma hora/minuto/segundo y pintarlos como zona. 

Anónimo dijo...

Muy bueno! El ponerte a tocar scripts de otros no es tarea fácil y le has añadido funciones muy útiles, como lo de sacar la hora, que trabajo te habrá dado!