Skip to content

Files

Latest commit

db9b998 · Nov 6, 2022

History

History

web-uptime

medium | web | uptime

Описание

Очень модно стало сейчас использовать всякие метрики, логи и остальные новомодные технологии, чтобы оценивать работу системы, да только ПМам эти графики мало информации дают... Попросили сделать простенькую обёртку — живо наше приложение или нет. Мы поковырялись, что-то вроде вышло, но выглядит мудрёно, если честно.

Информация

Лик метрики с флагом через инъекцию в PromQL запрос.

Решение

Дан исходный код, в котором основной интерес представляет сама настройка сервисов в docker-compose.yml - поднято 2 инстанса некого приложения, Prometheus, а также некий дешборд. Явно видно, что к приложению у нас нет доступа — он открыт только во внутренней сети, поэтому его имеет смысл только кратко просмотреть. К дешборду, наоборот, доступ есть, всё, что он делает — это отображает статус инстансов приложения.

Далее ход решения такой:

  1. По настройкам прометея в prometheus.yml видно, что он ходит собирать метрики на инстансы приложения, поэтому ищем там эндпоинт /metrics.
  2. Приложение репортит метрики вручную, добавляя метрику "app", содержащую флаг в одном из лейблов. Так как ходить напрямую к инстансам мы не можем, делаем вывод, что нужно будет как-то через метрики прометея достать эту информацию.
  3. Открыв код дешборда, в глаза сразу бросается инъекция в запросе PromQL:
    `up{instance="${instance}"}`
  4. Почитав документацию PromQL несложно наткнуться на пункт про group_left и group_right, позволяющие объединять лейблы нескольких метрик.
  5. Так как в данном случае мы контролируем только правую часть, воспользуемся group_right для создания такого пейлоада:
    instance=1"} / on () group_right app #
    

Эксплоит

Флаг

ptzctf{metrics-are-fun}