Hoy vamos a ver como extraer información relevante de las bases de datos que Mozilla Firefox utiliza para sus perfiles de usuario. Lo vamos ha hacer bajo el sistema operativo Linux Mint Rosa, Firefox 46.0.1 y Python. En caso de que queráis hacerlo desde otra plataforma o lenguaje, las variaciones no deberían suponer ningún reto. Así mismo, la forma en que mozilla almacena sus datos podría variar sustancialmente en futuras versiones al iguas que en versiones más antiguas (downloads.sqlite, signons, etc…).
Empezaremos por decir que en nuestro perfil de usuario de firefox (el cuál podremos encontrar en: /home/{USER_NAME}/.mozilla/firefox/{PROFILE_NAME}) se almacena mucha información. Aquí vamos a centrarnos en los siguientes archivos:
– cookies.sqlite
– formhistory.sqlite
– places.sqlite
Estos archivos son bases de datos SQLite, y accederemos a ellos desde python para obtener la información que necesitemos. Empecemos por el primero de ellos ‘cookies.sqlite’. Para conectarnos a la base de datos abriremos una consola python en la carpeta de nuestro perfil e importaremos sqlite3. Luego estableceremos la conexión y obtendremos el nombre de las tablas contenidas en dicha base de datos:
conn = sqlite3.connect('cookies.sqlite') c = conn.cursor() c.execute('SELECT name FROM sqlite_master WHERE type="table"')
Hecho esto podremos ver las tablas obtenidas y obtener información de ellas. En este caso la BD solo contiene una tabla llamada moz_cookies de la que podemos obtener un esquema orientativo de la siguiente forma:
c.execute('PRAGMA table_info(moz_cookies)')
Con ello sabremos que el esquema de dicha tabla es:
(0, u'id', u'INTEGER', 0, None, 1) (1, u'baseDomain', u'TEXT', 0, None, 0) (2, u'originAttributes', u'TEXT', 1, u"''", 0) (3, u'name', u'TEXT', 0, None, 0) (4, u'value', u'TEXT', 0, None, 0) (5, u'host', u'TEXT', 0, None, 0) (6, u'path', u'TEXT', 0, None, 0) (7, u'expiry', u'INTEGER', 0, None, 0) (8, u'lastAccessed', u'INTEGER', 0, None, 0) (9, u'creationTime', u'INTEGER', 0, None, 0) (10, u'isSecure', u'INTEGER', 0, None, 0) (11, u'isHttpOnly', u'INTEGER', 0, None, 0) (12, u'appId', u'INTEGER', 0, u'0', 0) (13, u'inBrowserElement', u'INTEGER', 0, u'0', 0)
y prodemos obtener la información que queramos haciendo las consultas necesarias.
En la base de datos ‘formhistory.sqlite’, de la misma forma que en la anterior, obtendremos que consta de dos tablas: ‘moz_formhistory’ y ‘moz_deleted_formhistory’. Cuyos esquemas son, respectivamente:
'moz_formhistory' (0, u'id', u'INTEGER', 0, None, 1) (1, u'fieldname', u'TEXT', 1, None, 0) (2, u'value', u'TEXT', 1, None, 0) (3, u'timesUsed', u'INTEGER', 0, None, 0) (4, u'firstUsed', u'INTEGER', 0, None, 0) (5, u'lastUsed', u'INTEGER', 0, None, 0) (6, u'guid', u'TEXT', 0, None, 0) 'moz_deleted_formhistory' (0, u'id', u'INTEGER', 0, None, 1) (1, u'timeDeleted', u'INTEGER', 0, None, 0) (2, u'guid', u'TEXT', 0, None, 0)
De estas tablas podremos extraer información de los campos almacenados al rellenar formularios, etc.
Y nos queda hablar de la más extensa de las tres, ‘places.sqlite’. Siguiendo los métodos ya citados, podemos comprobar que contiene múltiples tablas: moz_places, moz_historyvisits, moz_inputhistory, moz_bookmarks, moz_bookmarks_roots, moz_keywords, moz_favicons, moz_annos, moz_anno_attributes, moz_items_annos, sqlite_sequence, sqlite_stat1. Podemos intuir que para extraer información sobre los marcadores utilizaremos las tablas ‘moz_bookmarks’ y ‘moz_bookmarks_roots’ por ejemplo. Muchas de ellas están enlazadas por claves foráneas como por ejemplo la tabla ‘moz_favicons’ que almacena iconos relativos a webs que se encuentran en otras tablas como ‘moz_places’.
Estas bases de datos, además de para curiosear, son muy útiles cuando un perfil se corrompe y queremos recuperar información del mismo (historial, marcadores, preferencias de sitios web, etc.). Para este caso, también podremos extraer las contraseñas guardadas en el navegador y desencriptarlas en caso de que las hayamos olvidado y no podamos acceder a nuestro perfil. Para realizar esto último se utilizan los archivos ‘logins.json’ y ‘key3.db’. En el primero se almacenan los datos de usuario y contraseña de forma encriptada mientras que en el segundo se encuentra la clave para poder desencriptarlos. El proceso para realizarlo lo dejo para otro post en el que también mostraré algunos ejemplos de lo visto aquí.