Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
A classe java.net.URL
implementa Serializable
, isso significa que esta classe pode ser serializada.
Esta classe tem um comportamento curioso. Da documentação: “Dois hosts são considerados equivalentes se ambos os nomes de host puderem ser resolvidos nos mesmos endereços IP”.
Então, toda vez que um objeto URL chama qualquer uma das funções equals
ou hashCode
, uma solicitação DNS para obter o endereço IP vai ser enviada.
Chamar a função hashCode
de um objeto URL é bastante fácil, basta inserir este objeto dentro de um HashMap
que vai ser desserializado. Isso ocorre porque no final da função readObject
do HashMap
, este código é executado:
É executado putVal
com cada valor dentro do HashMap
. Mas, mais relevante é a chamada para hash
com cada valor. Este é o código da função hash
:
Como você pode observar, ao desserializar um HashMap
, a função hash
será executada com cada objeto e durante a execução do hash
, será executado .hashCode()
do objeto. Portanto, se você desserializar um HashMap
contendo um objeto URL, o objeto URL irá executar .hashCode()
.
Agora, vamos dar uma olhada no código de URLObject.hashCode()
:
Como você pode ver, quando um URLObject
executa .hashCode()
, é chamado hashCode(this)
. A continuação você pode ver o código desta função:
Você pode ver que um getHostAddress
é executado para o domínio, lançando uma consulta DNS.
Portanto, esta classe pode ser abusada para lançar uma consulta DNS para demonstrar que desserialização é possível, ou até mesmo para exfiltrar informações (você pode anexar como subdomínio a saída de uma execução de comando).
Você pode encontrar o código de payload URDNS do ysoserial aqui. No entanto, apenas para facilitar a compreensão de como codificá-lo, eu criei meu próprio PoC (baseado no do ysoserial):
Na ideia original, a carga útil das commons collections foi alterada para realizar uma consulta DNS, isso era menos confiável do que o método proposto, mas este é o post: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Você pode baixar GadgetProbe da Burp Suite App Store (Extender).
GadgetProbe tentará descobrir se algumas classes Java existem na classe Java do servidor para que você possa saber se ela é vulnerável a algum exploit conhecido.
GadgetProbe usará a mesma carga útil DNS da seção anterior, mas antes de executar a consulta DNS, ele tentará desserializar uma classe arbitrária. Se a classe arbitrária existir, a consulta DNS será enviada e o GadgetProbe anotará que essa classe existe. Se a requisição DNS nunca for enviada, isso significa que a classe arbitrária não foi desserializada com sucesso, então ou ela não está presente ou não é serializável/explorável.
Dentro do github, GadgetProbe tem algumas listas de palavras com classes Java para serem testadas.
Este scanner pode ser baixado da Burp App Store (Extender). A extensão tem capacidades passivas e ativas.
Por padrão, ele verifica passivamente todas as requisições e respostas enviadas procurando por bytes mágicos serializados Java e apresentará um aviso de vulnerabilidade se algum for encontrado:
Teste Manual
Você pode selecionar uma requisição, clicar com o botão direito e Enviar requisição para DS - Teste Manual
.
Então, dentro da aba Scanner de Desserialização --> aba Teste Manual você pode selecionar o ponto de inserção. E iniciar o teste (Selecione o ataque apropriado dependendo da codificação utilizada).
Mesmo que isso seja chamado de "Teste Manual", é bastante automatizado. Ele verificará automaticamente se a desserialização é vulnerável a qualquer carga útil ysoserial, verificando as bibliotecas presentes no servidor web e destacará as vulneráveis. Para verificar as bibliotecas vulneráveis, você pode optar por lançar Javas Sleeps, sleeps via consumo de CPU, ou usando DNS, como foi mencionado anteriormente.
Exploração
Uma vez que você tenha identificado uma biblioteca vulnerável, pode enviar a requisição para a aba Exploração. Nesta aba, você deve selecionar novamente o ponto de injeção, escrever a biblioteca vulnerável para a qual deseja criar uma carga útil e o comando. Então, basta pressionar o botão Ataque apropriado.
Faça sua carga útil executar algo como o seguinte:
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)