Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Requête DNS sur la désérialisation
La classe java.net.URL
implémente Serializable
, cela signifie que cette classe peut être sérialisée.
Cette classe a un comportement curieux. D'après la documentation : "Deux hôtes sont considérés comme équivalents si les noms d'hôtes peuvent être résolus en mêmes adresses IP".
Ainsi, chaque fois qu'un objet URL appelle l'une quelconque des fonctions equals
ou hashCode
, une requête DNS pour obtenir l'adresse IP va être envoyée.
Appeler la fonction hashCode
à partir d'un objet URL est assez simple, il suffit d'insérer cet objet dans une HashMap
qui va être désérialisée. Cela est dû au fait qu'à la fin de la fonction readObject
de HashMap
, ce code est exécuté :
Il va exécuter putVal
avec chaque valeur à l'intérieur du HashMap
. Mais, plus pertinent est l'appel à hash
avec chaque valeur. Voici le code de la fonction hash
:
Comme vous pouvez l'observer, lors de la désérialisation d'un HashMap
, la fonction hash
va être exécutée avec chaque objet et pendant l'exécution de hash
, .hashCode()
de l'objet va être exécuté. Par conséquent, si vous désérialisez un HashMap
contenant un objet URL, l'objet URL va exécuter .hashCode()
.
Maintenant, examinons le code de URLObject.hashCode()
:
Comme vous pouvez le voir, lorsque un URLObject
exécute .hashCode()
, il appelle hashCode(this)
. En continuant, vous pouvez voir le code de cette fonction :
Vous pouvez voir qu'un getHostAddress
est exécuté vers le domaine, lançant une requête DNS.
Par conséquent, cette classe peut être abusée pour lancer une requête DNS afin de démontrer que la désérialisation est possible, voire pour exfiltrer des informations (vous pouvez ajouter en sous-domaine la sortie d'une exécution de commande).
Exemple de code de charge utile URLDNS
Vous pouvez trouver le code de charge utile URLDNS de ysoserial ici. Cependant, juste pour faciliter la compréhension de comment le coder, j'ai créé ma propre preuve de concept (basée sur celle de ysoserial) :
Plus d'informations
Dans l'idée originale, la charge utile de commons collections a été modifiée pour effectuer une requête DNS, ce qui était moins fiable que la méthode proposée, mais voici le lien vers l'article : https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Vous pouvez télécharger GadgetProbe depuis le Burp Suite App Store (Extender).
GadgetProbe va essayer de déterminer si certaines classes Java existent sur la classe Java du serveur afin de savoir si il est vulnérable à une certaine exploitation connue.
Comment ça marche
GadgetProbe utilisera la même charge utile DNS de la section précédente mais avant d'exécuter la requête DNS, il va essayer de désérialiser une classe arbitraire. Si la classe arbitraire existe, la requête DNS sera envoyée et GadgetProbe notera que cette classe existe. Si la requête DNS n'est jamais envoyée, cela signifie que la classe arbitraire n'a pas été désérialisée avec succès, donc soit elle n'est pas présente, soit elle n'est pas sérialisable/exploitable.
Sur le github, GadgetProbe a des listes de mots avec des classes Java à tester.
Plus d'informations
Scanner de désérialisation Java
Ce scanner peut être téléchargé depuis le Burp App Store (Extender). L'extension a des capacités passives et actives.
Passif
Par défaut, il vérifie passivement toutes les requêtes et réponses envoyées à la recherche de bytes magiques sérialisés Java et affichera un avertissement de vulnérabilité s'il en trouve :
Actif
Test manuel
Vous pouvez sélectionner une requête, faire un clic droit et Envoyer la requête à DS - Test manuel
.
Ensuite, dans l'onglet Scanner de désérialisation --> Onglet de test manuel, vous pouvez sélectionner le point d'insertion. Et lancer le test (Sélectionnez l'attaque appropriée en fonction de l'encodage utilisé).
Même si cela s'appelle "Test manuel", c'est assez automatisé. Il vérifiera automatiquement si la désérialisation est vulnérable à n'importe quelle charge utile ysoserial en vérifiant les bibliothèques présentes sur le serveur web et mettra en évidence celles qui sont vulnérables. Pour vérifier les bibliothèques vulnérables, vous pouvez choisir de lancer des Javas Sleeps, des sleeps via une consommation CPU, ou en utilisant DNS comme mentionné précédemment.
Exploitation
Une fois que vous avez identifié une bibliothèque vulnérable, vous pouvez envoyer la requête à l'onglet Exploitation. Dans cet onglet, vous devez sélectionner à nouveau le point d'injection, écrire la bibliothèque vulnérable pour laquelle vous voulez créer une charge utile, et la commande. Ensuite, appuyez simplement sur le bouton Attaque approprié.
Informations sur l'exfiltration DNS de la désérialisation Java
Faites en sorte que votre charge utile exécute quelque chose comme suit :
Plus d'informations
Last updated