
Bypass para la contraseña de la interfaz de usuario del cliente de Symantec Endpoint Protection
Omisión de autenticación para la contraseña de la interfaz de usuario del cliente de Symantec Endpoint Protection 14.3.5351
Symantec Endpoint Protection permite establecer una protección por contraseña en su interfaz de usuario para evitar cambios de configuración. Esta comprobación de contraseña está implementada por una lógica que no se encuentra ni en un Protected Process Light (PPL) ni en un controlador de kernel; cambiar un valor de retorno en memoria o parchear el binario permite a un atacante omitir la contraseña. Esto funciona incluso si Tamper Protection está habilitada.
Si el atacante puede ejecutar código con privilegios de administrador, puede importar un XML de directiva malicioso y/o ajustes de conexión para la gestión central de SEP. Con ello, prácticamente obtiene el control total del cliente. Usando la importación de directivas, puede agregar exclusiones, desbloquear opciones de la interfaz, deshabilitar o cambiar la contraseña de administrador, deshabilitar permanentemente la protección y/o desinstalar el cliente.
Si el atacante no tiene privilegios de administrador, se puede usar para exportar información de solución de problemas, leer registros y ver los ajustes del cliente. En 14.0 se puede exportar la directiva y deshabilitar tamper protection sin permisos de administrador. Esto no era posible en 14.3.5413.3000.
en 14.3.5351 lo siguiente comprueba si la contraseña coincide:
.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
El salto que parece controlar el éxito de todos los intentos de contraseña en SymCorpUI.exe es la instrucción JZ mostrada en .text:00438043. Cambiarla a JNZ (instrucción 0x74 -> 0x75) invierte el salto, permitiendo que se acepte cualquier contraseña.
El script de Python encuentra la carpeta de instalación de SEP, lee SymCorpUI.exe, escribe una copia parcheada en la carpeta junto al script y ejecuta la versión parcheada en el directorio de trabajo original. Ejecútalo con privilegios y generará una interfaz de SEP que aceptará cualquier contraseña incorrecta que se introduzca.
Ahora un atacante puede exportar el XML de la directiva en Help -> Troubleshooting. Este contendrá la configuración, incluidos los hash de la contraseña de administrador. El atacante puede entonces editar el XML para cambiar cualquier ajuste del cliente, por ejemplo reemplazando el hash de la contraseña o deshabilitando el requisito de contraseña. Este XML de directiva malicioso se puede importar de nuevo usando el botón junto a Export.
El script realiza algunas comprobaciones para ver si está elevado; si no lo está, fuerza a que el binario parcheado se ejecute sin privilegios de administrador. Para ejecutar la interfaz como administrador, ejecuta el script de Python como administrador o fija la variable as_admin a True.
Para evitar tener que almacenar offsets específicos para cada compilación, el script realiza una búsqueda/reemplazo general de una secuencia de instrucciones que encontré única en las tres versiones que he probado.
Es posible que una versión diferente tenga múltiples coincidencias que puedan romper el PoC. En ese caso, revisa las coincidencias para encontrar un bloque que comience con mov ecx, offset ServiceName ; "SepMasterService" para localizar la instrucción JZ relevante que parchear cerca del final.
Para probar la funcionalidad de la contraseña, se puede agregar lo siguiente en el XML de la directiva (al mismo nivel que GlobalGroups) para habilitar la protección. El hash es un MD5 de la cadena "test".
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
Symantec respondió rápidamente al problema; el CVE fue registrado por ellos y se publicó una corrección como 14.3 RU6.
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014