Cómo extraer cookies de Chrome en Python
cómo extraer las cookies guardadas del navegador Google Chrome y descifrarlas en su máquina Windows en Python.
Como ya sabrá, el navegador Chrome guarda una gran cantidad de datos de navegación localmente en su máquina. Sin duda, lo más peligroso es poder extraer contraseñas y descifrar contraseñas de Chrome. Además, uno de los datos almacenados interesantes son las cookies. Sin embargo, la mayoría de los valores de las cookies están encriptados.
En este tutorial, aprenderá cómo extraer cookies de Chrome y descifrarlas también en su máquina Windows con Python..
Para comenzar, instalemos las bibliotecas requeridas:
$ pip3 install pycryptodome pypiwin32
Abra un nuevo archivo de Python e importe los módulos necesarios:
import os
import json
import base64
import sqlite3
import shutil
from datetime import datetime, timedelta
import win32crypt # pip install pypiwin32
from Crypto.Cipher import AES # pip install pycryptodome
def get_chrome_datetime(chromedate):
"""Return a `datetime.datetime` object from a chrome format datetime
Since `chromedate` is formatted as the number of microseconds since January, 1601"""
if chromedate != 86400000000 and chromedate:
try:
return datetime(1601, 1, 1) + timedelta(microseconds=chromedate)
except Exception as e:
print(f"Error: {e}, chromedate: {chromedate}")
return chromedate
else:
return ""
def get_encryption_key():
local_state_path = os.path.join(os.environ["USERPROFILE"],
"AppData", "Local", "Google", "Chrome",
"User Data", "Local State")
with open(local_state_path, "r", encoding="utf-8") as f:
local_state = f.read()
local_state = json.loads(local_state)
# decode the encryption key from Base64
key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
# remove 'DPAPI' str
key = key[5:]
# return decrypted key that was originally encrypted
# using a session key derived from current user's logon credentials
# doc: http://timgolden.me.uk/pywin32-docs/win32crypt.html
return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1]
get_chrome_datetime() function converts the datetimes of chrome format into a Python datetime format.
get_encryption_key() extracts and decodes the AES key that was used to encrypt the cookies, which is stored in "%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Local State" file in JSON format.
def decrypt_data(data, key):
try:
# get the initialization vector
iv = data[3:15]
data = data[15:]
# generate cipher
cipher = AES.new(key, AES.MODE_GCM, iv)
# decrypt password
return cipher.decrypt(data)[:-16].decode()
except:
try:
return str(win32crypt.CryptUnprotectData(data, None, None, None, 0)[1])
except:
# not supported
return ""
La función anterior acepta los datos y la clave AES como parámetros y usa la clave para descifrar los datos para devolverlos.
Ahora que tenemos todo lo que necesitamos, profundicemos en la función principal
def main():
# local sqlite Chrome cookie database path
db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local",
"Google", "Chrome", "User Data", "Default", "Network", "Cookies")
# copy the file to current directory
# as the database will be locked if chrome is currently open
filename = "Cookies.db"
if not os.path.isfile(filename):
# copy file when does not exist in the current directory
shutil.copyfile(db_path, filename)
El archivo que contiene los datos de las cookies se encuentra como se define en la variable db_path, debemos copiarlo en el directorio actual, ya que la base de datos se bloqueará cuando el navegador Chrome esté abierto actualmente.
Conexión a la base de datos SQLite:
# connect to the database
db = sqlite3.connect(filename)
# ignore decoding errors
db.text_factory = lambda b: b.decode(errors="ignore")
cursor = db.cursor()
# get the cookies from `cookies` table
cursor.execute("""
SELECT host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value
FROM cookies""")
# you can also search by domain, e.g thepythoncode.com
# cursor.execute("""
# SELECT host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value
# FROM cookies
# WHERE host_key like '%thepythoncode.com%'""")
Después de conectarnos a la base de datos, ignoramos los errores de decodificación en caso de que haya alguno, luego consultamos la tabla de cookies con la función cursor.execute() para obtener todas las cookies almacenadas en este archivo. También puede filtrar las cookies por un nombre de dominio como se muestra en el código comentado.
Ahora obtengamos la clave AES e iteremos sobre las filas de la tabla de cookies y descifremos todos los datos cifrados:
# get the AES key
key = get_encryption_key()
for host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value in cursor.fetchall():
if not value:
decrypted_value = decrypt_data(encrypted_value, key)
else:
# already decrypted
decrypted_value = value
print(f"""
Host: {host_key}
Cookie name: {name}
Cookie value (decrypted): {decrypted_value}
Creation datetime (UTC): {get_chrome_datetime(creation_utc)}
Last access datetime (UTC): {get_chrome_datetime(last_access_utc)}
Expires datetime (UTC): {get_chrome_datetime(expires_utc)}
===============================================================
""")
# update the cookies table with the decrypted value
# and make session cookie persistent
cursor.execute("""
UPDATE cookies SET value = ?, has_expires = 1, expires_utc = 99999999999999999, is_persistent = 1, is_secure = 0
WHERE host_key = ?
AND name = ?""", (decrypted_value, host_key, name))
# commit changes
db.commit()
# close connection
db.close()
Usamos nuestra función decrypt_data() previamente definida para descifrar la columna de valor_cifrado, imprimimos los resultados y establecemos la columna de valor en los datos descifrados. También hacemos que la cookie sea persistente configurando is_persistent en 1 y también is_secure en 0 para indicar que ya no está encriptada.
Finalmente, llamemos a la función principal
if __name__ == "__main__":
main()
Una vez que ejecute el script, imprimirá todas las cookies almacenadas en su navegador Chrome, incluidas las cifradas, aquí hay una muestra de los resultados:
===============================================================
Host: www.example.com
Cookie name: _fakecookiename
Cookie value (decrypted): jLzIxkuEGJbygTHWAsNQRXUaieDFplZP
Creation datetime (UTC): 2021-01-16 04:52:35.794367
Last access datetime (UTC): 2021-03-21 10:05:41.312598
Expires datetime (UTC): 2022-03-21 09:55:48.758558
===============================================================
Comentarios
Publicar un comentario