Offensive Pensting: Vulnversity

José Carlos - Z3r0 Sec
7 min readJul 11, 2023

--

1. TryHackMe Vulnversity

Bom dia, boa tarde e boa noite a todos, estou iniciando uma série de write-ups sobre as máquinas presentes na trilha de Offensive Pentesting da plataforma TryHackMe.

Hoje estarei mostrando a resolução da primeira máquina a Vulnversity, essa é uma máquina de nível fácil e tem como principal objetivo mostrar na prática alguns conceitos básicos de pentesting, as tags pricipais dessa máquina são:

  • Reconhecimento Ativo;
  • Segurança de aplicações Web;
  • Escalonamento de privilégios;

Reconhecimento

A parte mais importante de um pentesting e tendo isso em vista o desafio separa uma seção de tarefas voltadas somente ao reconhecimento.

Para um reconhecimento inicial e muito básico vamos utilzar o nmap da seguinte forma:

nmap -sV ip-da-máquina-alvo
  • -sV: Informa a versão dos serviços que estão rodando na máquina alvo

O comando foi o mesmo, só redirecionei a saída para um arquivo chamado “nmap.out”

nmap -sV 10.10.90.25> nmap.out

A saída foi a seguinte:

Nmap scan report for 10.10.90.25
Host is up (0.21s latency).
Not shown: 994 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
3128/tcp open http-proxy Squid http proxy 3.5.12
3333/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Com esse scan já podemos responder as questões:

  • Scan the box; how many ports are open? R: 6 (Podemos visualizar as 6 portas abertas no resultado do nosso scan);
  • What version of the squid proxy is running on the machine? R: 3.5.12 (Olhando a porta 3128 podemos notar que o serviço rodando nessa porta é o Squid Http proxy 3.5.12);
  • How many ports will Nmap scan if the flag -p-400 was used? R: 400 (Essa questão não está diretamente ligada ao nosso scan, mas sim ao seu conhecimento sobre a ferramenta nmap, a flag “-p” nos permite especificar uma porta ou um range de portas que serão escaneadas)
  • What is the most likely operating system this machine is running? R: Ubuntu (Basta observar a porta 22 e 3333 onde os serviços listam o sistema operacional alvo);
  • What port is the web server running on? R: 3333 (3333 é a porta onde o Apache está rodando, o Apache é um servidor web. Caso queira saber mais sobre o Apache clique aqui);
  • What is the flag for enabling verbose mode using Nmap? R: -v (Outra questão sobre conhecimento da ferramenta, a flag -v ativa o modo verbose que nos fornece mais detalhes sobre o scan).

Localizando diretórios com o Gobuster

Antes de tudo vamos falar sobre a ferramenta, o Gobuster é uma ferramenta para ataques de força bruta em URIs (diretórios e arquivos), subdomínios e nomes de virtual host, para saber mais sobre a ferramenta clique aqui.

Antes de iniciarmos a busca com a ferramenta é valido analisar o site, colocando 10.10.90.25:3333 (IP:PORT) vamos nos deparar com o seguinte site:

2. Vulversity site — TryHackMe

Agora que demos uma olhada no site vamos partir para a ferramenta, a sintaxe de uso do gobuster é a seguinte:

gobuster dir -u URL_DO_SITE_ALVO -w WORDLIST
  • dir: Habilita a enumeração de diretórios e arquivos;
  • -u: Flag onde informamos o alvo;
  • -w: Flag onde informamos a wordlist que iremos utilizar no ataque de força bruta;

O sistema que estou utilizando (Kali Linux) já contém algumas wordlists prontas para esse tipo de testes, caso você não esteja utilizando o Kali basta acessar esse repositório -> SecLists. A seclists é um repositório que contém diversas wordlists para os mais variados ataques.

A sintaxe que utilizei foi a seguinte:

gobuster dir -u http://10.10.90.25:3333/ -w /usr/share/wordlists/dirbuster/directory-list-1.0.txt

O resultado foi:

