
Bypass per la password dell'interfaccia utente client di Symantec Endpoint Protection
Bypass dell'autenticazione per la password dell'interfaccia utente del client Symantec Endpoint Protection 14.3.5351
Symantec Endpoint Protection consente di impostare una protezione tramite password sulla propria UI per impedire modifiche alla configurazione. Questo controllo della password è implementato da una logica che non risiede né in un Protected Process Light (PPL) né in un driver del kernel; modificare un valore di ritorno in memoria o patchare il binario permette a un attaccante di bypassare la password. Questo funziona anche se la protezione Tamper Protection è attiva.
Se l'attaccante può eseguire codice con privilegi di amministratore, può importare un XML di policy malevolo e/o impostazioni di connessione per la gestione centralizzata SEP. In questo modo ottiene di fatto il pieno controllo del client. Utilizzando l'importazione della policy, può aggiungere esclusioni, sbloccare opzioni dell'UI, disabilitare o cambiare la password dell'amministratore, disabilitare permanentemente la protezione e/o disinstallare il client.
Se l'attaccante non ha privilegi di amministratore, può comunque essere utilizzato per esportare informazioni di diagnostica, leggere i log e visualizzare le impostazioni del client. Su 14.0 la policy può essere esportata e la protezione tamper può essere disabilitata senza permessi di amministratore. Questo non era possibile in 14.3.5413.3000.
In 14.3.5351 il seguente codice verifica se la password corrisponde:
.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
Il salto che sembra controllare il successo di tutti i tentativi di password in SymCorpUI.exe è l'istruzione JZ mostrata a .text:00438043. Modificandolo in JNZ (istruzione 0x74 -> 0x75) si inverte il salto, permettendo l'accettazione di una password arbitraria.
Lo script Python trova la cartella di installazione di SEP, legge SymCorpUI.exe, scrive una copia patchata nella cartella accanto allo script e avvia la versione patchata nella directory di lavoro originale. Eseguirlo con privilegi e genererà una UI di SEP che accetterà qualsiasi password errata inserita.
Ora un attaccante potrebbe esportare il XML di policy sotto Help -> Troubleshooting. Questo conterrà la configurazione inclusi eventuali hash della password dell'amministratore. L'attaccante può quindi modificare il XML per cambiare qualsiasi impostazione nel client, ad esempio sostituendo l'hash della password o disabilitando il requisito della password. Questo XML di policy malevolo può poi essere reimportato usando il pulsante accanto a Export.
Lo script esegue alcuni controlli per verificare se è elevato; in caso contrario, forza l'esecuzione del binario patchato senza privilegi di amministratore. Per eseguire l'UI come amministratore, esegui lo script Python come amministratore o imposta la variabile as_admin a True.
Per evitare di dover memorizzare offset specifici per ogni build, lo script esegue una ricerca/sostituzione generale per una sequenza di istruzioni che ho trovato unica nelle tre versioni che ho testato. È possibile che una versione diversa abbia corrispondenze multiple che potrebbero rompere il PoC. In tal caso, cerca tra le corrispondenze per trovare un blocco che inizia con mov ecx, offset ServiceName ; "SepMasterService" per individuare l'istruzione JZ da patchare verso la fine.
Per testare la funzionalità della password, è possibile aggiungere quanto segue nel XML della policy (allo stesso livello di GlobalGroups) per abilitare la protezione. L'hash è un MD5 della stringa "test".
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
Symantec ha risposto rapidamente al problema, il CVE è stato registrato da loro e una correzione è stata pubblicata come 14.3 RU6.
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014