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

Walkthrough - Youtube Habemus Shell
HackTheBox Machine
Scanning

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/hostspara 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 emphp

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árioroyPorém, não temos permissão de leitura, apenas o usuário
roypode 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
royAinda na pasta do usuário
roy, temos uma pasta que foge do padrão, chamadaprojectNela temos um arquivo chamado
db.phpque 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
DynamoDBAmazon 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
profilepara 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/.awsque não temos permissão alteração.

Alteramos então a variável de ambiente
HOMEpara 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.phpo 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
roycom uma dessas 3 senhas encontradas.

Após as tentativas, conseguimos logar com uma das senhas no usuário
roye conseguimos ler a primeira flaguser.txt
Privilege Escalation
Vamos agora continuar nossa enumeração, dessa vez com o usuário
royAnalisando 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 umindex ofaberto.

Na nossa enumeração inicial, encontramos a pasta
bucket-appem/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:

Análise do código:
1 - Podemos ver que ele também está fazendo uma comunicação com o banco de dados Amazon DynamoDB
2 - Ele faz um verificação se o método http é POST se sim, ele passa para outra condicional. Dentro dessa requisição POST, ele informa o parâmetro, chamado action e verifica se foi enviado uma ação chamada get_alerts . Ou seja, só executa se a ação for essa.
3 - Configura o cliente do DynamoDB para se conectar com o banco de dados de forma correta.
4 - Consulta ao DynamoDB $iterator = $client->getIterator('Scan', array( ... )); , na tabela chamada alerts
'TableName' => 'alerts' → indica a tabela a ser consultada
'FilterExpression' => "title = :title" -> Filtra os resultados para encontrar itens onde o "title" é igual a um valor específico.
'ExpressionAttributeValues' => array(":title"=>array("S"=>"Ransomware")): Define que o valor específico a ser procurado é "Ransomware".
Basicamente, ele está buscando todos os alertas cujo título é "Ransomware".
5 - Processa os resultados, ele faz uma iteração para cada alerta encontrado. Cada um que ele encontra, ele gera um HTML com nome aleatório e salva o conteúdo do alerta ( que esta no campo data do item do banco de dados) em um arquivo html
Após isso, ele executa um comando java que pega o arquivo html criado e o converte em um arquivo pdf
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
POSTcom a ação esperada, como não existe a tabela no banco de dados, vamos receber um status code500de 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-schemae--provisioned-throughputprecisam 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.
Obs: faça rápido, pois as rotinas do alvo limpam as mudanças que fizemos.

Agora vamos criar um alerta de Ransomware, pois vimos no código
index.phpque ele só vai triggar quando encontrar um alerta de Ransomware.
Alerta criado.

Vamos agora fazer uma requisição
POSTcom a ação deget_alertspara que a cadeia de ações do código doindex.phpseja 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
rootpara podermos conseguir ler, vamos usar a tag<iframecom uma origemsrc, e vamos apontar para a chave privada do usuáriorootRefazemos 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
pdfcriado com o conteúdo dohtmlfoi sucesso, e trouxe o arquivo de chave privadaid_rsaque 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
sshnão irá aceitar.

Podemos então nos conectar com o usuário
rootpassando a chave privada que obtivemos.E conseguimos acessar como usuário root no alvo.
E podemos ler a última flag
root.txt

Pessoal, há outras formas de fazer essa máquina. Principalmente na hora que estamos enumerando o DynamoDB. Porém, acredito que a enumeração via AWS CLI seja a mais indicada pois nem sempre teremos uma interface gráfica para podermos usufruir. Lembre-se: há uma automação de limpeza das nossas ações no alvo, então talvez você faça o uploade de um arquivo para o Bucket S3, ele vai exibir quando você listar o bucket, mas talvez não apareça na página web. Isso é normal nessa máquina, então tente novamente que irá funcionar! E tenha atenção na hora da criação da tabela, do alerta, da requisição e obtenção da informação do pdf. Pois, isso acaba sendo chato pela limpeza da máquina. Crie um script para que ele faça toda essa cadeia de forma automática, assim não vai ter tantos problemas.
Last updated