Offensive Pensting: 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:
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:
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:
Eu interceptei a requisição do upload e vou envia-la para o intruder do Burp:
Agora vamos definir onde será realizado o fuzzing
O tipo de ataque é o “Sniper”, após selecionar ele vamos até a aba “Payloads” e informamos as extensões que utilizaremos no fuzzing:
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:
- https://tryhackme.com/paths → Trilha iniciante, contém alguns conceitos básicos de cybersec;
- https://tryhackme.com/paths → Trilha de pentester Jr, contém assuntos mais profundos relacionados a pentesting;
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.