Septiembre 16, 2014, 02:26:03 pm

Autor Tema: Forense automatizado a un whatsapp  (Leído 1577 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Sanko

  • Gran Colaborador
  • *
  • Mensajes: 598
  • Puntos 0
  • ¿Puedes?
    • Ver Perfil
    • Underc0de
Forense automatizado a un whatsapp
« en: Mayo 13, 2013, 05:58:17 pm »


Buenas a todos, ya hace un tiempo que no escribo algún que otro articulo y hoy aburrido hablando con unos amigos por whatsapp me quedo la duda de si whatsapp guardaba los logs de todo lo que hicíera y efectivamente whatsapp lo hacia.

Viendo la de cositas que se estaban guardando :
      - Conversaciones de tlfn a tlfn
      - Chats activos
      - Fotos de los perfiles que mire
      - Imágenes, audios, videos que me pasarón o que pase

      (Por ejemplo).

Pues me apetecio hacerle un forense y al tiempo que lo hago os haré una demo del forense a un whatsapp y vereís todos los datos que podemos sacar de utilidad.

Recrearemos un entorno en el que dispongo de acceso físico a un terminal.
El whatsapp es una buena forma de extraer información sobre el día día de la persona, se podría aplicar algo como "Dime con quien andas y te diré quien eres" pero convertido al método geek.


Empezamos con la DEMO :

Bueno, los ficheros de whatsapp se guardan por defecto en /storage/sdcard0/WhatsApp/ , y yo me enviaré los ficheros con Airdroid, una estupenda app para compartir archivos PC - Smartphone vía wifi.




Para pasar a estar conectados en "Modo de conexión remota" como ahí podeís ver solo hay que acceder a You are not allowed to view links. Register or Login
y te logueas con tu cuenta.




Y tan solo te queda acceder al directorio y descargar los arhivos de los que extraeremos los metadatos.



Una vez descargados los ficheros voy a proceder a comentaros que podemos encontrar en cada uno de los directorios y cómo podríamos extraerles el jugo.

Tenemos "Databases", "Media" y "Profile Pictures", he hecho un script para que extraiga los metadatos de los db.crypt, tambien extrae los ficheros de la carpeta media(imágenes, audios, videos) y tambien extrae las imágenes encontradas en Profile Pictures.

Databases : Aqui podremos encontrarnos una serie de ficheros con extensión "db.crypt", Whatsapp cifra los archivos SQLite con AES pero siempre usa la misma key "346a23652a46392b4d73257c67317e352e3372482177652c" y de este modo podré decodificarlos.

Media : Aqui nos encontramos con una seríe de archivos (imágenes, audios, videos y wallpapers).

Profile Pictures : Aqui nos encontraremos con todas las imágenes de perfil(de usuario) que hemos mirado desde nuestro whatsapp.


NOTA IMPORTANTE : Para extraer la información de todos estos archivos que hemos obtenido he codeado un script que automatiza todo el proceso (a excepción del proceso de obtención de los ficheros , puesto que se supone que tenemos acceso físico al terminal.)




Ahora os mostraré un esquema en forma de arbol para comprender un poco como funciona el script que he preparado:

· WhatsApp Metadata Extractor :
       - main_manage.py (main de consola en forma de cliente)
       - DB_Extractor.py (extrae los metadatos de la BD)
       - metaimg_extractor.py (extrae los metadatos de los .jpg encontrados)


He dividido el proyecto en 3 scripts, main_manage es el encargado de interactuar con el cliente (el que debemos ejecutar), DB_Extractor es el encargado de realizar las consultas con la BD para extraer toda la información(la que nos interesa) y metaimg_extractor es el encargado de buscar en "Media" y en "Profile Pictures" en busca de metadatos en los archivos .jpg (La mayoria vienen con ellos eliminados por defecto pero no me digas por qué algunas imágenes no se filtran y son subidas sin filtrarse).


Sin más os dejo los codes :

main_manage.py :
Código: Python
  1. # -*- coding: utf-8 *-*
  2. import DB_Extractor, metaimg_extractor
  3.  
  4. class WhatsApp_Extractor():
  5.  
  6.     def __init__(self):
  7.         self.__opt()
  8.  
  9.     def __opt(self):
  10.         #Uncomment the OPTION that you want to use
  11.  
  12.         #self.__opt1()  #-> DB METADATA EXTRACTOR
  13.         self.__opt2()  #-> IMG METADATA EXTRACTOR
  14.         #self.__opt3()  #-> BOTH, OPT1 AND OPT2
  15.  
  16.     def __opt1(self):
  17.         print "DB METADATA"
  18.         print "------------"
  19.         DB_Extractor.DB_Extractor()
  20.         print "------------"
  21.  
  22.     def __opt2(self):
  23.         print "IMG META"
  24.         print "------------"
  25.         metaimg_extractor.IMG_Meta()
  26.         print "------------"
  27.  
  28.     def __opt3(self):
  29.         print "DB METADATA"
  30.         print "------------"
  31.         DB_Extractor.DB_Extractor()
  32.         print "------------"
  33.         print "\nIMG META"
  34.         print "------------"
  35.         metaimg_extractor.IMG_Meta()
  36.         print "------------"
  37.  
  38. WhatsApp_Extractor()
[/spoiler]


DB_Extractor.py :
[spoiler]
Código: Python
  1. # -*- coding: utf-8 *-*
  2. #Script to extract the metadata from the WhatsApp crypted DB
  3.  
  4. import sqlite3
  5. from Crypto.Cipher import AES
  6.  
  7. class DB_Extractor():
  8.  
  9.     def __init__(self):
  10.         self._manage_do()
  11.  
  12.     def _manage_do(self):
  13.         try:
  14.             self.__DB_Breaker('msgstore.db.crypt')
  15.             self.__DB_conn()
  16.             self.__SQL_Consulter()
  17.             #Log exporter
  18.         except:
  19.             print "Error starting the script"
  20.  
  21.     def __DB_Breaker(self, DBPath):
  22.         self.DBPath = DBPath
  23.         #breaking the hash
  24.         f = open(self.DBPath, 'rb')
  25.         key = "346a23652a46392b4d73257c67317e352e3372482177652c"
  26.         #triying to break the hash
  27.         try:
  28.             key = key.decode('hex')
  29.             cipher = AES.new(key, 1)
  30.             decoded = cipher.decrypt(f.read())
  31.             #Saving into a new db file
  32.             try:
  33.                 decoded_DB = open('metadb.db', 'wb')
  34.                 decoded_DB.write(decoded)
  35.                 decoded_DB.close()
  36.                 print "metadb.db has been created in the same directory"
  37.             except:
  38.                 print "An error has ocurred creating the decoded DB"
  39.         except:
  40.             print "Error decoding the hash"
  41.  
  42.  
  43.     def __DB_conn(self):
  44.         #triying to connect with the sqlite database
  45.         try:
  46.             self.conn = sqlite3.connect('metadb.db')
  47.             self.consult = self.conn.cursor()
  48.         except:
  49.             print "An error has ocurred connecting with the SQLite DB"
  50.  
  51.  
  52.     def __SQL_Consulter(self):
  53.         #Divided in :
  54.             # Messages
  55.             # Chat_list
  56.  
  57.         def __Messages():
  58.             #SQLConsult
  59.             try:
  60.                 self.consult.execute("SELECT key_remote_jid, key_from_me, \
  61.                remote_resource, status, datetime(timestamp), data, media_url, media_mime_type, \
  62.                media_size, latitude, longitude FROM messages;")
  63.  
  64.             except:
  65.                 print "An error has ocurred doing the SQL Consult"
  66.  
  67.             def __Shower():
  68.                 #Message details
  69.                 #nota : parsear status, comprobar si yo envio o recivo
  70.  
  71.                 for data in self.consult:
  72.                     try:
  73.                         print "\nMessages Details:"
  74.                         print "----------------------"
  75.  
  76.                         if str(data[2]):
  77.                             if str(data[1]) == '1':
  78.                                 print "From: me"
  79.                                 print "To: %s(group), integrant: %s"%(str(data[0]), str(data[2]))
  80.                             else:
  81.                                 print "From: %s(group), integrant: %s"%(str(data[0]), str(data[2]))
  82.                                 print "To: me"
  83.                         else:
  84.                             if str(data[1]) == '1':
  85.                                 print "From: me"
  86.                                 print "To: " + str(data[0])
  87.                             else:
  88.                                 print "From: " + str(data[0])
  89.                                 print "To: me"
  90.  
  91.                         print "Status: " + str(data[3])
  92.                         print "Timestamp: " + str(data[4])
  93.                         print "Message: " + str(data[5])
  94.                         print "Media content: %s, type: %s, size: %s"%(str(data[6]), str(data[7]), str(data[8]))
  95.                         print "Location(Lat: %s, Long: %s)"%(str(data[9]), str(data[10]))
  96.                         print "----------------------"
  97.  
  98.                     except:
  99.                         continue
  100.                         print "ERROR showing message details"
  101.  
  102.             __Shower()
  103.  
  104.  
  105.         def __Chat_list():
  106.             #SQLConsult
  107.             try:
  108.                 self.consult.execute("SELECT id, \
  109.                key_remote_jid FROM chat_list;")
  110.  
  111.             except:
  112.                 print "An error has ocurred doing the SQL Consult"
  113.  
  114.             def __Shower():
  115.                 #Chat list details
  116.                 for data in self.consult:
  117.                     try:
  118.                         print "\nChat_list"
  119.                         print "ID: " + str(data[0])
  120.                         print "Number: " + str(data[1])
  121.                         print "----------------------"
  122.                     except:
  123.                         continue
  124.                         print "ERROR showing chat list details"
  125.  
  126.             __Shower()
  127.  
  128.         #Initializing
  129.         __Messages()
  130.         __Chat_list()

metaimg_extractor.py :
Código: Python
  1. # -*- coding: utf-8 *-*
  2. import os, exif
  3.  
  4. class IMG_Meta():
  5.  
  6.     def __init__(self):
  7.         try:
  8.             self.__Media_extractor()
  9.             print "------------------------------------------------------\n"
  10.             self.__Profile_extractor()
  11.         except:
  12.             print "An error has ocurred starting the script"
  13.     def __Media_extractor(self):
  14.         try:
  15.             images = os.listdir('Media/WhatsApp Images/')
  16.         except:
  17.             print "An error has ocurred listing the files into the directory"
  18.  
  19.         def __Shower():
  20.             for i in images:
  21.                 print "-------------"
  22.                 print i
  23.                 obj = exif.extract_EXIF('Media/WhatsApp Images/%s' % i)
  24.                 print "-------------"
  25.  
  26.         __Shower()
  27.  
  28.     def __Profile_extractor(self):
  29.         try:
  30.             images = os.listdir('Profile Pictures/')
  31.         except:
  32.             print "An error has ocurred listing the files into the directory"
  33.  
  34.         def __Shower():
  35.             for i in images:
  36.                 print "-------------"
  37.                 print i
  38.                 obj = exif.extract_EXIF('Profile Pictures/%s' % i)
  39.                 print "-------------"
  40.  
  41.         __Shower()



Unas imágenes trabajando :

DB_Extractor :


IMG extractor :



El archivo "Exif" que importamos en el metaimg_extractor podemos encontrarlo en el proyecto de grampus en bitbucket -> You are not allowed to view links. Register or Login

PD : El Forense podría llegar a hacerse en mayor profundidad, en este caso solo tratamos los datos que podrían ser más relevantes como conversaciones, envio de archivos y el análisis de los metadatos de las imágenes.
En fin, esto es todo, el script os automatizará todo el trabajo "duro"


Saludos !! , Sanko.



PD : You are not allowed to view links. Register or Login
« Última modificación: Mayo 13, 2013, 05:59:49 pm por Sanko »
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Conectado Snifer

  • Moderador Global
  • *
  • Mensajes: 1206
  • Puntos 5
  • Snifer@L4b's
    • Ver Perfil
    • Snifer@L4bs
Re:Forense automatizado a un whatsapp
« Respuesta #1 en: Mayo 13, 2013, 06:02:30 pm »
Como te lo dije cierto dia estimado excelente tu cambio de rumbo felicidades sanko cada dia me sorprendes mas como vas creciendo :) .


