
7-Zip bis einschließlich 21.07 unter Windows ermöglicht eine Privilegieneskalation und die Ausführung von Befehlen, wenn eine Datei mit der Endung .7z in den Bereich Help>Contents gezogen wird.
Ich habe keinerlei PoC-Code für den Privilege-Escalation-Angriff veröffentlicht. Die gefundenen PoC-Codes haben nichts mit Privilege Escalation zu tun. Nur zur Information.
7-Zip ist ein freier und kostenloser Dateiarchivierer. Die Kommandozeilenversion von 7-Zip ist für Unix-ähnliche Systeme gedacht, sogar AmigaOS gehört zu diesen. Außerdem ist es mit DOS kompatibel, entweder über den Dost-Port oder mit dem HX-DOS-Extender im Windows-Kommandozeilenfenster ausführbar.
Ich werde ein wenig auf Türkisch schreiben, damit auch ihr Türkisch lernt.
Zunächst möchte ich auf meine Geschichte zur Entdeckung der Schwachstelle eingehen. Ich sah einen Payload, der eine XXE-Schwachstelle auf WinRAR ausführte. Gleichzeitig ermöglichte er mithilfe der HTML-Helper-Datei über JavaScript und WScript.Shell die Ausführung von Befehlen. Das unterschied sich in nichts von dem HTA, das bei den LOLBins verwendet wird – ich überlegte, wie ich den Vorfall zu meinem Vorteil nutzen könnte.
(https://www.exploit-db.com/exploits/47526)
Eigentlich war mein Ziel, nach einem Doppelklick auf die Erweiterungen von 7z, zip, rar usw. eine Reverse-Shell vom Zielcomputer zu erhalten, und ich überlegte, ob ich dafür die HTML-Helper-Datei nutzen könnte. Nach langen Fuzzing-Prozessen mit WinAFL entdeckte ich einen Heap-Overflow in FzGM.exe, aber nach dem Heap-Overflow wäre meine Berechtigung wieder dieselbe wie die des aktuellen Benutzers, also hatte es keinen Sinn. Deshalb habe ich CreateRemoteThread nicht verwendet, weil ich die API aufrufen musste und zum Auslösen dieser API eine CHM-Datei benötigte. Bei der Untersuchung des Quellcodes stellte ich fest, dass es an zwei Stellen fehlerhafte Vorgänge beim Aufruf der Windows-API gab, was direkt ein Autorisierungsproblem verursachte. An diesem Entdeckungspunkt wird, wie im folgenden Bild zu sehen, ein Child-Process unter FzGM.exe erstellt. Normalerweise würden wir erwarten, dass dieser Prozess unter hh.exe läuft.


Wenn die API nicht eingebunden, sondern über die Funktion korrekt konfiguriert worden wäre, hätte ich erwartet, dass ein Child-Process unter hh.exe erstellt wird, aber die 7-zip.chm-Datei ruft dies über sich selbst auf. Ein typisches Beispiel: Wenn Sie die 7-zip.chm-Datei bearbeiten und eine Befehlsausführung durchführen, können Sie es dann sehen. Nach dem Heap-Overflow nutzte ich das Autorisierungsproblem der aufgerufenen API und dann die fehlerhafte Konfiguration in der 7z.dll-Datei, womit ich mich schon lange beschäftige. CreateRemoteThread() zu machen hat keinen Sinn. Was ich in meinem Payload ausführen und aufrufen muss, ist nicht die HTML-Helper-API selbst, sondern der Punkt, an dem diese API über 7-zip gehookt wird, und dass ich diesen Punkt ausführen kann. Da dieser Payload jedoch nur mit der hh.exe-Integration funktioniert, arbeitet er daher mit Funktionen wie Drag & Drop. Dadurch, dass die 7-zip.chm-Datei über die HELP-Taste in 7-zip aufgerufen wird und ich die dort aufgerufene Adresse im Payload auf den „Base Pointer“ mit dem Autorisierungsproblem umleite, bringt uns das zu einem höher privilegierten Benutzer. Der nächste Schritt besteht darin, dass sich im Payload psexec befindet und mit dem Befehl psexec -s cmd.exe die Systemberechtigung als nt authority/system erlangt wird.

PoC-Video:
Die meisten Fragen betrafen auch die ActiveX-Warnung. Dieses Problem lässt sich im Grunde wie folgt beheben. Bevor der Payload ausgeführt wird, prüft:
<'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0' -Name '1201' -Value '0' -PropertyType "DWord">
Wenn dieser Wert 1 ist, erscheint ein Popup auf dem Bildschirm; wenn jedoch 0 als neuer Wert zugewiesen wird, wird es umgangen. Es ist jedoch anzumerken, dass dies nur den Benutzer betrifft, der den Payload gerade ausführt.
Ich habe die erforderlichen Punkte dem Entwickler mitgeteilt, und dies wurde auch von der CVE-Seite akzeptiert. Ich kann nicht verstehen, warum Menschen sich als Autorität aufspielen und der Eindruck entsteht, ich müsste ihnen den Exploit geben. Obwohl ich bereits angegeben habe, dass ich es nach dem Update veröffentlichen werde, liegt diese Respektlosigkeit, die noch vor dem Update erfolgt ist, vermutlich daran, dass man sich selbst als Autorität sieht. Ich möchte den PoC-Code des Privilege-Escalation-Angriffs möglicherweise niemals veröffentlichen – das ist mein freier Wille, und es kümmert mich kein bisschen, wer in diesem Punkt der Wahrheitsfindung was denkt.
Erste Methode: Falls kein 7-zip-Update kommt, kann die Datei 7-zip.chm gelöscht werden. Zweite Methode: Alle Benutzer im Programm sollten nur mit Lese- und Ausführungsrechten zugreifen können.
Die zugehörige Sigma-Regel https://github.com/kagancapar/CVE-2022-29072/blob/main/7z_CVE-2022-29072.yml