GoodGames
https://app.hackthebox.com/machines/GoodGames
Sumário
A avaliação de segurança da infraestrutura do GoodGames revelou uma cadeia crítica de vulnerabilidades, iniciando com uma Injeção de SQL (SQLi) não autenticada na aplicação web pública. Essa falha permitiu a extração de credenciais administrativas, levando a uma vulnerabilidade secundária de Injeção de Template no Lado do Servidor (SSTI) dentro de um portal de gerenciamento interno. A exploração do SSTI resultou em Execução Remota de Código (RCE) como usuário root dentro de um ambiente de container. Finalmente, uma configuração incorreta na estratégia de montagem de volumes do Docker, combinada com a reutilização de credenciais, permitiu uma fuga do container (breakout) para o sistema host, resultando no comprometimento administrativo total do servidor.
Cadeia de Ataque (Kill Chain)
Reconhecimento
Varredura Ativa (T1595) foi utilizada para identificar portas abertas e versões de serviços.
Acesso Inicial
A exploração de uma aplicação voltada para a internet (T1190) via Injeção de SQL garantiu acesso ao portal web.
Execução
Um interpretador de comandos e scripts (T1059) foi alavancado via SSTI para executar uma reverse shell baseada em Python.
Persistência
Contas válidas (T1078) foram utilizadas para acesso SSH ao host após a descoberta de reutilização de credenciais.
Descoberta
A descoberta de arquivos e diretórios (T1083) identificou os pontos de montagem de volume compartilhado e o usuário augustus.
Movimentação Lateral
Serviços remotos (T1021.004) via SSH permitiram a movimentação do container para o host.
Escalação de Privilégios
O abuso de executáveis SUID/SGID (T1548.001) através do volume compartilhado do Docker permitiu a elevação de privilégios para root no host.
Reconhecimento
A interação inicial com o alvo começou com uma verificação de conectividade e descoberta de serviços para definir a superfície de ataque.
Descoberta de Host
#attack/T1018
Uma requisição de eco ICMP foi enviada para o IP alvo 10.10.11.130. O TTL retornado de 63 sugere que o host é provavelmente um sistema baseado em Linux.
attacker> ping -c 1 10.10.11.130
PING 10.10.11.130 (10.10.11.130) 56(84) bytes of data.
64 bytes from 10.10.11.130: icmp_seq=1 ttl=63 time=167 ms
--- 10.10.11.130 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 167.227/167.227/167.227/0.000 msEnumeração de Rede
#attack/T1046 #attack/T1595
Uma varredura completa de portas TCP foi conduzida usando rustscan para identificar portas abertas e versões de serviços.
A varredura revelou uma única porta aberta (80) executando um servidor web Apache. Notavelmente, o cabeçalho http-server-header indica que o backend é alimentado por Werkzeug 2.0.2 e Python 3.9.2, o que é característico de uma aplicação web baseada em Flask. O serviço também vazou um hostname: goodgames.htb.
O hostname identificado foi adicionado ao arquivo local /etc/hosts para permitir o roteamento correto do virtual host.
Exploração Web
Uma varredura secundária usando whatweb confirmou a presença do Python 3.9.2 e do framework Werkzeug. A aplicação utiliza Bootstrap e JQuery em seu frontend.
A página inicial apresenta uma interface de comunidade e loja de jogos. Uma função de login foi identificada, fornecendo um ponto de entrada potencial para ataques baseados em autenticação.
Bypass de Autenticação (SQL Injection)
#attack/T1190 #owasp/A05_2025
Durante a avaliação do endpoint /login, uma vulnerabilidade de Injeção de SQL (SQLi) foi identificada no parâmetro email. Ao enviar uma tautologia, foi possível burlar o mecanismo de autenticação.
Descoberta: Injeção de SQL (Bypass de Autenticação)
Ativo Afetado:
http://goodgames.htb/loginSeveridade: Crítica
Tipo de Vulnerabilidade: Injeção de SQL Não Autenticada
Passos para Reprodução:
Navegue até a página de login em
http://goodgames.htb/login.Intercepte a requisição de login usando um proxy web.
Injete o payload
admin@goodgames.htb' or 1=1-- -no campoemail.Observe o redirecionamento bem-sucedido e a emissão de um cookie de sessão.
Remediação: Implemente declarações preparadas (prepared statements) com consultas parametrizadas para todas as interações com o banco de dados, garantindo que a entrada do usuário seja tratada como dados, não como código executável.
A seguinte requisição POST demonstra a exploração da vulnerabilidade:
O servidor respondeu com um 200 OK e configurou um cookie de sessão, indicando um bypass bem-sucedido como o usuário administrativo.
Acesso Autenticado
O cookie de sessão foi importado para o navegador, garantindo acesso ao painel interno.
Ao fazer o login, um ícone "Admin Panel" tornou-se visível. Inspecionar o link revelou um novo subdomínio interno: http://internal-administration.goodgames.htb/.
Este subdomínio foi adicionado ao arquivo /etc/hosts para posterior enumeração.
Enumeração do Admin Interno
#attack/T1083 #attack/T1592
Ao obter acesso autenticado ao site principal, uma interface administrativa foi descoberta em http://internal-administration.goodgames.htb/. Este portal parece ser uma aplicação Flask separada usada para gerenciamento de backend.
Exfiltração de Banco de Dados via SQL Injection
#attack/T1190 #owasp/A05_2025
A vulnerabilidade de Injeção de SQL identificada anteriormente no endpoint /login do goodgames.htb foi alavancada para realizar a exfiltração de dados. Como a aplicação retorna comprimentos de resposta diferentes com base no sucesso da consulta, uma abordagem baseada em UNION foi utilizada para extrair informações sensíveis do banco de dados backend.
Descoberta: Injeção de SQL (Exfiltração de Dados)
Ativo Afetado:
http://goodgames.htb/loginSeveridade: Crítica
Tipo de Vulnerabilidade: Injeção de SQL Baseada em UNION
Passos para Reprodução:
Envie um payload
UNION SELECTpara o parâmetroemail.Determine o número de colunas usando
ORDER BY.Use a coluna refletida para exibir a saída de funções do banco de dados (ex:
version(),user()).Consulte o
information_schemapara mapear a estrutura do banco de dados e realizar o dump da tabelauser.
Remediação: Implemente validação rigorosa de entrada e use consultas parametrizadas. Garanta que o usuário do banco de dados tenha o menor privilégio necessário.
1. Enumeração de Colunas
O número de colunas na consulta atual foi determinado usando a cláusula ORDER BY. Uma resposta indicando um login bem-sucedido foi recebida com ORDER BY 4, enquanto ORDER BY 5 resultou em um erro, confirmando uma estrutura de 4 colunas.
2. Identificando Pontos de Reflexão
Uma instrução UNION SELECT foi usada para identificar qual coluna reflete dados de volta para a interface do usuário. A quarta coluna foi identificada como sendo renderizada dentro da mensagem "Welcome" na página de login bem-sucedido.
Antes do dump do banco de dados, um teste rápido de Injeção de Template no Lado do Servidor (SSTI) foi realizado injetando {{7*7}}. No entanto, o payload foi refletido literalmente, sugerindo que a entrada não está sendo processada pelo motor de template Jinja2 neste ponto de reflexão específico.
3. Mapeamento do Esquema do Banco de Dados
Com o ponto de reflexão confirmado, o ambiente do banco de dados foi enumerado. O sistema foi identificado como MySQL 8.0.27, rodando com o usuário main_admin@localhost em um banco de dados chamado main.
Posterior enumeração das tabelas e colunas no information_schema identificou uma tabela user contendo credenciais sensíveis.
4. Extração e Quebra de Credenciais
#attack/T1110_002 #attack/T1212
As colunas email, name e password foram extraídas da tabela user, revelando uma credencial.
O hash administrativo (2b22337f218b2d82dfc3b6f77e7cb8ec) foi identificado como um hash MD5 padrão. Um ataque de força bruta offline foi realizado usando John the Ripper e a wordlist rockyou.txt.
Credenciais Obtidas
A senha administrativa para admin@goodgames.htb foi recuperada com sucesso: superadministrator.
Execução
Injeção de Template no Lado do Servidor (SSTI)
#attack/T1190 #owasp/A05_2025
Com as credenciais administrativas admin:superadministrator recuperadas do banco de dados principal, obteve-se acesso à interface de gerenciamento interna em http://internal-administration.goodgames.htb.
Ao acessar o sistema de forma autenticada, a página "Settings" foi identificada como um vetor potencial para vulnerabilidades baseadas em entrada. Especificamente, o campo responsável por atualizar o nome do usuário refletia a entrada de volta no cabeçalho do perfil do usuário.
O teste para Injeção de Template no Lado do Servidor (SSTI) foi realizado enviando a expressão matemática {{7*7}}. A aplicação renderizou o resultado 49 na visualização do perfil, confirmando que o motor de template de backend — identificado como Jinja2 — estava executando código dentro dos delimitadores de chaves duplas.
Descoberta: SSTI para RCE
Ativo Afetado:
http://internal-administration.goodgames.htb/settingsSeveridade: Crítica
Tipo de Vulnerabilidade: Execução Remota de Código (RCE) via SSTI
Passos para Reprodução:
Faça login no portal interno usando credenciais administrativas.
Navegue até o endpoint
/settings.Injete um payload Jinja2 no campo de nome (ex:
{{ cycler.__init__.__globals__.os.popen('id').read() }}).Salve as configurações e visualize a página de perfil para disparar a execução.
Remediação: Configure o motor de template para usar um modo "Sandbox" que restrinja o acesso a objetos globais perigosos ou, preferencialmente, evite renderizar entradas fornecidas pelo usuário diretamente através do motor de template.
RCE e Descoberta de Ambiente
Para confirmar a Execução Remota de Código (RCE), um payload direcionado ao método os.popen foi utilizado. A execução do comando id revelou que a aplicação estava rodando com privilégios de root.
Acesso Inicial
#attack/T1059_004
Para estabelecer uma sessão interativa mais estável, um payload de reverse shell foi injetado através da vulnerabilidade SSTI após verificar a conectividade de saída via curl.
Um listener na máquina do atacante recebeu a conexão de entrada:
Shell Root no Container
Um shell totalmente interativo foi obtido como o usuário root dentro do container Docker.
O shell foi estabilizado usando técnicas padrão de TTY para permitir a navegação adequada de comandos e manipulação de sinais.
A enumeração do diretório /home revelou um usuário chamado augustus. Embora a sessão atual fosse de root, a flag de usuário foi localizada dentro deste diretório home.
Movimentação Lateral
Fuga de Container e Descoberta de Host
#attack/T1611
Enquanto operava como root dentro do container Docker, uma discrepância foi notada: o diretório /home/augustus existia apesar do usuário augustus não estar presente no arquivo /etc/passwd do container. A investigação dos pontos de montagem confirmou que este diretório é um volume compartilhado montado a partir da partição física do host (/dev/sda1).
A interface de rede do container (eth0) mostrava um endereço IP 172.19.0.2. Com base em configurações padrão de gateway do Docker, assumiu-se que o host seria o 172.19.0.1. Uma verificação de conectividade confirmou isso.
Uma varredura de portas interna foi realizada do container para o host usando uma técnica de escaneamento TCP nativa em Bash, revelando que o host possuía SSH (Porta 22) e HTTP (Porta 80) abertos.
Estabelecendo Acesso ao Host (Reutilização de Credenciais)
#attack/T1110 #attack/T1078 #attack/T1021_004
Um ataque de reutilização de credenciais foi tentado usando a senha superadministrator (recuperada anteriormente via SQL Injection) para o usuário augustus identificado através do diretório home compartilhado.
Descoberta: Reutilização de Credenciais SSH
Ativo Afetado:
172.19.0.1(Máquina Host)Severidade: Alta
Tipo de Vulnerabilidade: Reutilização de Senha
Passos para Reprodução:
Identifique o endereço IP do host de dentro do container.
Use o nome de usuário
augustuse a senhasuperadministratorpara autenticar via SSH.
Remediação: Implemente uma política de senhas únicas e garanta que credenciais de nível de serviço não sejam compartilhadas com contas de usuário do sistema.
A autenticação foi bem-sucedida, fornecendo um shell no sistema host.
Escalação de Privilégios
Abuso de SUID via Volume Compartilhado
#attack/T1548_001 #attack/T1611
O volume compartilhado em /home/augustus fornece uma ponte entre o contexto root do container e o contexto augustus do host. Como o usuário root do container tem controle total sobre os arquivos neste diretório compartilhado, é possível criar um binário SUID no host manipulando o arquivo a partir do container.
Descoberta: Escalação de Privilégios via Volume Compartilhado (SUID)
Ativo Afetado:
172.19.0.1(Máquina Host)Severidade: Crítica
Tipo de Vulnerabilidade: Montagem Insegura de Volume Docker (Fuga de Container/PrivEsc)
Passos para Reprodução:
No host como
augustus, copie/bin/bashpara o diretório compartilhado/home/augustus/.No container como
root, altere o proprietário do bash copiado pararoot:root.No container como
root, defina o bit SUID no binário (chmod 4777).No host como
augustus, execute o binário com a flag-p.
Remediação: Evite montar diretórios sensíveis do host dentro de containers. Se uma montagem for necessária, use a flag ro (somente leitura) ou implemente User Namespacing (userns-remap) para evitar que o root do container mapeie para o root do host.
1. Preparando o Binário (Host)
Na máquina host, o binário padrão do Bash foi copiado para o diretório home.
2. Escalando Privilégios (Container)
Retornando à sessão do container, o usuário root modificou as permissões do binário localizado no volume compartilhado. Ao alterar o proprietário para root e aplicar o bit SUID, o binário tornou-se um vetor para escalação de privilégios no host.
3. Execução (Host)
De volta à sessão SSH do host, o usuário augustus executou o binário modificado com a flag -p para preservar o ID de usuário efetivo (EUID) de root.
A flag de root foi recuperada do diretório home administrativo:

Atualizado