Resolução da maquina Quarkus do hackingclub.
A máquina Quarkus pertence ao Hackingclub, para poder ter acesso a essa máquina é necessário assinar o Hackingclub. | ||
A máquina está classificada como nível médio e seu sistema operacional é Linux. | ||
Reconhecimento | ||
Primeira etapa é fazer o reconhecimento inicial de portas e serviços disponíveis no alvo. Para essa finalidade utilizaremos a ferramenta Nmap. | ||
Nmap -sS -sV -v <IP> | ||
Resultado: | ||
Identificamos os serviços e as portas disponíveis, iniciaremos o reconhecimento do serviço web na porta 80. | ||
Acessando o serviço pelo navegador, encontramos a página padrão do apache. | ||
Iniciaremos uma varredura de arquivos, com intuito de encontrar algum arquivo oculto no servidor. Vamos utilizar o wfuzz para essa tarefa. | ||
wfuzz -c -z file,maquinas/wordlists/files.txt –hc 404 http://172.31.28.68/FUZZ | ||
Encontramos um arquivo .zip chamado backup.zip, vamos fazer o download do arquivo para nossa máquina. | ||
Agora vamos descompactar o arquivo com o utilitário unzip. | ||
unzip backup.zip | ||
Resultado: | ||
Acessando o diretório "app" temos o seguinte arquivo .jar. | ||
Verificando o serviço web na porta 8080 pelo navegador, temos: | ||
Nosso arquivo backup.zip é o backup da aplicação que está em execução na porta 8080. | ||
Vamos extrair os arquivos de dentro do jar e ver a sua estrutura. | ||
jar xvf ldapsso-1.0.0-SNAPSHOT.jar | ||
Acessando o diretório “com/uhclabs” encontramos três classes java. | ||
Vamos abrir o “AuthController.class” com “jd-GUI” para podermos ler o código. | ||
Resultado: | ||
Os valores dos objetos "name" e "ipaddress" são inseridos na função Runtime. getRuntime(). exec() para serem utilizados como argumentos no comando curl. | ||
Se conseguirmos de alguma forma manipular os valores deles, poderemos comprometer o ambiente. | ||
Olhando a classe “LdapSSOProvider”, encontramos a rota /sso e uma função que recebe valores em json via POST. | ||
Vamos acessar a rota /sso pelo navegador. | ||
Encontramos os objetos, agora vamos enviar via método POST para confirmar que podemos manipular esses objetos no backend. | ||
Iniciamos o servidor web python na porta 1338. | ||
Enviamos a requisição. | ||
Resultado: | ||
A requisição chegou no servidor python, temos um Server-side Request Forgery. Vamos dar outra olhada no código que é responsável pela requisição que chegou na nossa máquina. | ||
O comando curl faz uma requisição GET na porta 1338 solicitando /latest/meta-data/local-ipv4 e salva o response em um arquivo com nome do valor do objeto name em /tmp/ . | ||
Com essa informação podemos escalar a vulnerabilidade de SSRF para RFI. | ||
Exploração | ||
Criaremos o diretório /latest/meta-data/ e no diretório meta-data salvaremos nossa reverse shell php com o nome de local-ipv4. | ||
Na nossa requisição, alteraremos o valor de "name" para ../var/www/html/shell.php, salvando nossa reverse shell na raiz do servidor web. | ||
Enviamos a requisição. | ||
Pronto o servidor solicitou nosso arquivo, vamos verificar se salvou dentro do servidor web. | ||
Acessamos shell.php no servidor web porta 80. | ||
Conseguimos acesso ao terminal da máquina. | ||
| ||
Escalação de Privilégios | ||
Depois de analisar a máquina percebi que nossa shell foi escrita pelo usuário tomcat, mas estamos com acesso do usuário apache. | ||
Vamos tentar obter shell com o usuário tomcat. | ||
Encontramos o diretório do tomcat. | ||
Precisaremos de uma reverse shell .jsp para conseguir acesso no servidor como tomcat, utilizaremos o msfvenom para gerar nossa reverse shell. | ||
Faremos do mesmo modo que fizermos com a reverse shell php, somente alterando o valor de "name". | ||
Acessamos na porta 8081 /sso/shell.jsp. | ||
Conseguimos acesso como usuário tomcat, executamos sudo -l. | ||
Temos permissão de root para reiniciar o serviço do tomcat e recarregar as configurações dos serviços do systemctl. | ||
Vamos alterar o arquivo tomcat.service. | ||
Alteraremos para obter uma reverse shell quando o serviço for reiniciado. | ||
Vamos executar os comandos com sudo, lembre-se de deixar o netcat escutando na porta 4447: | ||
1º sudo /bin/systemctl daemon-reload : para salvar com nossas alterações. | ||
2º sudo /bin/systemctl restart tomcat : reiniciar o serviço do tomcat. | ||
Voltamos para nosso netcat. | ||
Conseguimos acesso como usuário root !! | ||
|