HackingClub Quarkus Write-up
0
0

HackingClub Quarkus Write-up

Resolução da maquina Quarkus do hackingclub.

Roberto Francisco
3 min
0
0
[object Object]

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:

undefined

Identificamos os serviços e as portas disponíveis, iniciaremos o reconhecimento do serviço web na porta 80.

undefined

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

undefined

Encontramos um arquivo .zip chamado backup.zip, vamos fazer o download do arquivo para nossa máquina.

undefined

Agora vamos descompactar o arquivo com o utilitário unzip.

unzip backup.zip

Resultado:

undefined

Acessando o diretório "app" temos o seguinte arquivo .jar.

undefined

Verificando o serviço web na porta 8080 pelo navegador, temos:

undefined

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.

undefined

Vamos abrir o “AuthController.class” com “jd-GUI” para podermos ler o código.

undefined

Resultado:

undefined

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.

undefined

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.

undefined

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.

undefined

Enviamos a requisição.

Resultado:

undefined

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.

undefined

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.

undefined

Na nossa requisição, alteraremos o valor de "name" para ../var/www/html/shell.php, salvando nossa reverse shell na raiz do servidor web.

undefined

Enviamos a requisição.

undefined

Pronto o servidor solicitou nosso arquivo, vamos verificar se salvou dentro do servidor web.

Acessamos shell.php no servidor web porta 80.

undefined

Conseguimos acesso ao terminal da máquina.

undefined

                                                  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.

undefined

Vamos tentar obter shell com o usuário tomcat.

undefined

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.

undefined

Faremos do mesmo modo que fizermos com a reverse shell php, somente alterando o valor de "name".

undefined

Acessamos na porta 8081 /sso/shell.jsp.

undefined

Conseguimos acesso como usuário tomcat, executamos sudo -l.

undefined

 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.

undefined

Alteraremos para obter uma reverse shell quando o serviço for reiniciado.

undefined

Vamos executar os comandos com sudo, lembre-se de deixar o netcat escutando na porta 4447:

sudo /bin/systemctl daemon-reload   : para salvar com nossas alterações.

sudo /bin/systemctl restart tomcat   : reiniciar o serviço do tomcat.

undefined

Voltamos para nosso netcat.

undefined

Conseguimos acesso como usuário root !! 

undefined