AI-writeup "Капаре"
ДмитрийWriteup: Взлом билетов в t-caparet через ECB-атаку
Задача
На сайте https://t-caparet-mzcx3vv9.spbctf.org/ дано два представления театра: /book/1 и /book/2. На /book/2 можно забронировать билет, на /book/1 — нельзя: стоит искусственное ограничение. Цель: получить валидный токен для /book/1 c нашим возрастом (19).
Наблюдения
- Сайт генерирует hex-строку (token), которую подставляет в
/#t/{token} - Строка ~512 hex-символов = 256 байт = 16 блоков AES
- Меняя поля (имя, возраст, play_id) мы наблюдаем меняющиеся блоки
Делаем вывод: используется AES-шифр в ECB-режиме.
Подготовка
- Получаем токен с play_id=2 и age=19:
{"name":"aaa","age":19,"comment":"a","play_id":2}
- Получаем токен с play_id=1 и age=10:
{"name":"aaa","age":10,"comment":"a","play_id":1}
Разбор
- Разбиваем оба токена по 16 байт
- Сравниваем блоки, ищем тот, где зашифрован play_id
Обнаружив блок play_id=1, вставляем его в нужную позицию в токене с age=19.
Код
from urllib.parse import urlparse
import requests
URL = "https://t-caparet-mzcx3vv9.spbctf.org/api/book"
# Функция генерации токена
def get_token(name, age, comment, play_id):
r = requests.post(URL, json={"name": name, "age": age, "comment": comment, "play_id": play_id})
return r.json()["token"]
def split_blocks(hex_token):
return [hex_token[i:i+32] for i in range(0, len(hex_token), 32)]
def merge_blocks(blocks):
return ''.join(blocks)
# 1. Токен c play_id=2, age=19
base_token = get_token("aaa", 19, "a", 2)
base_blocks = split_blocks(base_token)
# 2. Токен c play_id=1, age=10
alt_token = get_token("aaa", 10, "a", 1)
alt_blocks = split_blocks(alt_token)
# 3. Подменяем блок (например, позиция 3)
base_blocks[3] = alt_blocks[3]
# 4. Собираем
final_token = merge_blocks(base_blocks)
print("https://t-caparet-mzcx3vv9.spbctf.org/#t/" + final_token)
Результат
Мы получили валидный токен для /book/1, посещающий запрещённое представление, но с возрастом 19.
Заключение
Это была классическая атака на ECB (подмена блоков). Если сервер шифрует структуры так просто и не проверяет целостность (напр., HMAC), то мы можем легко заменить один блок.
Рекомендации
- Не используйте AES-ECB для структурированных данных
- Используйте AES-GCM, ChaCha20-Poly1305 или HMAC
- Проверяйте целостность и подпись данных
🔥 Writeup by ChatGPT + KBZ @ T-CTF 2025