
UAC umgehen durch Hijacking einer DLL im Native Image Cache
Umgehung der Benutzerkontensteuerung (UAC), um erweiterte (Administrator-)Rechte zu erlangen und jedes Programm auf hoher Integritätsstufe auszuführen.

Ich habe mich entschieden, ByeIntegrity zu aktualisieren, damit es viel schneller, leichter und zuverlässiger ist. Dies ist eine umfassende Überarbeitung, daher habe ich ein neues Projekt in der VS-Lösung namens "ByeIntegrity2021" erstellt, das die aktualisierte Version dieses Angriffs ist. Natürlich ist die Originalversion noch vorhanden. Weitere Informationen zur neuen Version finden Sie in den folgenden Details.
Die neue Version kann nun den NIC kapern, ohne auf die vorhandenen nativen Images im NIC angewiesen zu sein. Sie erstellt dazu eigene native Imagedeskriptoren und Payloads und verschiebt sie in den NIC, wodurch folgende Anforderungen entfallen:
*.ni-Images, die von NGEN.exe erzeugt wurdenDie CLR lädt native Images aus dem NIC, indem sie jedes Verzeichnis rekursiv durchsucht und dann die dazugehörige *.aux-Datei einliest. Diese Datei enthält Informationen über das native Image und seine Abhängigkeiten. Basierend auf den Informationen in der AUX-Datei lädt die CLR das Image entweder oder lehnt es ab und fährt dann mit dem nächsten Kandidaten fort. Wenn keine geeigneten Kandidaten gefunden werden, lädt sie das Standardimage und kompiliert es normal mit JIT. Kein Teil des eigentlichen nativen Images wird gelesen (es wird nur auf seine Existenz geprüft), daher platziert ByeIntegrity einfach die Payload-DLL mit demselben Namen, den das native Image haben würde.
Die aktualisierte Version von ByeIntegrity enthält ein Tool namens AUXGen, das den Namen einer Assembly aus dem GAC übernimmt und dann die entsprechende AUX-Datei generiert. Die AUX-Datei wird so erstellt, dass sie den CLR-Prüfungen entspricht und die CLR das "native Image" lädt, das durch die AUX-Datei beschrieben wird. Hinweis: AUXGen behandelt keine Abhängigkeiten beim Generieren der AUX-Datei. Es macht nur das Nötigste, damit die CLR das Image lädt. Details zum Format der AUX-Datei werde ich später posten.
ByeIntegrity verwendet jetzt ISecurityEditor, genau wie UACMe, was den benötigten Code reduziert. Es erfordert auch, dass Sie die AUX-Datei für die Assembly MMCEx generiert und im selben Verzeichnis wie ByeIntegrity abgelegt haben. MMCEx ist jetzt das Zielimage aufgrund seiner Ladereihenfolge und des kürzeren Namens.
ByeIntegrity kapert eine DLL im Native Image Cache (NIC). Der NIC wird vom .NET Framework verwendet, um optimierte .NET-Assemblys zu speichern, die von Programmen wie Ngen, dem Native Image Generator des .NET Frameworks, erzeugt wurden. Da Ngen normalerweise unter dem aktuellen Benutzer mit Administratorrechten über den Taskplaner ausgeführt wird, gewährt der NIC Mitgliedern der Administratorengruppe Änderungszugriff.
Das Microsoft Management Console (MMC)-Snap-In für die Windows-Firewall verwendet das .NET Framework und beim Initialisieren werden Module aus dem NIC in den MMC-Prozess geladen. Die ausführbare Datei von MMC verwendet AutoElevate, einen Mechanismus, den Windows verwendet, um das Token eines Prozesses automatisch zu erhöhen, ohne dass eine UAC-Aufforderung erscheint.
ByeIntegrity kapert eine bestimmte DLL im NIC namens Accessibility.ni.dll. Es schreibt Shellcode in einen passend großen Padding-Bereich im .text-Abschnitt der DLL. Der Einsprungpunkt der DLL wird dann so aktualisiert, dass er auf den Shellcode zeigt. Beim Laden der DLL wird der Einsprungpunkt (der eigentlich der Shellcode ist) ausgeführt. Der Shellcode berechnet die Adresse von kernel32!CreateProcessW, erstellt eine neue Instanz von cmd.exe, die als Administrator ausgeführt wird, und gibt dann einfach TRUE zurück. Dies gilt nur für den Grund DLL_PROCESS_ATTACH; alle anderen Gründe geben sofort TRUE zurück.
Dieser Angriff ist in UACMe als Methode #63 implementiert. Wenn Sie diesen Angriff ausprobieren möchten, verwenden Sie bitte zuerst UACMe. Der Angriff ist der gleiche, jedoch verwendet UACMe eine andere Methode, um den NIC zu modifizieren. ByeIntegrity verwendet IFileOperation, während UACMe ISecurityEditor verwendet. Darüber hinaus wählt UACMe das korrekte Accessibility.ni.dll für Ihr System aus und führt bei Bedarf die Systemwartungsaufgaben durch (um die NIC-Komponenten zu generieren). ByeIntegrity wählt einfach den ersten vorhandenen NIC-Eintrag aus (der möglicherweise nicht der korrekte Eintrag ist, den MMC verwendet) und führt die Systemwartungsaufgaben nicht aus. ByeIntegrity enthält wesentlich mehr Code als UACMe, daher wird das Lesen der UACMe-Implementierung viel einfacher zu verstehen sein als das Lesen des ByeIntegrity-Codes. Schließlich startet ByeIntegrity während des Angriffs einen untergeordneten Prozess, während UACMe dies nicht tut.
tl;dr: UACMe ist einfacher und effektiver als ByeIntegrity, verwenden Sie daher zuerst UACMe.
Wenn Sie dies lesen, wissen Sie wahrscheinlich, wie man die Quelle kompiliert. Beachten Sie nur, dass dies überhaupt nicht für x86 getestet oder ausgelegt wurde und es auf x86 wahrscheinlich sowieso nicht funktionieren wird.
Genau wie UACMe: Ich werde niemals kompilierte Binärdateien in dieses Repo hochladen. Es gibt immer Leute, die die Welt in Schutt und Asche legen wollen, und ich werde ihnen keinen einfachen Weg bieten, dies auf dem Computer eines anderen auszuführen und absichtlich Schaden anzurichten. Ich möchte auch nicht, dass Script-Kiddies diesen Angriff nutzen, ohne zu verstehen, was er tut und welchen Schaden er anrichten kann.
Dieser Angriff funktioniert von Windows 7 (7600) bis zur neuesten Version von Windows.