В предыдущей статье я показал, как вытащить пароли из Chrome на Python. Сейчас покажу, как написать небольшой скрипт на Python для извлечения сохраненных паролей Wi-Fi Windows и Linux.
Еще по теме: Взлом WiFi на Python
Извлечение сохраненных паролей Wi-Fi на Python
Нам не потребуется устанавливать сторонние библиотеки, так как мы будем взаимодействовать с командой netsh в Windows и папкой NetworkManager в дистрибутивах Linux.
Статья в образовательных целях, для обучения этичных хакеров. Несанкционированный доступ к чужой информации является незаконным и рассматривается как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Мы напишем скрипт, который будет обрабатывать разный код для разных сред, так что если вы используете любую из этих платформ, он автоматически определит это и выведет сохраненные пароли соответствующим образом.
Я назвал файл 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».
ПОЛЕЗНЫЕ ССЫЛКИ: