
Bypass para a Senha da Interface do Usuário do Cliente do Symantec Endpoint Protection
Bypass de autenticação para a senha da interface de usuário do cliente do Symantec Endpoint Protection 14.3.5351
O Symantec Endpoint Protection permite definir uma proteção por senha na interface para impedir alterações de configuração. Essa verificação de senha é implementada por uma lógica que não está em um Protected Process Light (PPL) nem em um driver de kernel; alterar um valor de retorno na memória ou aplicar patch no binário permite que um atacante ignore a senha. Isso funciona mesmo se o Tamper Protection estiver ativado.
Se o atacante puder executar código com privilégios de administrador, ele poderá importar XML de política malicioso e/ou configurações de conexão para o gerenciamento central do SEP. Com isso, ele praticamente obtém controle total sobre o cliente. Usando a importação de política, ele pode adicionar exclusões, desbloquear opções da interface, desabilitar ou alterar a senha de administrador, desativar permanentemente a proteção e/ou desinstalar o cliente.
Se o atacante não tiver privilégios de administrador, ele pode ser usado para exportar informações de solução de problemas, ler logs e visualizar as configurações do cliente. No 14.0, a política pode ser exportada e a proteção contra adulteração (Tamper Protection) pode ser desativada sem permissões de administrador. Isso não era possível no 14.3.5413.3000.
no 14.3.5351, o seguinte trecho verifica se a senha corresponde:
.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
O salto que parece controlar o sucesso de todas as tentativas de senha no SymCorpUI.exe é a instrução JZ mostrada em .text:00438043. Alterar isso para um JNZ (instrução 0x74 -> 0x75) inverte o salto, permitindo que qualquer senha arbitrária seja aceita.
O script Python encontra o diretório de instalação do SEP, lê o SymCorpUI.exe, grava uma cópia corrigida na pasta ao lado do script e executa a versão corrigida no diretório de trabalho original. Execute-o com privilégios e ele abrirá uma interface do SEP que aceitará qualquer senha incorreta inserida.
Um atacante pode então exportar o XML de política em Help -> Troubleshooting. Ele conterá a configuração, incluindo quaisquer hashes da senha de administrador. O atacante pode então editar o XML para alterar qualquer configuração no cliente, por exemplo substituindo o hash da senha ou desativando a exigência de senha. Esse XML de política malicioso pode então ser importado novamente usando o botão ao lado de Export.
O script faz algumas verificações para ver se está elevado; se não estiver, ele força o binário corrigido a ser executado sem privilégios de administrador. Para executar a interface como administrador, execute o script Python como administrador ou defina a variável as_admin como True.
Para evitar ter que armazenar offsets específicos para cada build, o script faz uma pesquisa/substituição geral por uma sequência de instruções que considerei única nas três versões que testei. É possível que uma versão diferente tenha múltiplas correspondências, o que pode quebrar o PoC. Nesse caso, analise as correspondências para encontrar um bloco começando com mov ecx, offset ServiceName ; "SepMasterService" para localizar a instrução JZ relevante a ser corrigida perto do final.
Para testar a funcionalidade de senha, pode-se adicionar o seguinte ao XML de política (no mesmo nível de GlobalGroups) para ativar a proteção. O hash é um MD5 da string "test".
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
A Symantec respondeu rapidamente ao problema, o CVE foi registrado por eles e uma correção foi publicada como 14.3 RU6.
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014