
Umgehung des Passworts der Client-Benutzeroberfläche von Symantec Endpoint Protection
Authentifizierungsumgehung für das Benutzeroberflächen-Passwort von Symantec Endpoint Protection 14.3.5351 Client
Symantec Endpoint Protection ermöglicht das Einrichten eines Passwortschutzes für die Benutzeroberfläche, um Konfigurationsänderungen zu verhindern. Diese Passwortprüfung wird durch eine Logik implementiert, die weder in einem Protected Process Light (PPL) noch in einem Kernel-Treiber läuft; das Ändern eines Rückgabewerts im Speicher oder das Patchen der Binärdatei erlaubt einem Angreifer, das Passwort zu umgehen. Dies funktioniert sogar, wenn der Tamper Protection aktiviert ist.
Wenn der Angreifer Code mit Administratorrechten ausführen kann, kann er schädliche Richtlinien-XML und/oder Verbindungseinstellungen für die zentrale SEP-Verwaltung importieren. Damit erlangt er praktisch die vollständige Kontrolle über den Client. Durch den Richtlinienimport kann er Ausnahmen hinzufügen, UI-Optionen freischalten, das Administratorkennwort deaktivieren oder ändern, den Schutz dauerhaft deaktivieren und/oder den Client deinstallieren.
Wenn der Angreifer keine Administratorrechte besitzt, kann dies zum Exportieren von Fehlerbehebungsinformationen, zum Lesen von Protokollen und zum Anzeigen von Client-Einstellungen verwendet werden. Unter 14.0 können die Richtlinie exportiert und der Tamper Protection ohne Administratorberechtigungen deaktiviert werden. Dies war unter 14.3.5413.3000 nicht möglich.
In 14.3.5351 prüft Folgendes, ob das Passwort übereinstimmt:
.text:00438021 loc_438021: ; CODE XREF: sub_437FA0+73↑j
.text:00438021 mov ecx, offset ServiceName ; "SepMasterService"
.text:00438026 call sub_43DDF0
.text:0043802B test eax, eax
.text:0043802D jnz short loc_4380A5
.text:0043802F push ecx ; Src
.text:00438030 lea eax, [ebp+var_14]
.text:00438033 mov ecx, esp
.text:00438035 push eax
.text:00438036 call ds:??0?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@QAE@ABV01@@Z ; ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>(ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>> const &)
.text:0043803C call sub_4380F0
.text:00438041 test al, al
.text:00438043 jz short loc_43804F
.text:00438045 mov ecx, esi
.text:00438047 call ds:__imp_?OnOK@CDialog@@MAEXXZ ; CDialog::OnOK(void)
.text:0043804D jmp short loc_4380AD
Der Sprung, der den Erfolg aller Passwortversuche in SymCorpUI.exe zu steuern scheint, ist die JZ-Anweisung bei .text:00438043. Wenn man diese in eine JNZ (Anweisung 0x74 -> 0x75) ändert, wird der Sprung umgekehrt, sodass ein beliebiges Passwort akzeptiert wird.
Das Python-Skript findet den Installationsordner für SEP, liest SymCorpUI.exe ein, schreibt eine gepatchte Kopie in den Ordner neben dem Skript und führt die gepatchte Version im ursprünglichen Arbeitsverzeichnis aus. Führen Sie es mit Administratorrechten aus, und es wird eine SEP-Benutzeroberfläche starten, die jedes eingegebene falsche Passwort akzeptiert.
Nun könnte ein Angreifer die Richtlinien-XML unter Help -> Troubleshooting exportieren. Diese enthält die Konfiguration einschließlich aller Hashes für das Administratorkennwort. Der Angreifer kann dann die XML bearbeiten, um beliebige Einstellungen im Client zu ändern, z.B. den Passwort-Hash zu ersetzen oder die Passwortanforderung zu deaktivieren. Diese schädliche Richtlinien-XML kann dann mit der Schaltfläche neben Export wieder importiert werden.
Das Skript führt einige Prüfungen durch, um festzustellen, ob es erhöhte Rechte hat; falls nicht, wird die gepatchte Binärdatei gezwungen, ohne Administratorrechte ausgeführt zu werden. Um die Benutzeroberfläche als Administrator auszuführen, führen Sie das Python-Skript als Administrator aus oder setzen Sie die Variable as_admin auf True.
Um nicht für jede Version spezifische Offsets speichern zu müssen, führt das Skript eine allgemeine Suche/Ersetzung für eine Sequenz von Anweisungen durch, die ich in den drei getesteten Versionen als eindeutig befunden habe. Es ist möglich, dass eine andere Version mehrere Übereinstimmungen hat, was den PoC beschädigen könnte. In diesem Fall durchsuchen Sie die Übereinstimmungen, um einen Block zu finden, der mit mov ecx, offset ServiceName ; "SepMasterService" beginnt, um die relevante JZ-Anweisung zu finden, die in der Nähe des Endes gepatcht werden muss.
Zum Testen der Passwortfunktionalität kann Folgendes in die Richtlinien-XML (auf derselben Ebene wie GlobalGroups) eingefügt werden, um den Schutz zu aktivieren. Der Hash ist ein MD5 des Strings "test".
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
Symantec reagierte schnell auf das Problem, die CVE wurde von ihnen registriert und ein Fix wurde als 14.3 RU6 veröffentlicht.
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014