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

Статья Генерируем пароли для брута с помощью python

gymxxx

floppy-диск
Пользователь
Регистрация
26.06.2021
Сообщения
1
Реакции
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 секунды, если будет писать в файл все пароли, любой длинны.
 
(EN) Thanks for the post. Do you think that itertools is slower compared to pure Python options like recursions or iterations?
(RU) Спасибо за сообщение. Считаете ли вы, что itertools медленнее по сравнению с чистыми вариантами Python, такими как рекурсии или итерации?
 


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