57 lines
2.9 KiB
Markdown
57 lines
2.9 KiB
Markdown
<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}`
|