
Contournement du mot de passe de l'interface utilisateur client de Symantec Endpoint Protection
Contournement d'authentification pour le mot de passe de l'interface utilisateur du client Symantec Endpoint Protection 14.3.5351
Symantec Endpoint Protection permet de définir une protection par mot de passe sur son interface utilisateur afin d'empêcher les modifications de configuration. Cette vérification du mot de passe est implémentée par une logique qui n'est ni dans un Protected Process Light (PPL) ni dans un pilote noyau ; modifier une valeur de retour en mémoire ou patcher le binaire permet à un attaquant de contourner le mot de passe. Cela fonctionne même si la protection contre la falsification (Tamper Protection) est activée.
Si l'attaquant peut exécuter du code avec des privilèges administrateur, il peut importer une politique XML malveillante et/ou des paramètres de connexion pour la gestion centrale de SEP. Il obtient ainsi pratiquement un contrôle total sur le client. En utilisant l'importation de politique, il peut ajouter des exclusions, déverrouiller des options de l'interface utilisateur, désactiver ou modifier le mot de passe administrateur, désactiver définitivement la protection et/ou désinstaller le client.
Si l'attaquant ne dispose pas de privilèges administrateur, cela peut être utilisé pour exporter des informations de dépannage, lire les journaux et consulter les paramètres du client. Sur la version 14.0, la politique peut être exportée et la protection contre la falsification peut être désactivée sans autorisations administrateur. Cela n'était pas possible dans la version 14.3.5413.3000.
Dans la version 14.3.5351, le code suivant vérifie si le mot de passe correspond :
.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
Le saut qui semble contrôler la réussite de toutes les tentatives de mot de passe dans SymCorpUI.exe est l'instruction JZ affichée à .text:00438043. Changer cette instruction en JNZ (instruction 0x74 -> 0x75) inverse le saut, permettant d'accepter un mot de passe arbitraire.
Le script Python script trouve le dossier d'installation de SEP, lit SymCorpUI.exe, écrit une copie patchée dans le dossier à côté du script, et exécute la version patchée dans le répertoire de travail d'origine. Exécutez-le avec des privilèges, et il lancera une interface utilisateur SEP qui acceptera n'importe quel mot de passe incorrect saisi.
Un attaquant peut ensuite exporter le fichier XML de politique sous Aide -> Dépannage (Help -> Troubleshooting). Celui-ci contiendra la configuration, y compris les éventuels hachages du mot de passe administrateur. L'attaquant peut alors modifier le XML pour changer n'importe quel paramètre du client, par exemple en remplaçant le hachage du mot de passe ou en désactivant l'exigence de mot de passe. Ce fichier XML de politique malveillant peut ensuite être réimporté à l'aide du bouton à côté d'Exporter.
Le script effectue quelques vérifications pour voir s'il est élevé ; sinon, il force l'exécution du binaire patché sans privilèges administrateur. Pour exécuter l'interface utilisateur en tant qu'administrateur, exécutez le script Python en tant qu'administrateur ou codez en dur la variable as_admin à True.
Pour éviter de stocker des décalages spécifiques pour chaque build, le script effectue une recherche/remplacement générale pour une séquence d'instructions que j'ai trouvée unique dans les trois versions que j'ai testées. Il est possible qu'une version différente contienne plusieurs correspondances, ce qui pourrait casser la PoC. Dans ce cas, parcourez les correspondances pour trouver un bloc commençant par mov ecx, offset ServiceName ; "SepMasterService" afin de localiser l'instruction JZ pertinente à patcher près du bas.
Pour tester la fonctionnalité de mot de passe, on peut ajouter ce qui suit dans le fichier XML de politique (au même niveau que GlobalGroups) pour activer la protection. Le hachage est un MD5 de la chaîne "test".
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
Symantec a rapidement répondu au problème, le CVE a été enregistré par eux et un correctif a été publié sous la version 14.3 RU6.
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014