Regards ,
Snifer
You are not allowed to view links. Register or Login




Follow!! @sniferl4bs

Cambiando de nick seguiras siendo la misma basura de siempre..  ;)

Desconectado Sanko

  • Gran Colaborador
  • *
  • Mensajes: 598
  • Puntos 0
  • ¿Puedes?
    • Ver Perfil
    • Underc0de
Re:Forense automatizado a un whatsapp
« Respuesta #2 en: Mayo 14, 2013, 03:16:57 am »
Yo tambien te quiero zorra
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Desconectado ZanGetsu

  • Moderador
  • *
  • Mensajes: 292
  • Puntos 0
  • The Art of Hardening
    • Ver Perfil
    • Most Security
  • Skype: thenicox
Re:Forense automatizado a un whatsapp
« Respuesta #3 en: Mayo 14, 2013, 04:51:57 am »
buen aporte bro !
The Ethical Hacking is Trash

Desconectado mr.blood

  • Usuario
  • *
  • Mensajes: 79
  • Puntos 0
    • Ver Perfil
  • Skype: red_ink@hotmail.es
Re:Forense automatizado a un whatsapp
« Respuesta #4 en: Mayo 14, 2013, 12:12:42 pm »
Buen aporte!

Sa1uDoS

Desconectado Raymond_202

  • Usuario
  • *
  • Mensajes: 27
  • Puntos 0
    • Ver Perfil
    • Email
