
Control de Acceso Roto en Servidor de Confluence - CVE-2023-22515
Atlassian fue informado sobre una posible vulnerabilidad que podría ser explotada y comprometer el entorno a través del acceso administrativo. El 4 de octubre de 2023, Atlassian publicó un aviso de seguridad sobre CVE-2023-22515, el cual obtuvo una puntuación CVE de 10.0. La vulnerabilidad se introdujo en la versión 8.0.0 de Confluence Server y Data Center editions y está presente en las versiones <8.3.3, <8.4.3, <8.5.2.
Un atacante puede explotar la vulnerabilidad para crear una cuenta adicional en Confluence con privilegios administrativos completos. El atacante no necesita información previa para explotar la vulnerabilidad. Se cree que la vulnerabilidad permite otros vectores de ataque desconocidos y debe parchearse lo antes posible.
Con esta vulnerabilidad, el atacante puede regresar a la etapa de configuración inicial de Confluence, logrando crear un nuevo usuario con acceso administrativo. Todo esto es posible porque Confluence está construido utilizando el framework Apache Struts, que depende del paquete XWork. XWork permite definir Acciones en forma de una clase Java. Cada Acción puede ser invocada a través de una URL, y la clase Java correspondiente manejará la solicitud, hará lo que la Acción requiera y emitirá una respuesta.
Este problema ocurre principalmente debido a una acción de clase, donde podemos invocar atributos a través de URL
La exploración tiene lugar en la acción ServerInfoAction, donde podemos manipular los getters/setters de la clase y restablecer la configuración inicial.
Si analizas el código de la clase ServerInfoAction, verás que extiende la clase ConfluenceActionSupport. Al hacerlo, también heredará todos sus métodos. Uno de esos métodos es un getter que devuelve un objeto BootstrapStatusProvider:
public class ConfluenceActionSupport extends ActionSupport implements LocaleProvider, WebInterface, MessageHolderAware {
public BootstrapStatusProvider getBootstrapStatusProvider() {
if (this.bootstrapStatusProvider == null)
this.bootstrapStatusProvider = BootstrapStatusProviderImpl.getInstance();
return this.bootstrapStatusProvider;
}
}
Nos interesa la clase BootstrapStatusProvider porque tiene otro método getter que podemos usar para recuperar un objeto ApplicationConfiguration:
public class BootstrapStatusProviderImpl implements BootstrapStatusProvider, BootstrapManagerInternal {
public ApplicationConfiguration getApplicationConfig() {
return this.delegate.getApplicationConfig();
}
}
Este objeto contiene la configuración de la aplicación, incluido un atributo que le indica a Confluence si la configuración inicial ha finalizado. Dicho atributo se puede modificar usando un setter en la clase ApplicationConfig:
public class ApplicationConfig implements ApplicationConfiguration {
public synchronized void setSetupComplete(boolean setupComplete) {
this.setupComplete = setupComplete;
}
}
Si podemos llamar a setSetupComplete(false), podemos restablecer el proceso de configuración inicial, y podemos hacer esto usando los métodos getters/setters de la siguiente manera;
http://10.10.227.86:8090/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
Esta URL llamará a todos los métodos que mencionamos anteriormente, llegando al método objetivo responsable de restablecer la configuración.
getBootstrapStatusProvider().getApplicationConfig().setSetupComplete(false)
A continuación, tenemos un ejemplo de un servidor con una versión vulnerable de Confluence.
Intentemos reiniciar el proceso de configuración utilizando la llamada al método como se explicó anteriormente;
http://atlassian.poc:8090/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
Después de establecer el parámetro setupcomplete en false, recibiremos el retorno de éxito. Esto significa que el intento de cambiar el parámetro fue exitoso.
Intentemos crear una nueva cuenta accediendo a la URL de configuración, que intentamos reiniciar el proceso.
http://atlassian.poc:8090/setup/setupadministrator-start.action
Pudimos restablecer el proceso de configuración y crear un nuevo usuario con acceso administrativo.
La vulnerabilidad ha sido corregida en las versiones 8.3.3, 8.4.3 y 8.5.2. Cualquier rama de versión más nueva también debería ser segura.
Para más detalles, Atlassian ha publicado información sobre esta vulnerabilidad en su sitio web (Más información - Atlassian).