Breve introducción a las SQLITE de Instagram.

Hoy en SeguridadyRedes, tenemos un interesante artículo/tip de Norberto González (@Nicky69es),  Analista de computación digital en telecomunicaciones. Trabajando para las FFCCSE

Hace poco me ha tocado sacar datos sobre unos mensajes enviados/recibidos en Instagram, concretamente determinar si ha existido un envío de un video de esos de duración “1 reproducción” o no.

Había poca o nada información en internet, así que me tuve que buscar la vida, y comparto hasta dónde he llegado.

La información está basada en la extracción de un iPhone. Ya sabemos que las sqlite de Android suelen tener otra estructura/datos/etc; pero como base para no ir demasiado desorientados, supongo que sirve.

Instagram (siempre hablando de OSX en este artículo), tiene un montón de bases de datos, la mayoría son bbdd de cada aplicación con la que interactúa. Pero las interesantes son únicamente dos, o tres, o siete….depende de cuantos usuarios hayan iniciado sesión en ese dispositivo, porque crea una sqlite por cada usuario con el nombre “<id>.sqlite”; y a parte crea una sqlite donde guarda información de las conexiones (esta no la he investigado mucho).

La estructura de la bbdd es la siguiente:

Tiene 8 tablas, si bien la única que he encontrado con contenido es la tabla “messages”, que contiene el chat de instagram, y la tabla “threads” que no he logrado encontrarla sentido, pero contiene mensajes igual que la anteior (quizás de multi-usuarios):

Los campos de la table “Messages”:

Como vemos, son pocos: Id del mensaje, id del hilo, archivo, clase y columna.

Nos centramos en los campos “Thread” y en “archive”.

Threads nos indica el canal de comunicación, como si fuera una sala de chat. Es interesante porque los mensajes guardan el id del usuario que los envía, pero no el id del usuario al que se envía. “Quicir”, que el mensaje enviado por el usuario del dispositivo contiene el id del propio usuario y el hilo al que se envía el mensaje, pero no contiene el id del receptor o receptores del mensaje.

Aquí es donde nos interesa tener en cuenta el thread (hilo) del mensaje enviado, porque los mensajes que nos encontremos con el mismo thread (hilo), pero distinto id de usuario, nos indicarán el/los usuarios que reciben el anterior mensaje.

Archive nos da toda la información del mensaje, demasiada información….

En este caso, el campo contiene un plist binario que hay que exportar con el nombre que corresponda y extensión plist. Abrirlo para su estudio con un editor plist o la herramienta que más os guste.

Algunas keys a tener en cuenta en el plist son el campo “NS.time”. En nuestro caso, el formato está en Apple Cocoa Core Data (segundos desde 01/01/2001).

Otro dato a tener en cuenta y que es localizable a través de la búsqueda en crudo en la bbdd, son varios strings:

El segundo no es habitual, creo que es el identificador del archivo multimedia que envía el usuario del dispotivio.

El primero es el id del mensaje.

El tercero es el número de hilo. Podemos con este número localizar todos los mensajes con la misma persona.

Y el cuarto es el id del usuario QUE ENVIA EL MENSAJE. Con esto, podemos localizar todos los mensajes recibidos de un usuario, tomar nota del hilo o id_mensaje, y extraer el plist.

La key “NSString*senderPk”, en su campo “CF$UID”, cuando el entero es “8”, el mensaje es enviado por el usuario; cuando el entero es “7”, se trata de un mensaje recibido.

Otros “strings” contienen información sobre su contenido o tipo de mensaje, algunos de los que he extraído son:

  • SUBTYPE_VISUAL_MEDIA
  • SUBTYPE_VIDEO
  • SUBTYPE_TEXT
  • SUBTYPE_PHOTO
  • SUBTYPE_STORY
  • SUBTYPE_POST

También son localizables a través de búsquedas en crudo, para conocer por ejemplo cuantos mensajes que contienen fotografías o videos se han enviado/recibido, cuantas historias se han compartido, etc.

En cada uno de los mensajes hay bastante información, links a fotografías de perfiles, links a historias, etc. El único que no tiene links es el SUBTYPE_TEXT, evidentemente.

Sí he encontrado un campo en el SUBTYPE_VIDEO que indicaba cuantas veces se reproducía. No he hecho pruebas, pero quizás identifique los videos de una sola reproducción.

Y para terminar:

La forma a día de hoy de identificar los perfiles de Instagram a través de su id numérica.

Para obtener el id numérico usar la url: https://www.instagram.com/<nick>/?__a=1 , el id está en “profilePage_

Para obtener el nicky de un id, usar la url: https://i.instagram.com/api/v1/users/<id numerico>/info/

Espero que os sirva y que podáis avanzar más, y sobre todo compartir…….

—-

Un artículo de:

Norberto González.

(@Nicky69es),  Analista de computación digital en telecomunicaciones. Trabajando para las FFCCSE

 

Esta entrada fue publicada en Auditoría, DFIR, Seguridad y redes y etiquetada , , , . Guarda el enlace permanente.

Deja un comentario