domingo, 26 de diciembre de 2010

Leyendo las cookies y logins de Firefox con Python y SQLite

Aprovecho la oportunidad para decir
Felices navidad! / Bo nadal! / Merry christmas!

Ahora sí... recordemos que Firefox guardaba alguna información en forma de bases de datos SQLite (interesantes por el hecho de que no requiere un demonio externo, sino que toda la información lo maneja la librería sobre un archivo), veamos como hacer un script que nos muestre las cookies para dominios concretos.

Las cookies se guardan en el archivo "cookies.sqlite" en la carpeta del perfil del programa, un "file" confirma que es una base de datos sqlite3, se puede abrir con

sqlite3 cookies.sqlite



Veamos que tablas tiene

sqlite> .table
moz_cookies
sqlite>


Entonces solo hay una tabla, "moz_cookies", veamos como funciona

sqlite> .schema moz_cookies
CREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER);
sqlite>


Los nombres de los campos son bastante ilustrativos, probemos buscando campos con "google", por ejemplo, en el host...

sqlite> select * from moz_cookies where host like '%google%';
1284819422521617|PREF|ID=9781f1e5d7ff9422:U=e5291c6e5476d7f8:TM=1284819422:LM=1286025562:GM=1:S=yVNr14zH2KpCzPpS|.google.com|/|1349097562|1286026121306278|0|0
...
sqlite>


Ya está, ahora a plasmarlo en un script, lo primero es importar sqlite3 (y de paso sys =P)

import sqlite3, sys


La función que muestre las cookies será cookie_f

def cookie_f(fn, host):


Ahora hay que abrir el archivo:

    sock = sqlite3.connect(fn)


Y obtener un cursor para manejarlo:

    c = sock.cursor()


Lo próximo es hacer la petición, para delegar el esfuerzo de filtrarla, se pondrá una "?" donde se ubicará la cadena de host, y se concatenan después los % del like, el segundo argumento, la cadena de host, tiene que ser una tupla:

    c.execute("select * from moz_cookies where host like '%' || ? || '%'", (host, ))


Ahora hay que hacer efectivos los cambios:

    sock.commit()


Y mostrar los datos obtenidos:

    for res in c.fetchall():
        print res


Una vez hecho esto, y dado que no se harán más peticiones, se cierra la base de datos:

    c.close()


El resto del código es trivial:

if (len(sys.argv) < 3):
    print sys.argv[0], "<file> <dominio>"
    exit(0)

cookie_f(sys.argv[1], sys.argv[2])


El código completo: http://pastebin.com/jwt1Apwu


$ ./firesnake.py cookies.sqlite google
(1284819422521617L, u'PREF', u'ID=9781f1e5d7ff9422:U=e5291c6e5476d7f8:TM=1284819422:LM=1286025562:GM=1:S=yVNr14zH2KpCzPpS', u'.google.com', u'/', 1349097562, 1286026121306278L, 0, 0)
...


Hasta el año que viene ;)

[Referencias]
http://docs.python.org/library/sqlite3.html
http://www.sqlite.org/sqlite.html

7 comentarios:

  1. Muy interesante kenkeiras... lo probar en cuanto tenga un rato... lo mismo que pasa con Firefox hay muchas herramientas que utilizan SQLite para almacenar informacin, hasta herramientas propietarias...

    Perdona por el mensaje duplicado, Thunderbrowse no se lleva muy bien con los comentarios de blogspot.

    ResponderEliminar
  2. No hay fallo por el duplicado, aquí no se montan hilos largos en los comentarios como para que importe :P

    Lo bueno de SQLite, es que no necesita más que la librería (que es estándar en Python), asñi que es muy útil sobre entornos limitados, o para programas que no requieran varias peticiones concurrentes.

    Sabia que lo usaban algunos programas, pero pensaba que eran pocos, todos los días se aprende algo :D

    ResponderEliminar
  3. Muy buena la investigacion y la idea pero parece ser que en windows no funciona...

    Se conecta bien a la base de datos SQLite pero dice que no encuentra ninguna tabla como "moz_cookies"

    Alguna idea??

    ResponderEliminar
  4. @LeXeL: solo se me ocurre que el archivo no sea correcto.

    Aprovecho para comentar que si después da un error "database locked" será porque firefox está abierto (y sqlite no permite multiples procesos)

    Suerte

    ResponderEliminar
  5. soy novato una pregunta simple el código que creaste en python tiene algún formato para uno poder tener algún tipo de referencia de como usarlo o alguna pequeña GUI para los novatos, ya que esta es una herramienta que estuve buscando, pero a mi entender de novato esta a 75% de lo que debiera ser, excusas por lo novato que soy.Lo puse en anónimo por favor alguien que sea tan amable de explicarlo aquí mismo.

    ResponderEliminar
  6. @anónimo: no, la única referencia (si se puede llamar así) es este post, ni tampoco hay ninguna GUI.

    No pretende ser una herramienta completa ni nada por el estilo, simplemente era para saber como guardaba Firefox las cookies y mostrar como funciona SQLite. Si quieres, sientete libre de adaptarla, está bajo la WTFPL [ http://sam.zoy.org/wtfpl/ ]

    ResponderEliminar