===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.90.25:3333/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-1.0.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.5
[+] Timeout: 10s
===============================================================
2023/07/11 17:29:46 Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 318] [--> http://10.10.90.25:3333/images/]
/css (Status: 301) [Size: 315] [--> http://10.10.90.25:3333/css/]
/js (Status: 301) [Size: 314] [--> http://10.10.90.25:3333/js/]
/internal (Status: 301) [Size: 320] [--> http://10.10.90.25:3333/internal/]

/images, /css e /js são diretórios padrões em sites mas /internal é um diretório único desse site e ao acessar esse diretório nos deparamos com esse formulário de upload:

3. Vulnversity TryHackMe — Upload Form

Com essas informações já podemos responder a questão do desafio

  • What is the directory that has an upload form page? R: /internal (Como vimos acima esse diretório contém um formulário de upload).

Compromisse Webserver

Agora que temos um vetor de entrada só precisamos comprometer a aplicação web por meio desse vetor, para isso vamos precisar estudar um pouco como funciona o formulário de upload. O desafio separa isso por etapas e se torna muito fácil entender como se comporta a funcionalidade de upload do site:

  • What common file type you’d want to upload to exploit the server is blocked? R: .php. A aplicação aceita quase todo tipo de extensão, recusa apenas a extensão “.php”, para descobrir isso basta utilizar o upload da página e tentar realizar o upload de uma shell php. Uma outra maneira de verificar isso seria utilizando um proxy, nesse caso o BurpSuite, para interceptar a requisição e fazer um fuzzing na extensão do arquivo enviado e com isso analisar a resposta da aplicação para cada extensão enviada, isso é feito da seguinte forma:
4. BurpSuite Request

Eu interceptei a requisição do upload e vou envia-la para o intruder do Burp:

4.1. Burp Request — Intruder

Agora vamos definir onde será realizado o fuzzing

4.1.2. Burp Request — Intruder

O tipo de ataque é o “Sniper”, após selecionar ele vamos até a aba “Payloads” e informamos as extensões que utilizaremos no fuzzing:

4.1.3. Burp Suite — Intruder

O resultado do ataque foi:

Agora sabemos que a extensão aceita pela aplicação é “phtml”.

Agora podemos realizar uma upload de uma shell php com a extensão .phtml e ganhar acesso a máquina, para isso precisamos iniciar o netcat para escutar uma conexão recebida na porta definida no arquivo da shell, a porta que eu escolhi para receber a conexão reversa foi a 4444:

sudo nc -lvnp 4444

agora só precisamos realizar o upload e acessar o arquivo da shell em “http://10.10.90.25:3333/internal/uploads/shell.phtml”:

E temos uma shell, agora que estamos com acesso a máquina vamos responder as questões do desafio:

  • What is the name of the user who manages the webserver? R: bill (Para descobrir isso basta realizar uma enumeração rápida dos usuários indo a /home e com um simples “ls” você ira listar as pastas dos usuários e notar que só há o usuário “bill” presente no servidor).
  • What is the user flag? R: 8bd7992fbe8a6ad22a63361004cfcedb (A flag é facilmente encontrada em /home/bill/user.txt).

Privilege Escalation

Chegamos a ultima etapa, a escalada de privilégios. Essa etapa é muito importante, já que comprometemos o servidor, precisamos atingir o usuário com maior permissão dentro do servidor, o usuário root.

Vamos utilizar do SUID para escalar até o usuário root, o SUID permite que um usuário execute um arquivo com a permissão do dono do arquivo, lembrando que essas permissões são temporárias e duram somente durante a execução do arquivo. Para iniciarmos a escalada precisaremos enumerar os arquivos que possuem o SUID ativo, podemos fazer isso com o seguinte comando:

find / -perm -u=s -type f 2>/dev/null

O resultado da busca nos mostra todos os arquivos que possuem SUID ativo:

Tudo aparentemente comum, com exceção do “/bin/systemctl” que não deveria estar com o SUID ativo já que possui um vetor de escalada, consultado o GTFO Bins podemos consultar como é feita a escalada de privilégios utilizando o systemctl com SUID ativo:

Aplicando isso em nosso cenário é possível escalar para o usuário root:

Eu utilizei o vetor de escalado do systemctl para executar o comando “chmod +s /bin/bash” para adicionar o SUID no bash, me permitindo executar o bash com as permissões de root.

Agora podemos responder a ultima questão

  • It’s challenge time! We have guided you through this far. Can you exploit this system further to escalate your privileges and get the final answer?Become root and get the last flag (/root/root.txt) R: a58ff8579f0a9270368d33a9966c7fd5.

Essa foi a primeira de muitas máquinas da trilha de Offensive Pentesting, agradeço o tempo disponibilizado para a leitura. Alguns pontos eu não pude me aprofundar muito devido a extensão do assunto e para fins didáticos eu vou deixar alguns conteudos de estudo para aqueles que desejam entender mais sobre hacking:

São as duas trilhas que fiz e que me deram conhecimento para completar essa máquina e algumas outras dentro da plataforma, mas caso você deseje aprender mais eu recomendo fortemente que não se limite somente a essa plataforma ou a um curso, a comunidade é grande e disponibiliza muito conteudo gratuito.

--

--