Очень модно стало сейчас использовать всякие метрики, логи и остальные новомодные технологии, чтобы оценивать работу системы, да только ПМам эти графики мало информации дают... Попросили сделать простенькую обёртку — живо наше приложение или нет. Мы поковырялись, что-то вроде вышло, но выглядит мудрёно, если честно.
Лик метрики с флагом через инъекцию в PromQL запрос.
Дан исходный код, в котором основной интерес представляет сама настройка сервисов в docker-compose.yml
- поднято 2 инстанса некого приложения, Prometheus, а также некий дешборд.
Явно видно, что к приложению у нас нет доступа — он открыт только во внутренней сети, поэтому его имеет смысл только кратко просмотреть.
К дешборду, наоборот, доступ есть, всё, что он делает — это отображает статус инстансов приложения.
Далее ход решения такой:
- По настройкам прометея в
prometheus.yml
видно, что он ходит собирать метрики на инстансы приложения, поэтому ищем там эндпоинт/metrics
. - Приложение репортит метрики вручную, добавляя метрику "app", содержащую флаг в одном из лейблов. Так как ходить напрямую к инстансам мы не можем, делаем вывод, что нужно будет как-то через метрики прометея достать эту информацию.
- Открыв код дешборда, в глаза сразу бросается инъекция в запросе
PromQL
:`up{instance="${instance}"}`
- Почитав документацию PromQL несложно наткнуться на пункт про
group_left
иgroup_right
, позволяющие объединять лейблы нескольких метрик. - Так как в данном случае мы контролируем только правую часть, воспользуемся
group_right
для создания такого пейлоада:instance=1"} / on () group_right app #
ptzctf{metrics-are-fun}