
Detaillierte Analyse und Proof-of-Concept-Exploit für CVE-2017-9822, eine XXE/unsichere Deserialisierungsschwachstelle in DotNetNuke CMS, die zu Remote-Code-Ausführung durch Cookie-Manipulation führt.
DotNetNuke (oft abgekürzt als DNN) ist ein CMS (Content-Management-System) und Web-Anwendungs-Framework auf Basis der ASP.NET-Technologie von Microsoft.
Hier verwende ich Windows 10 zum Einrichten und Debuggen des Programms. Die Version, die ich installiert habe, ist 9.1.0. Eine Anleitung zur Installation findet ihr hier. Das Ergebnis nach erfolgreicher Installation sieht so aus:


DNNPersonalization.
.dll oder .exe für .NET. Die Installation ist hier möglich. Wir müssen zwei Versionen herunterladen, um das Debuggen durchzuführen.
DotNetNuke.dll mit der 32-Bit-Version und wählen Sie Edit Assembly Attributes (C#).
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]

Speichern Sie anschließend.
Attach to Process.
w3wp.exe.
Der Grund für die Wahl von w3wp.exe ist:
w3wp.exe = IIS Worker Process.w3wp.exe (oder verwendet einen vorhandenen) zur Verarbeitung der Anfrage (Ausführung von ASP.NET-Code, Verarbeitung von Modulen, Middleware, Datenbankverbindungen usw.).w3wp.exe-Prozesse haben (Webgarten, Recycling).Als nächstes wählen Sie Debug -> Window -> Modules.

Nach Abschluss werden die Module angezeigt. Klicken Sie mit der rechten Maustaste auf ein beliebiges Modul und wählen Sie Open All Modules.

Schließlich werden alle Assemblys im Zusammenhang mit DNN angezeigt.

DotNetNuke.dll -> PersonalizationController#LoadProfile(int, int).
Diese Funktion dient zum Laden von Personalisierungsdaten (Profil) des Benutzers im DNN-Portal.
DNNPersonalization laden.Hier sollten wir uns auf DNNPersonalization konzentrieren.
Wenn userId ungültig ist (anonymer Benutzer).
Prüfen, ob in der Anfrage ein Cookie DNNPersonalization vorhanden ist.
Wenn vorhanden → XML-Wert aus diesem Cookie holen.
Wir senden eine 404-Anfrage an die Website und verwenden ein beliebiges DNNPersonalization-Cookie. Mit dnSpy setzen wir einen Breakpoint bei DotNetNuke.dll –> PersonalizationController#LoadProfile(int, int) und debuggen.


PortalSettings.
Bemerkenswert ist, dass hier eine if-Bedingung verwendet wird, um zu prüfen, ob die aktuelle Anfrage bereits IsAuthenticated ist.
Bei der von uns gesendeten 404-Anfrage ist sie unauthenticated.
Fahren wir im Call Stack fort und konzentrieren uns auf Handle404OrException.

context.User der aktuellen Anfrage null ist. Wenn ja, wird context.User auf den aktuellen Thread-Benutzer gesetzt.

In Handle404OrException sehen wir, dass die Variable IsAuthenticated jetzt true ist und der Benutzer der des IIS-Servers ist, sodass die Anfrage als authentifizierter Benutzer ausgeführt wird.
Der Grund für das Problem liegt in diesem Codeabschnitt:
else if (transfer)
{
if (context.User == null)
{
context.User = Thread.CurrentPrincipal;
}
response.TrySkipIisCustomErrors = true;
IHttpHandler handler = new CDefault();
context.Handler = handler;
server.Transfer("~/" + text, true);
}
context.User noch nicht gesetzt ist → wird Thread.CurrentPrincipal (die aktuelle Identität des Threads) zugewiesen.=> Wenn wir beliebige Inhalte in das Cookie mit der Variable DNNPersonalization übergeben, wird dies wie ein normaler Benutzer behandelt.
DotNetNuke.dll –> PersonalizationController#LoadProfile(int, int).