Pwning - Covfefe: 1

30 VMs em 30 dias [ 27 ] - Beco do Exploit

Mateus Taveira
6 min readDec 27, 2023

Covfefe is my Debian 9 based B2R VM, originally created as a CTF for SecTalks_BNE. It has three flags.

It is intended for beginners and requires enumeration then [spoiler]!

Material de Apoio

Reconhecimento

Como sempre, antes de partirmos para a exploração em si, precisamos definir nosso vetor de ataque: a rede, pois é somente por meio dela que conseguiremos nos comunicar com a máquina alvo, de acordo com o escopo do CTF.

Para tal, é fundamentar que tenhamos o endereço IP dela, pois é ele que nos permitirá a troca de dados, e por consequência, a exploração disso. Algumas ferramentas podem nos proporcionar isso, como arp-scan, netdiscover e nmap, mas a primeira já nos serviu muito bem…

arp-scan -I <interface> <ip-rede>/<mascara>

Com essa informação, somos capazes de utilizar o nmap para enumerar as portas e seus respectivos serviços, pois é justamente da má configuração de algum deles que vamos abusar.

nmap -sV -p- <ip-addr>

Descobrimos então três serviços, dois HTTP e um SSH. Que tal começarmos enumerando as páginas Web? Vamos primeiro pela porta 80…

Trata-se de um nginx recém instalado, visto que essa página é padrão para novas instalações. Dessa forma, podemos usar o dirb para fazer uma listagem de arquivos e diretórios por meio de Brute Force:

Absolutamente nada encontrado… e no site que está rodando na porta 31337?

Humm, interessante, um erro não tratado indica possíveis falhas não corrigidas ou identificadas. Vamos então fazer a enumeração desse site também com dirb:

Dessa vez encontramos 5 possíbilidades de caminhos, mas um em específico chamou muita atenção: o .ssh. Ao tentarmos o acessar, descobrimos que na verdade se trata de um diretório e que dentro dele há arquivos sensíveis acerca desse serviço.

Basicamente, ele armazena o par de chaves de alguma conexão SSH. Podemos então tentar recuperar esses arquivos:

E perfeito, se esse par de chaves ainda for válido, vamos ser capazes de estabelecer uma conexão entre nós.

Exploração

Com isso, conseguimos a informação do usuário a ser conectado através do final do arquivo id_rsa.pub:

Agora, para descobrirmos a senha referente à chave privada, precisamos converter antes de SSH para um formato que o John consiga compreender e fazer suas operações. Com, esse intuito, utilizamos o ssh2john:

sar2john id_rsa > <arquivo>

E com isso formatadinho podemos, finalmente, descobrir a senha desse usuário através das chaves expostas.

john <arquivo>

E ótimo! A senha do usuário “simon@covfefe” é “starwars”!! Vamos confirmar tentando acessar através da porta 22.

Antes, damos permissão 600 para o id_rsa, pois se trata de exigência quando o assunto é chaves SSH.

Aháaaa!! Estamos dentro do alvo!

Escalação de Privilégio

Uma das várias coisas que podemos fazer ao cairmos em uma máquina desconhecida e em busca de escalar privilégios, é ver o histórico de comando no .bash_history, pois pode revelar alguma senha, arquivo, informação…

cat ~/.bash_history

Reparamos que um comando foi executado, de nome “read_message”. Ao executarmos para ver do que se trata, basicamente é um script que solicita um nome, e caso esse nome seja “Simon”, é dito que há uma mensagem pra ele, a qual informa que o código fonte desse programa está no diretório home do Charlie Root (/root/).

Vamos então dar uma olhana nesse código fonte que está no /root:

Basicamente ele foi escrito em C, sendo bem curto, onde basicamente executa o binário “message” como root caso o nome digitado seja igual a “Simon”.

Entretanto, há algo curioso nesse programa: a nossa entrada é armazenada em um buffer com tamanho máximo de 20 bytes, mas e se ultrapassarmos isso?

Huum, o programa foi executado normalmente, entretanto não entrou na condicional verdadeira, pois ela testa se os 5 (cinco) primeiros caracteres são iguais a “Simon”. Vamos testar dessa forma então:

Entramos na condicional, mas deu erro de segmentação da memória, pois estouramos demais o Buffer, o que causou sérios problemas no funcionamento do programa. Vamos então clocar “Simon” seguido por 15 outros caracteres, para totalizar o limite de bytes do buffer:

Estamos no limite desse buffer, e como pode ser observado, a mensagem não foi exibida, e isso se dá graças ao conceito de pilha, onde ao estourarmos os limites de uma variável na memória do sistema, o que digitamos a mais sobrescreverá o conteúdo da que está imediatamente abaixo, que no nosso caso é a variável com o caminho a ser executado com permissão root, onde está o binário “message”.

A explicação é um pouco mais complexa do que isso, então recomendamos que procure ainda mais sobre!

Sabendo disso, podemos alterar esse caminho, para que execute o que desejarmos…

E prontinho, aqui está… Máquina Ownada com sucesso!!!

Correções de Vulnerabilidades

  • Mantenha as aplicações constantemente atualizadas;]
  • Não armazene arquivos sensíveis em diretórios do site, muito menos com nomes padrões;
  • Bloqueie a leitura de arquivos sensíveis pelo usuário que está rodando o serviço Web;
  • Adicione uma camada de segurança onde só é possível conectar por SSH a partir de verificações de IP em Whitelist ou outros critérios com mesmo objetivo;
  • Não exponha o código fonte de programas internos para usuários que não tenham real necessidade;
  • Faça testes e auditoria nas aplicações criadas internamente;

Mas se preferir poupar trabalho, utilize apenas o seguinte comando:

Exploração e Write-up feita com o Luís Santos. Acompanhe os próximos capítulos em nossos perfis!!

https://www.linkedin.com/in/mateus-taveira/

https://www.linkedin.com/in/luis-santos-defensive-security/

--

--

Mateus Taveira

💉Development runs through my veins. 🩸 Cyber Security is my blood.