Содержание
В предыдущей статье я показал, как вытащить пароли из Chrome на Python. Сейчас покажу, как написать небольшой скрипт на Python для извлечения сохраненных паролей Wi-Fi Windows и Linux.
Еще по теме: Взлом WiFi на Python
Извлечение сохраненных паролей Wi-Fi на Python
Нам не потребуется устанавливать сторонние библиотеки, так как мы будем взаимодействовать с командой netsh в Windows и папкой NetworkManager в дистрибутивах Linux.
Мы напишем скрипт, который будет обрабатывать разный код для разных сред, так что если вы используете любую из этих платформ, он автоматически определит это и выведет сохраненные пароли соответствующим образом.
Я назвал файл extract_wifi_passwords.py.
Импорт библиотек:
1 2 |
import subprocess, os, re, configparser from collections import namedtuple |
Извлечение сохраненных паролей Wi-Fi Windows на Python
На Windows для получения всех имен Wi-Fi (SSID) мы используем команду netsh wlan show profiles; ниже приведена функция, которая использует модуль subprocess для вызова этой команды и разбора ее в Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def get_windows_saved_ssids(): """Возвращает список сохраненных SSID на компьютере под управлением Windows с использованием команды netsh""" # Получаем все сохраненные профили на ПК output = subprocess.check_output("netsh wlan show profiles").decode() ssids = [] profiles = re.findall(r"All User Profile\s(.* )", output) for profile in profiles: # Для каждого SSID удаляем пробелы и двоеточие ssid = profile.strip().strip(":").strip() # Добавляем в список ssids.append(ssid) return ssids |
Мы используем регулярные выражения для поиска профилей сетей. Затем мы можем использовать команду show profile [ssid] key=clear, чтобы получить пароль для этой сети:
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 |
def get_windows_saved_wifi_passwords(verbose=1): """Извлекает сохраненные пароли Wi-Fi на компьютере под управлением Windows, эта функция извлекает данные с помощью команды netsh в Windows Аргументы: verbose (int, необязательно): выводить ли сохраненные профили в реальном времени. По умолчанию 1. Возвращает: [list]: список извлеченных профилей, профиль содержит поля ["ssid", "ciphers", "key"]""" ssids = get_windows_saved_ssids() Profile = namedtuple("Profile", ["ssid", "ciphers", "key"]) profiles = [] for ssid in ssids: ssid_details = subprocess.check_output(f"""netsh wlan show profile "{ssid}" key=clear""").decode() # Получаем шифры ciphers = re.findall(r"Cipher\s(.* )", ssid_details) # Убираем пробелы и двоеточия ciphers = "/".join([c.strip().strip(":").strip() for c in ciphers]) # Получаем пароль Wi-Fi key = re.findall(r"Key Content\s(.* )", ssid_details) # Убираем пробелы и двоеточия try: key = key[0].strip().strip(":").strip() except IndexError: key = "None" profile = Profile(ssid=ssid, ciphers=ciphers, key=key) if verbose >= 1: print_windows_profile(profile) profiles.append(profile) return profiles |
Сначала мы вызываем get_windows_saved_ssids(), чтобы получить все SSID, с которыми мы подключались ранее. Затем мы инициализируем наш именованный кортеж для включения ssid, ciphers и ключа.
Мы вызываем show profile [ssid] key=clear для каждого извлеченного SSID, затем разбираем шифры и ключ (пароль) с помощью re.findall(), и выводим их с помощью простой функции `print_windows_profile()`:
1 2 3 4 5 6 7 8 |
def print_windows_profile(profile): """Выводит одиночный профиль на Windows""" print(f"{profile.ssid:25}{profile.ciphers:15}{profile.key:50}") def print_windows_profiles(verbose): """Выводит все извлеченные SSID вместе с ключами на Windows""" print("SSID CIPHER(S) KEY") get_windows_saved_wifi_passwords(verbose) |
Итак, print_windows_profiles() выводит все SSID вместе с шифрами и ключами (паролями).
Извлечение сохраненных паролей Wi-Fi Linux на Python
Все ранее подключенные и сохраненные сети (в виде файлов INI) находятся в каталоге:
1 |
/etc/NetworkManager/system-connections/ |
Нам просто нужно прочитать эти файлы и вывести их в удобном формате:
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 |
def get_linux_saved_wifi_passwords(verbose=1): """Извлекает сохраненные пароли Wi-Fi на компьютере под управлением Linux, эта функция извлекает данные из каталога '/etc/NetworkManager/system-connections/' Аргументы: verbose (int, по желанию): печатать ли сохраненные профили в реальном времени. По умолчанию 1. Возвращает: [list]: список извлеченных профилей, профиль имеет поля ["ssid", "auth-alg", "key-mgmt", "psk"]""" network_connections_path = "/etc/NetworkManager/system-connections/" fields = ["ssid", "auth-alg", "key-mgmt", "psk"] Profile = namedtuple("Profile", [f.replace("-", "_") for f in fields]) profiles = [] for file in os.listdir(network_connections_path): data = {k.replace("-", "_"): None for k in fields} config = configparser.ConfigParser() config.read(os.path.join(network_connections_path, file)) for _, section in config.items(): for k, v in section.items(): if k in fields: data[k.replace("-", "_")] = v profile = Profile(**data) if verbose >= 1: print_linux_profile(profile) profiles.append(profile) return profiles |
Как упоминалось, мы используем функцию os.listdir() для перечисления всех файлов в этом каталоге. Затем мы используем configparser для чтения файла INI и перебираем элементы. Если мы находим поля, которые нас интересуют, мы просто включаем их в наши данные.
Существует и другая информация, но мы ограничимся ssid, auth-alg, key-mgmt и psk (пароль).
Теперь давайте вызовем функцию:
1 2 3 4 5 6 7 8 |
def print_linux_profile(profile): """Печатает один профиль на Linux""" print(f"{str(profile.ssid):25}{str(profile.auth_alg):5}{str(profile.key_mgmt):10}{str(profile.psk):50}") def print_linux_profiles(verbose): """Печатает все извлеченные SSID вместе с ключами (PSK) на Linux""" print("SSID AUTH KEY-MGMT PSK") get_linux_saved_wifi_passwords(verbose) |
Завершение и запуск extract_wifi_passwords.py
Наконец, создадим функцию, которая, в зависимости от операционной системы, вызывает print_linux_profiles(), либо print_windows_profiles().
1 2 3 4 5 6 7 8 9 10 |
def print_profiles(verbose=1): if os.name == "nt": print_windows_profiles(verbose) elif os.name == "posix": print_linux_profiles(verbose) else: raise NotImplemented("Код работает только для Linux или Windows") if __name__ == "__main__": print_profiles() |
Запуск скрипта:
1 |
$ python get_wifi_passwords.py |
Вот результат на моей машине с Windows:
А это результат на моей машине с Linux:
Заключение
Уверен, этот код будет полезен в изучении Python и для быстрого получения сохраненных паролей Wi-Fi. Кстати, рекомендую прочитать статью «Как написать троян на Python», в частности главу «Создание WiFi-стилера на Python».
ПОЛЕЗНЫЕ ССЫЛКИ: