Apprenez à extraire les cookies de Google Chrome, le navigateur Windows sauvegardé et les déchiffrez-les sur votre machine Windows en Python.
Comme vous le savez peut-être déjà, le navigateur Chrome enregistre beaucoup de données de navigation localement dans votre machine. Sans aucun doute, le plus dangereux est de pouvoir extraire des mots de passe et de déchiffrer les mots de passe de Chrome. En outre, l’une des données stockées intéressantes est les cookies. Cependant, la plupart des valeurs des cookies sont cryptées.
Dans ce tutoriel, vous apprendrez comment extraire les cookies Chrome et les décrypter également, sur votre machine Windows avec Python.
En relation avec : Comment extraire les mots de passe Chrome en Python.
Pour commencer, installons les bibliothèques requises :
$ pip3 install pycryptodome pypiwin32
Ouvrez un nouveau fichier Python et importez les modules nécessaires:
import os
import json
import base64
import sqlite3
import shutil
from datetime import datetime, timedelta
import win32crypt
from Crypto.Cipher import AES
Ci-dessous se trouvent deux fonctions pratiques qui nous aideront plus tard à extraire des cookies
def get_chrome_datetime(chromedate):
"""Renvoyer un objet `datetime.datetime` à partir d'un datetime au format chrome
Puisque `chromedate` est formaté en nombre de microsecondes depuis janvier 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)
#décoder la clé de cryptage de Base64
key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])
#supprimer la chaîne 'DPAPI'
key = key[5:]
#renvoyer la clé déchiffrée qui était initialement chiffrée
#en utilisant une clé de session dérivée des informations de connexion de l'utilisateur actuel
# doc: http://timgolden.me.uk/pywin32-docs/win32crypt.html
return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1]
la fonction get_chrome_datetime()
convertit les dates-heures du format chrome en format Python.
get_encryption_key()
extrait et décodé la clé AES qui a été utilisée pour chiffrer les cookies, qui est stocké dans "%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Local State"
Fichier au format JSON.
def decrypt_data(data, key):
try:
#obtenir le vecteur d'initialisation
iv = data[3:15]
data = data[15:]
#générer un chiffre
cipher = AES.new(key, AES.MODE_GCM, iv)
#décrypter le mot de passe
return cipher.decrypt(data)[:-16].decode()
except:
try:
return str(win32crypt.CryptUnprotectData(data, None, None, None, 0)[1])
except:
#non pris en charge
return ""
La fonction ci-dessus accepte les données et la clé AES comme paramètres et utilise la clé pour déchiffrer les données pour les renvoyer.
Maintenant que nous avons tout ce dont nous avons besoin, plongeons dans la fonction principale :
def main():
#chemin de la base de données locale des cookies SQLite Chrome
db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local",
"Google", "Chrome", "User Data", "Default", "Network", "Cookies")
#copier le fichier dans le répertoire courant
#car la base de données sera verrouillée si Chrome est actuellement ouvert
filename = "Cookies.db"
if not os.path.isfile(filename):
#copier le fichier lorsqu'il n'existe pas dans le répertoire courant
shutil.copyfile(db_path, filename)
Le fichier qui contient les données des cookies se trouve tel que défini dans db_path
variable, nous devons le copier dans le répertoire actuel, car la base de données sera verrouillée lorsque le navigateur Chrome sera actuellement ouvert.
Connexion à la SQLitebase de données SQLite:
# se connecter à la base de données
db = sqlite3.connect(filename)
#ignorer les erreurs de décodage
db.text_factory = lambda b: b.decode(errors="ignore")
cursor = db.cursor()
#récupérer les cookies de la table « cookies »
cursor.execute("""
SELECT host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value
FROM cookies""")
#vous pouvez également effectuer une recherche par domaine, par exemple thepythoncode.com
# cursor.execute("""
#SELECT clé_hôte, nom, valeur, création_utc, last_access_utc, expires_utc, valeur_chiffrée
# OÙ clé_hôte comme '%thepythoncode.com%'""")
Après nous nous connecter à la base de données, nous ignorons les erreurs de décodage dans le cas où il y en a, nous interrogeons ensuite la table des cookies avec la fonction cursor.execute()
pour que tous les cookies soient stockés dans ce fichier. Vous pouvez également filtrer les cookies par un nom de domaine comme indiqué dans le code commenté.
Maintenant, obtenons la clé AES et itérons sur les lignes de table des cookies et décryptons toutes les données chiffrées:
#obtenir la clé AES
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:
#déjà décrypté
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)}
===============================================================
""")
#mettre à jour la table des cookies avec la valeur déchiffrée
#et rendre le cookie de session persistant
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))
#valider les modifications
db.commit()
# close connection
db.close()
Nous utilisons notre définition préalable decrypt_data()
de déchiffrement encrypted_value
colonne, nous imprimons les résultats et fixons le value
aux données déchiffrées. Nous rendons également le cookie persistant en fixant is_persistent
à 1
et également is_secure
à 0
pour indiquer qu’il n’est plus crypté.
Enfin, appelons la fonction principale:
if __name__ == "__main__":
main()
Une fois que vous exécutez le script, il imprimera tous les cookies stockés dans votre navigateur Chrome, y compris les cookés cryptés, voici un échantillon des résultats:
===============================================================
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
===============================================================
...
Conclusion
Génial, maintenant vous savez comment extraire vos cookies Chrome et les utiliser en Python.
Pour nous protéger de cela, nous pouvons simplement éliminer tous les cookies dans le navigateur Chrome ou utiliser la commande DELETE
en SQL dans le fichier Cookies d’origine pour supprimer les cookies.
Une autre solution alternative consiste à utiliser le mode Incognito. Dans ce cas, le navigateur Chrome ne sauvegarde pas l’historique de navigation, les cookies, les données du site ou les informations de l’utilisateur.