Задача:
Иногда случается так, что нужно подобрать пароль на хэш от соцсети какого-нибудь юзера. Пароль от архива, криптоконтейнера (хотя идея обычно так себе). Ну или вообще какой-либо пароль. Перво-наперво в таких случаях брутят по базе самых частых паролей, это очень логично. Такие базы/подборки можно найти в сети. Если это не принесло успеха, прежде, чем брутить пароли генерируя все возможные вариации паролей, можно попробовать таргетированую атаку. Мы можем сгенерировать пароли на основе данных, которые мы знаем о пользователе: ФИО, даты рождения, другие важные даты этого пользователя, номер телефона, номер паспорта, емайлы, список из самых частых паролей 12345, qwert, qaz, и т.д
Остается сгенерировать перестановки из нашего списка, а результат сохранить в текстовый файл.
Стек технологий
I. python 3.9
И все? Да. Мы даже не будем устанавливать никаких библиотек, используем лишь 2 функции из стандартной библиотеки.
Дикслеймер
Автор не является профессионалом во взломе/бруте/ кодингу на python.
Навернякак можно сделать лучше, и вообще кодить на python западло.
Подготовка
Для начала нужно поставить python на вашу ОС. Инструкция на все ОС: https://realpython.com/installing-python/
Код можно писать в любом текстовом рекдакторе, конечно с поцветкой кода. Вообще идельным IDE для python считается Pycharm.
Скачать: https://www.jetbrains.com/pycharm/download/
Настройка: https://py-charm.blogspot.com/2017/09/blog-post.html
Статья о том как запустить python код: https://pythonru.com/osnovy/zapusk-python-i-python-skript-na-kompjutere
В целом в интернете куча иснтукций по установки, настройке python и запуску кода написанного на python. Я написал этот раздел на всякий случай для полноты статьи.
Поехали!
Имортируем пару функций из стандартной библиотеки.
Об этом модуле и этих функциях есть замечательная статья:
https://habr.com/ru/company/otus/blog/529356/
В кратце: Модуль itertools стандартизирует основной набор быстрых эффективных по памяти инструментов, которые полезны сами по себе или в связке с другими инструментами. Вместе они формируют «алгебру итераторов», которая позволяет лаконично и эффективно создавать специализированные инструменты на чистом Python.
Функция Chain: как бы склеивает несколько последовательностей в одну.
Функция permutations() Возвращает последовательные r перестановок элементов в итерируемом объекте. Если параметр r не указан или стоит в значении None, то по умолчанию r принимает длину итерируемого объекта и генерирует все возможные полноценные перестановки. Кортежи перестановок выдаются в лексикографическим порядке в соответствии с порядком итерации входных данных.
Данные из файла настроек мы считываем в отельные списки для удобного манипулирования. Разделение происходит по пробелу.
Файл настроек заполняется следующим образом:
https://all-python.ru/osnovy/generator-spiska.html
Можем приступать.
Преобразуем слова, чтобы у нас были копии слов с заглавными буквами.
По аналогии создаем список слов где заглавной будет только первая буква. А далее добавим знак + к каждому номеру телефона.
Теперь уберем слэш из даты, и сгенерируем разные перестановки из даты. Например: год/месяц/день, месяц/год/день и т.д
Далее по аналогии, все делаем с помощью генераторов списка.
Закидываем все наши сформированные списки, в множество, чтобы избежать повторений, ибо множество удалит все дубли. Благодаря функции chain мы склеиваем все списки в 1 список и можем легко передать его функции set, которая создаст множество из итератора.
С помощью функции permutations создаем все возможные перестоновки из нашего множества длинной 2 элемента, а затем длинной 3 элемента, склеиваем с помощью chain все в один список и пишем результат в переменную result. Следует отметить, что сохранится все список кортежей.
Открываем файл в контекстном менеджере для записи результата. В цикле for проходим по списку кортежей при этом с помощью функции join() собираем каждый кортеж встроку. Далее проверяем подходит ли нам такой пароль по длинне, если да то пишем его в файл.
Весь код целиком:
Итоги:
Скрипт простой, но я думаю свою задачу он выполняет. Безусловно можно сколь угодно улучшать скрипт, и настраивать под себя. С настройками из примера скрипт сгенерирует 21364 пароля. Если в настройках длинны паролей выставить например 0 минимальный и 10000 максимальный (чтобы точно все пароли любой длинны пошли в результат), тот скрипт сгенериует 698216 паролей. Что по скорости? На моем ПК скрипт делает работу за 2 секунды, если будет писать в файл все пароли, любой длинны.
Иногда случается так, что нужно подобрать пароль на хэш от соцсети какого-нибудь юзера. Пароль от архива, криптоконтейнера (хотя идея обычно так себе). Ну или вообще какой-либо пароль. Перво-наперво в таких случаях брутят по базе самых частых паролей, это очень логично. Такие базы/подборки можно найти в сети. Если это не принесло успеха, прежде, чем брутить пароли генерируя все возможные вариации паролей, можно попробовать таргетированую атаку. Мы можем сгенерировать пароли на основе данных, которые мы знаем о пользователе: ФИО, даты рождения, другие важные даты этого пользователя, номер телефона, номер паспорта, емайлы, список из самых частых паролей 12345, qwert, qaz, и т.д
Остается сгенерировать перестановки из нашего списка, а результат сохранить в текстовый файл.
Стек технологий
I. python 3.9
И все? Да. Мы даже не будем устанавливать никаких библиотек, используем лишь 2 функции из стандартной библиотеки.
Дикслеймер
Автор не является профессионалом во взломе/бруте/ кодингу на python.
Навернякак можно сделать лучше, и вообще кодить на python западло.
Подготовка
Для начала нужно поставить python на вашу ОС. Инструкция на все ОС: https://realpython.com/installing-python/
Код можно писать в любом текстовом рекдакторе, конечно с поцветкой кода. Вообще идельным IDE для python считается Pycharm.
Скачать: https://www.jetbrains.com/pycharm/download/
Настройка: https://py-charm.blogspot.com/2017/09/blog-post.html
Статья о том как запустить python код: https://pythonru.com/osnovy/zapusk-python-i-python-skript-na-kompjutere
В целом в интернете куча иснтукций по установки, настройке python и запуску кода написанного на python. Я написал этот раздел на всякий случай для полноты статьи.
Поехали!
Имортируем пару функций из стандартной библиотеки.
Об этом модуле и этих функциях есть замечательная статья:
https://habr.com/ru/company/otus/blog/529356/
В кратце: Модуль itertools стандартизирует основной набор быстрых эффективных по памяти инструментов, которые полезны сами по себе или в связке с другими инструментами. Вместе они формируют «алгебру итераторов», которая позволяет лаконично и эффективно создавать специализированные инструменты на чистом Python.
Функция Chain: как бы склеивает несколько последовательностей в одну.
Функция permutations() Возвращает последовательные r перестановок элементов в итерируемом объекте. Если параметр r не указан или стоит в значении None, то по умолчанию r принимает длину итерируемого объекта и генерирует все возможные полноценные перестановки. Кортежи перестановок выдаются в лексикографическим порядке в соответствии с порядком итерации входных данных.
Python:
from itertools import chain, permutations
Данные из файла настроек мы считываем в отельные списки для удобного манипулирования. Разделение происходит по пробелу.
Python:
# считыаем данные из файла настроек
with open('words.txt') as date:
words = date.readline().strip().lower().split(' ')
phones = date.readline().strip().split(' ')
dates = date.readline().strip().split(' ')
emails = date.readline().strip().split(' ')
often = date.readline().strip().split(' ')
other = date.readline().strip().split(' ')
min_length, max_length = date.readline().strip().split(' ')
Файл настроек заполняется следующим образом:
Пример файла настроек:a) Буквенные слова (ФИО, город, клички и т.д)
b) Номера телефонов
c) Даты (даты рождения родтственников, даты исторических личностей, которым симпатизирует юзер и т.д)
d) емайлы
e) Частые пароли (на усмотрение: 12345, qwert и т.д)
f) Другое (любые слова и небуквенные строки: номер паспорта и др)
e) Длинна пароля, только пароли в этом диапозоне попадут в результат
Все данные разбиваются по строкам.
В скрипте очень часто будет использоваться генератор списков, если кто-то еще не освоил эту концепцию вот статья где все разжевано:micheal washington birmingham al miawashi
2058336800 2058336801 2058336802 2058336803
02/27/1961 02/27/1962 02/27/1963 02/27/1964
miawashi@southernco.com miawash1@southernco.com miawash2@southernco.com
123 1234 12345 123456 qwe qwer qwert qaz qazxsw 12345qwert
422927913 35215
0 10000
https://all-python.ru/osnovy/generator-spiska.html
Можем приступать.
Преобразуем слова, чтобы у нас были копии слов с заглавными буквами.
Python:
# создаем список слов с заглавными буквами
words_upper = [word.upper() for word in words]
По аналогии создаем список слов где заглавной будет только первая буква. А далее добавим знак + к каждому номеру телефона.
Python:
# создаем список слов с первыми заглавными буквами
words_capitalized = [word.capitalize() for word in words]
# создаем список телефонов с + в начале
phones_with_plus = ['+' + phone for phone in phones]
Теперь уберем слэш из даты, и сгенерируем разные перестановки из даты. Например: год/месяц/день, месяц/год/день и т.д
Python:
# генерируем даты без разделителя со всеми возможными перестановками
dates_list = [x.split('/') for x in dates]
dates_list_gener = [list(permutations(x)) for x in dates_list]
dates_without_symbol_gener = [''.join(y) for x in dates_list_gener for y in x]
Далее по аналогии, все делаем с помощью генераторов списка.
Python:
# генерируем даты с раздилителем /
dates_symbol_gener = ['/'.join(y) for x in dates_list_gener for y in x]
# создаем список емайлов без домена
emails_without_domen = [email.split('@')[0] for email in emails]
# создаем список емайлов без домена заглавными буквами
emails_without_domen_upper = [email.upper() for email in emails_without_domen]
# создаем список емайлов без домена заглавными первыми буквами
emails_without_domen_capitalized = [email.capitalize() for email in emails_without_domen]
# создаем список заглавных слов из списка "другое"
other_user = [word.upper() for word in other]
# создаем список слов с первыми заглавными буквами
other_capitalizes = [word.capitalize() for word in other]
Закидываем все наши сформированные списки, в множество, чтобы избежать повторений, ибо множество удалит все дубли. Благодаря функции chain мы склеиваем все списки в 1 список и можем легко передать его функции set, которая создаст множество из итератора.
Python:
result_set = set(chain(words, phones, dates, often, other, words_upper, words_capitalized, phones_with_plus,
dates_without_symbol_gener, dates_symbol_gener,
emails_without_domen, emails_without_domen_upper,
emails_without_domen_capitalized, other_user, other_capitalizes))
С помощью функции permutations создаем все возможные перестоновки из нашего множества длинной 2 элемента, а затем длинной 3 элемента, склеиваем с помощью chain все в один список и пишем результат в переменную result. Следует отметить, что сохранится все список кортежей.
Python:
result = chain(permutations(result_set, 2), permutations(result_set, 3))
Открываем файл в контекстном менеджере для записи результата. В цикле for проходим по списку кортежей при этом с помощью функции join() собираем каждый кортеж встроку. Далее проверяем подходит ли нам такой пароль по длинне, если да то пишем его в файл.
Python:
if __name__ == '__main__':
with open('result.txt', 'a') as file:
for x in result:
y = ''.join(x)
if int(min_length) <= len(y) <= int(max_length):
file.write(y + '\n')
Python:
from itertools import chain, permutations
# считыаем данные из файла настроек
with open('words.txt') as date:
words = date.readline().strip().lower().split(' ')
phones = date.readline().strip().split(' ')
dates = date.readline().strip().split(' ')
emails = date.readline().strip().split(' ')
often = date.readline().strip().split(' ')
other = date.readline().strip().split(' ')
min_length, max_length = date.readline().strip().split(' ')
# создаем список слов с заглавными буквами
words_upper = [word.upper() for word in words]
# создаем список слов с первыми заглавными буквами
words_capitalized = [word.capitalize() for word in words]
# создаем список телефонов с + в начале
phones_with_plus = ['+' + phone for phone in phones]
# генерируем даты без разделителя со всеми возможными перестановками
dates_list = [x.split('/') for x in dates]
dates_list_gener = [list(permutations(x)) for x in dates_list]
dates_without_symbol_gener = [''.join(y) for x in dates_list_gener for y in x]
# генерируем даты с раздилителем /
dates_symbol_gener = ['/'.join(y) for x in dates_list_gener for y in x]
# создаем список емайлов без домена
emails_without_domen = [email.split('@')[0] for email in emails]
# создаем список емайлов без домена заглавными буквами
emails_without_domen_upper = [email.upper() for email in emails_without_domen]
# создаем список емайлов без домена заглавными первыми буквами
emails_without_domen_capitalized = [email.capitalize() for email in emails_without_domen]
# создаем список заглавных слов из списка "другое"
other_user = [word.upper() for word in other]
# создаем список слов с первыми заглавными буквами
other_capitalizes = [word.capitalize() for word in other]
result_set = set(chain(words, phones, dates, often, other, words_upper, words_capitalized, phones_with_plus,
dates_without_symbol_gener, dates_symbol_gener,
emails_without_domen, emails_without_domen_upper,
emails_without_domen_capitalized, other_user, other_capitalizes))
result = chain(permutations(result_set, 2), permutations(result_set, 3))
if __name__ == '__main__':
with open('result.txt', 'a') as file:
for x in result:
y = ''.join(x)
if int(min_length) <= len(y) <= int(max_length):
file.write(y + '\n')
Скрипт простой, но я думаю свою задачу он выполняет. Безусловно можно сколь угодно улучшать скрипт, и настраивать под себя. С настройками из примера скрипт сгенерирует 21364 пароля. Если в настройках длинны паролей выставить например 0 минимальный и 10000 максимальный (чтобы точно все пароли любой длинны пошли в результат), тот скрипт сгенериует 698216 паролей. Что по скорости? На моем ПК скрипт делает работу за 2 секунды, если будет писать в файл все пароли, любой длинны.