Re:Forense automatizado a un whatsapp
« Respuesta #5 en: Mayo 16, 2013, 12:50:45 pm »
Buen post #Sanko y #Snifer buenisimo...
Gracias!!!!

You are not allowed to view links. Register or Login
Con un Lápiz o Teclado puedes crear o falsificar lo que desee, pero si Utiliza tu Mente e imaginación harás cosas Asombrosas

Desconectado Jojo

  • Visitante
  • *
  • Mensajes: 1
  • Puntos 0
    • Ver Perfil
Re:Forense automatizado a un whatsapp
« Respuesta #6 en: Noviembre 14, 2013, 06:00:18 pm »
Hola, impresionante trabajo!
Tengo una pregunta: supón que accedo a la database de whatsapp con Airdroid en modo remoto sin tener el terminal accesible físicamente, ¿como puedo forzar un backup con el Airdroid para obtener los chats mas recientes que aun no han sido incorporados a la backup automática del whatsapp (hasta las 4 de la madrugada…). Gracias.

Conectado CrazyKade

  • Co Admin
  • *
  • Mensajes: 294
  • Puntos 0
  • Я только знаю что ничего не знаю!
    • Ver Perfil
Re:Forense automatizado a un whatsapp
« Respuesta #7 en: Noviembre 15, 2013, 09:03:02 am »
Amigo Sanko, como no puede ser de otra manera: EXCELENTE post! Me alegro verte activo y aportando tamaño post!
A ver cuando pasas a tomar unos mates por el IRC!

Saludos.-

CrazyKade



Desconectado Alexander1712

  • Harkonnen
  • Colaborador
  • *
  • Mensajes: 1195
  • Puntos 1
    • Yahoo Instant Messenger - YIM
    • Ver Perfil
    • El blog del programador
  • Skype: alexander.eberle.171294
Re:Forense automatizado a un whatsapp
« Respuesta #8 en: Noviembre 16, 2013, 11:05:20 pm »
muy pero muy bueno, graciela sanko! :)

saludos!
You are not allowed to view links. Register or Login
"Temo el dia en que la tecnologia sobrepase nuestra humanidad. El mundo tendra una generacion de idiotas" .- Albert Enstein