
Schritt-für-Schritt-Exploit-Durchlauf für CVE-2023-22515, eine kritische Schwachstelle in der Zugriffskontrolle von Atlassian Confluence Server und Data Center, die die Erstellung eines Admin-Kontos aus der Ferne ermöglicht.

Dies rührt von einem der Interceptoren her, nämlich dem SetupCheckInterceptor der struts.xml.
struts.xml ist die zentrale Konfigurationsdatei für Struts.
Im SetupCheckInterceptor wird BootstrapUtils.getBootstrapManager().isSetupComplete() aufgerufen:
public String intercept(ActionInvocation actionInvocation) throws Exception {
if (BootstrapUtils.getBootstrapManager().isSetupComplete() && ContainerManager.isContainerSetup())
return "alreadysetup";
return actionInvocation.invoke();
}
Erklärung
BootstrapUtils.getBootstrapManager().isSetupComplete()
→ Überprüft, ob Confluence den Setup-Vorgang (via Wizard, Lizenz eingeben, Admin-Benutzer erstellen) abgeschlossen hat.
ContainerManager.isContainerSetup()
→ Überprüft, ob der Spring IoC-Container vollständig initialisiert wurde.
Wenn beide Bedingungen zutreffen:
→ Das System ist vollständig eingerichtet → Interceptor gibt sofort "alreadysetup" zurück.
→ Die Action (üblicherweise Setup-Actions wie SetupDatabaseAction, SetupLicenseAction, …) wird nicht ausgeführt.
Wenn noch nicht vollständig eingerichtet:
→ actionInvocation.invoke() wird aufgerufen → die vom Benutzer angeforderte Action wird ausgeführt.
getBootstrapManager() → gibt in der Regel DefaultAtlassianBootstrapManager zurück, der die gesamten Kernkonfigurationsinformationen während des Setups verwaltet.
DefaultAtlassianBootstrapManager.isSetupComplete können wir sehen, dass die Methode der Anwendungskonfiguration isSetupComplete aufgerufen wird, um zu prüfen, ob der Setup-Vorgang abgeschlossen ist.
=> Wenn wir isSetupComplete = false setzen, gibt SetupCheckInterceptor nicht “alreadysetup” zurück und /setup/setupadministrator.action wird zugänglich.
Unten finden wir eine ServerInfoAction:
ServerInfoAction = Öffentliche Action in Confluence → erlaubt jedem Benutzer den Aufruf ohne Login, ohne CSRF-Token. Bei Ausführung gibt sie einfach "success" zurück → mapped auf ein Template, das Serverinformationen anzeigt.
Sie erbt von ConfluenceActionSupport.
In ConfluenceActionSupport sehen wir, dass getBootstrapStatusProvider eine BootstrapStatusProviderImpl-Instanz zurückgibt, nach der wir suchen.

BootstrapStatusProviderImpl gibt es getApplicationConfig, das die Anwendungskonfiguration zurückgibt.
ApplicationConfig, dass es die Methode setSetupComplete implementiert.
setSetupComplete auf false zu setzen.getBootstrapStatusProvider(). getApplicationConfig (). setSetupComplete ( false );
bootstrapStatusProvider.applicationConfig.setupComplete=false
/server-info.action als eine URL in Confluence, die von ServerInfoAction verarbeitet wird, da es sich um einen öffentlichen Endpunkt ohne Anmeldung handelt./server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

Debug-Prüfung:
setupComplete (Parameter, der an die Methode übergeben wird)
→ false
Das bedeutet, die Methode wird mit dem Parameter false aufgerufen.
this.setupComplete (Instanzvariable des ApplicationConfig-Objekts)
→ true (vor der Zuweisung).
Nach Ausführung des Befehls → wird this.setupComplete zu false.

/setup/setupadministrator.action aufzurufen – erfolgreich.
