Init. commit

This commit is contained in:
Caplag
2026-04-22 10:42:16 +03:00
commit 98e51ca58b
35 changed files with 2371 additions and 0 deletions

56
web-ghostframe/WRITEUP.md Normal file
View File

@@ -0,0 +1,56 @@
<h1 align="center">GhostFrame</h1>
<p align="center">
<img src="https://img.shields.io/badge/category-Web-blueviolet" alt="Web"/>
<img src="https://img.shields.io/badge/points-804-yellow" alt="804 pts"/>
</p>
Из всех вводных в таске нам дается только URL. Сначала необходимо найти скрытую страницу, потом выкачать debug-бандл с [ONNX](https://onnx.ai/onnx/intro/)-моделью и метаданными, и потом уже собрать картинку, которая пройдёт все фильтры классификатора.
## Решение
Раз на главной пусто, начинаем с банального перебора директорий:
```bash
gobuster dir -u http://<ip>:<port> \
-w /usr/share/seclists/Discovery/Web-Content/common.txt
```
Всплывает скрытая страница `/backup`, внутри — ссылка на архив `prizrachny_kadr_export.zip`. Скачиваем, распаковываем:
| Файл | Назначение |
|---|---|
| `vision_gate.onnx` | Сам классификатор |
| `preprocess.json` | Список признаков и порог |
| `memory.log` | Лог прошлых попыток |
Самый полезный — `preprocess.json`. Формулы он прямо не раскрывает, но рассказывает, какие признаки модель считает:
```text
amber_ratio
blue_ratio
contrast
edge_density
filename_signal
metadata_signal
```
Точные пороги неизвестны — вытягиваем их через `/api/submit`. После каждой отправки сервис выводит чего именно не хватило. Из подсказок составляем полный набор требований:
| Признак | Требование |
|---|---|
| `filename_signal` | Имя файла содержит `lens`, `prism` или `lattice` |
| `metadata_signal` | [PNG `tEXt`](https://www.w3.org/TR/png/#11tEXt) `ghost-signal` начинается с `iris` |
| `amber_ratio` | Тёплый янтарный тон |
| `blue_ratio` | Заметный синий канал |
| `contrast` | Высокий |
| `edge_density` | Много резких границ |
PNG с шахматным или полосатым паттерном даст и контраст, и кучу граней. Красим его в янтарно-синий микс, называем `lattice-lens.png`, прописываем в метадате `ghost-signal=iris-lane` и отправляем на `/api/submit`. Score перевалил порог — сервис возвращает флаг. Автоматический пайплайн — [`solve/solver.py`](solve/solver.py):
```bash
python solve/solver.py http://<ip>:<port>
```
## Флаг
`caplag{3409b3f6f9e70dce81617ab19bd3016469b745fb0b9b007ed4967b4b5a3a6486}`