viernes, febrero 22, 2019

Cómo ubicar fotos en un mapa a partir de sus metadatos

Es impresionante la cantidad de fotografías que tomamos hoy en día con nuestros teléfonos móviles. Casi se puede decir que toda la vida la documentamos con nuestras imágenes. Algunas compartiéndolas en redes sociales y otras simplemente almacenándolas en el terminal o en la nube. Y desde hace mucho años hablamos de los Metadatos que estás contienen y de los posibles riesgos que conllevan si se hacen públicos.

Figura 1: Cómo ubicar fotos en un mapa a partir de sus metadatos

Esta información también ha sido usada en muchos de los Análisis Forenses Informáticos, como el ejemplo del escote de la novia del defacer en la recopilación que se hizo en el 2012. Incluso para el desarrollo de herramientas que permitan determinar el robo de las cámaras o celulares como Stolen Camara Finder, si siguen siendo usadas y las imágenes cargadas en Internet. Hoy en día en cualquier Análisis Forense Pericial es una pieza fundamental de la información que se extrae. Podéis ver alguna de las charlas de Chema Alonso sobre este tema.


Figura 2: Metadata Security 

Esa información que esta dentro de los metadatos de las imágenes, es conocida como EXIF (Exchangeable Image File Format), que es un estándar creado en los años noventa por una empresa japonesa con el objetivo de que los archivos JPEG almacenaran las configuraciones usadas por los fotógrafos al momento de realizar la toma, creando etiquetas para guardar las diferentes informaciones de la configuración.

Figura 3: Tabla con metadatos de ubicación GPS

En el caso de la ubicación se crearon treinta y una etiquetas diferentes que contienen toda la información posible con relación a la geoposición, siendo desde 2004, usado normalmente en todos los dispositivos fotográficos. Para ver el detalle de los GPSTags toca tener en cuenta la tabla de la Figura 3.

Figura 4: Metadatos GPS en Metashield Clean-Up Online

Que son los mismos que se visualizan cuando analizamos una imagen con el producto de ElevenPaths Metashield Clean-Up, tal y como se puede ver en la Figura 4.

¿Cómo podemos ubicar las fotografías en un mapa?

Cuando en el proceso solo tienes una fotografía, es muy simple tomar los valores y colocarlos en maps.google.com, pero si en un investigación o simplemente por curiosidad tomas todas las fotos que tengas en un equipo en el que estés haciendo un peritaje forense judicial y quieres localizarlas todas en un mapa, ya no es tan simple.

Figura 5: Libro de Técnicas de Análisis Forense informático
para Peritos Judiciales profesionales

Lo primero que toca hacer es entender cómo se almacena la información de latitud y longitud en los campos de GPS Tags, para lo que en nuestro tan querido por lo pentesters lenguaje Python existe la librería PIL que permite el manejo de imágenes con una gran cantidad de módulos. Uno específicamente para los datos EXIF, denominado ExifTags.  Con el que se busca específicamente el Tag llamado GPSinfo, que en Python es un diccionario creado con las claves que marca el estándar. Como se puede ver en el siguiente ejemplo.

Figura 6: Accediendo a GPSinfo

Revisando la tabla de la Figura 3, podemos ver qué significa cada campo. Y es en los campos 2 y 4 donde tenemos la información de Latitud y Longitud, respectivamente. Representados en una tupla de 3 campos, donde cada campo es una lista de 2 objetos. Estos datos nos dan Latitud, Minutos y Segundos, respectivamente en cada lista. Teniendo en cuenta que el segundo valor de la lista es la precisión de cada dato. Así que para transformarlos en un valor que se pueda buscar en un mapa, se debe aplicar la siguiente formula para cada campo
  • Latitud = primer campo de la tupla*precisión en ese campo de la tupla
  • Minutos = Segundo campo de la tupa / 60 * precisión en ese campo de la tupla
  • Segundos = Tercer campo de la tupla / 3600 * precisión en ese campo de la tupla
Para el ejemplo que estamos haciendo, sería:
  • Latitud = 33*1
  • Minutos = 26 / (60*1)
  • Segundos = 163327 / (3600*10000)
Y calculados sobre este ejemplo concreto que estamos viendo, el resultado es el que se puede ver en la imagen siguiente.

Figura 7: Latitud y Longitud calculados a partir de los campos 2 y 4

Ya se tienen los valores, solo falta tener en cuenta la referencia de ubicación, o sea si es Norte o Sur para la Latitud y si es Oeste o Este para la Longitud. Esto nos da el signo a usar. Si es Sur la Latitud es negativa y si es Este la Longitud es negativa, por lo que para nuestro ejemplo quedaría así:

Figura 8: Ajustadas las referencias

Si tenemos muchas fotografías y queremos ubicarlas todas en el map, debemos hacer este proceso con cada una de las imágenes, para lograr tener todas las ubicaciones y poder mostrarlas en un mapa con marcas usando, por ejemplo, la API de Google. Para usarla se requiere obtener una API Key aquí.

Figura 9: Resultado de ubicaciones mostradas en maps.google.com

Para hacerme más fácil todo este proceso, cree en Python un pequeño script al que llamé GPSpicture que esta disponible en GitHub, por si a alguien le viene bien en alguna investigación o simplemente por curiosidad quieran localizar en el mapa todas las imágenes cuya versión de EXIF sea 2.2 y contengan los datos de localización.

Figura 10: GPSPicture en GitHub

Autor: Diego Samuel Espitia Montengro (@dsespitia) CSA de ElevenPaths en Colombia

2 comentarios:

  1. Buenos días Daniel,

    ¿sabrías por qué puede ser que al usar el script me diga que no jpg file contains location data?

    La imagen con la que estoy trasteando tiene datos EXIF 2.2 y lo hago así:

    python3 gps_picture.py -T marker imagen.jpg


    Un saludo.

    ResponderEliminar
  2. El sistema valida que este la marca de GPSinfo y que contenga los valores del 1 al 4 del diccionario, si no tiene alguno o niguno de estos es cuado muestra el resutado que te esta dando. Por lo tanto, puedes estas usando EXIF 2.2 pero si no tiene e sos datos te dice que no tiene datos de localización.

    Si le agregaste la localización, con algún otro mecanismo posterior a la toma de la foto, estos quedan en campos diferentes y por esto el script no los detecta.

    ResponderEliminar