Bucket

Difficulty: Medium | OS: Linux | Amazon S3 - Amazon DynamoDB

Walkthrough - Youtube Habemus Shell


HackTheBox Machine


Scanning


image.png

Services and Versions


Exploration


Port 80 - HTTP


  • Análise passiva das tecnologias que estão nessa página web:

  • Analisando o código-fonte da página, encontramos as imagens linkadas em um outro subdomínio chamado: s3.bucket.htb

  • Podemos então colocar esse novo subdomínio no /etc/hosts para podermos ter rota para ele.

  • Analisando melhor via Burp a response, vimos que no cabeçalho da response temos algumas informações que indicam ser um serviço Amazon S3.

  • Pesquisa rápida no google conseguimos confirmar a nossa premissa.

Enumeração Amazon S3


  • Vamos então descobrir qual o bucket desse amazon S3

  • Descobrimos então, como no código-fonte que o bucket se chama adserver

  • Vamos listar todo o bucket adserver

  • Conseguimos listar, então tentamos também escrever nesse bucket, enviando uma poc simples.

  • Após confirmarmos que ele fez o upload com sucesso, podemos entrar na aplicação web via browser e confirmar a nossa poc

  • IMPORTANTE: o alvo limpa rapidamente o nosso arquivo, caso não funcione de primeira, tente novamente, mas seja rápido, pois ele limpa.

  • Como vimos no inicio que nossa página tem tecnologia php , podemos então fazer um upload de um reverse shell em php

  • Após isso fazemos o mesmo procedimento anterior de realizar o upload para o alvo.

  • Antes de executar deixe um listening na porta escolhida, no meu caso foi a porta 443

Initial Access


  • E conseguimos acesso ao alvo.

  • Vamos melhorar esse shell para que possamos ter mais liberdade de execução de comandos.

  • Fomos no local que é comum ter a flag de user.txt, ela estava na pasta pessoal do usuário roy

  • Porém, não temos permissão de leitura, apenas o usuário roy pode ler a flag.

  • Começamos então a fazer uma enumeração do alvo, a fim de tentar escalação de privilégio horizontal para o usuário roy

  • Ainda na pasta do usuário roy , temos uma pasta que foge do padrão, chamada project

  • Nela temos um arquivo chamado db.php que nos chama a atenção, pois pode ser dado do banco de dados, e com isso podemos encontrar credenciais.

  • Não temos credenciais em hardcode, mas temos uma informação importante. É um arquivo de configuração para se comunicar com o DynamoDB

  • Amazon DynamoDB é um serviço de banco de dados NoSQL gerenciado pela AWS

Enumeração DynamoDB


  • Podemos então tentar listar as tabelas do banco de dados com o comando abaixo.

  • Caso você receba esse erro, irá precisar configurar um profile para a aws cli.

  • Utilize o comando abaixo para configurar o perfil para a AWS CLI.

  • Observe que recebemos um erro ao terminar de configurar, pois ele tenta salvar no arquivo /var/www/.aws que não temos permissão alteração.

  • Alteramos então a variável de ambiente HOME para que ele salve esse arquivo em um diretório que possamos editar.

  • Obs: observe que apenas a região e o formato de saída eu defini. A região fica fácil, pois estava no arquivo de configuração db.php o formato de saída não importa pra gente, mas eu quis colocar json.

  • Podemos tentar listar novamente as tabelas do banco de dados

  • Agora obtivemos sucesso nessa listagem, e temos apenas a tabela Users

  • Vamos então descobrir todos os valores que temos na tabela users:

  • Observe que conseguimos listar a tabela Users, e encontramos diversas senhas com alguns usernames.

  • Algo bem comum e que podemos tentar é o reaproveitamento de senhas.

  • Vamos tentar autenticar com o usuário roy com uma dessas 3 senhas encontradas.

  • Após as tentativas, conseguimos logar com uma das senhas no usuário roy e conseguimos ler a primeira flag user.txt

Privilege Escalation


  • Vamos agora continuar nossa enumeração, dessa vez com o usuário roy

  • Analisando as portas que temos no alvo, temos algumas portas rodando apenas do lado do alvo (127.0.0.1)

  • 4566 vimos que é a do DynamoDB, mas ainda temos a porta 8000

  • Realizamos um Reverse Port Forward com o chisel

  • Aqui podemos confirmar que foi aberto a porta 8000 no nosso Kali, ou seja, ela está com o trafego do alvo sendo redirecionado para ela.

  • Podemos entrar no nosso navegador e acessar a porta 8000 através do nosso localhost.

  • Executando um Fuzzing, encontramos alguns caminhos interessantes como: files, index.php, server-satatus e vendor

  • Em /files/ temos um index of aberto.

  • Na nossa enumeração inicial, encontramos a pasta bucket-app em /var/www/ pasta padrão de webroot.

  • E nela encontramos um arquivo index.php , que normalmente é o arquivo principal de um site.

  • Analisando o mesmo, encontramos algo interessante:

circle-check
  • Ok, agora que entendemos o código, vamos analisar novamente as tabelas que temos no nosso banco de dados

  • E como vimos, só temos a tabela users

  • Ou seja, se tentarmos enviar uma requisição POST com a ação esperada, como não existe a tabela no banco de dados, vamos receber um status code 500 de erro interno do servidor.

  • Vamos então criar uma nova tabela no banco de dados. Podemos usar como auxílio a documentação da Amazon DynamoDB oficial.

  • Porém, quando pensamos em CLI, temos um problema nessa documentação. Pois, os parâmetros --attribute-definitions, --key-schema e --provisioned-throughput precisam que os dados sejam fornecidos como listas JSON.

  • E eu coloquei essa opção --provisioned-throughput ,pois ela permite que você controle a capacidade da tabela.

  • Criar tabela:

  • Aqui conseguimos confirmar que a tabela foi criada.

triangle-exclamation

  • Agora vamos criar um alerta de Ransomware, pois vimos no código index.php que ele só vai triggar quando encontrar um alerta de Ransomware.

  • Alerta criado.

  • Vamos agora fazer uma requisição POST com a ação de get_alerts para que a cadeia de ações do código do index.php seja executada.

  • E aqui conseguimos ver que ele realmente salvou em /files/ os arquivos criados.

  • O html com um nome aleatório como dizia o código, e com o html foi criado um arquivo pdf.

  • Bom, já vimos que estamos conseguindo executar e toda a chain necessária.

  • Vamos então tentar ler um arquivo interno da pasta root para podermos conseguir ler, vamos usar a tag <iframe com uma origem src , e vamos apontar para a chave privada do usuário root

  • Refazemos todos os passos. Lembre-se de fazer rápido, pois o alvo limpa as nossas alterações.

  • Nesse caso, o meu html deu errado, talvez pq não coloquei todas as tags de um script html.

  • Porém, o pdf criado com o conteúdo do html foi sucesso, e trouxe o arquivo de chave privada id_rsa que solicitamos.

  • Salvamos essa chave privada em um arquivo em nossa máquina.

  • Há a necessidade da alteração das permissões da chave privada, senão o utilitário ssh não irá aceitar.

  • Podemos então nos conectar com o usuário root passando a chave privada que obtivemos.

  • E conseguimos acessar como usuário root no alvo.

  • E podemos ler a última flag root.txt

circle-check

Last updated