AI-writeup "Капаре"

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-режиме.

Подготовка

  1. Получаем токен с play_id=2 и age=19:
{"name":"aaa","age":19,"comment":"a","play_id":2}
  1. Получаем токен с 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), то мы можем легко заменить один блок.

Рекомендации

  1. Не используйте AES-ECB для структурированных данных
  2. Используйте AES-GCM, ChaCha20-Poly1305 или HMAC
  3. Проверяйте целостность и подпись данных



🔥 Writeup by ChatGPT + KBZ @ T-CTF 2025

Report Page