
Обход пароля пользовательского интерфейса клиента Symantec Endpoint Protection
Обход аутентификации для пароля пользовательского интерфейса клиента Symantec Endpoint Protection 14.3.5351
Symantec Endpoint Protection позволяет установить защиту паролем на его интерфейс для предотвращения изменений конфигурации. Эта проверка пароля реализована логикой, которая не находится ни в Protected Process Light (PPL), ни в драйвере ядра; изменение возвращаемого значения в памяти или патчинг бинарного файла позволяет злоумышленнику обойти пароль. Это работает, даже если включена защита от несанкционированного доступа (Tamper Protection).
Если злоумышленник может выполнить код с правами администратора, он может импортировать вредоносный XML-файл политики и/или настройки подключения для центрального управления SEP. С помощью этого они практически получают полный контроль над клиентом. Используя импорт политики, они могут добавлять исключения, разблокировать опции интерфейса, отключать или изменять пароль администратора, постоянно отключать защиту и/или удалять клиент.
Если у злоумышленника нет прав администратора, это можно использовать для экспорта информации об устранении неполадок, чтения журналов и просмотра настроек клиента. В версии 14.0 политику можно экспортировать, а защиту от несанкционированного доступа можно отключить без прав администратора. Это было невозможно в версии 14.3.5413.3000.
В версии 14.3.5351 следующий код проверяет соответствие пароля:
.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
Переход, который, по-видимому, контролирует успех всех попыток ввода пароля в SymCorpUI.exe, — это инструкция JZ, показанная в .text:00438043. Изменение этой инструкции на JNZ (инструкция 0x74 -> 0x75) меняет направление перехода, позволяя принять произвольный пароль.
Скрипт на Python находит папку установки SEP, считывает SymCorpUI.exe, записывает пропатченную копию в папку рядом со скриптом и запускает пропатченную версию в исходном рабочем каталоге. Запустите его с привилегиями, и он породит интерфейс SEP, который будет принимать любой введенный неверный пароль.
Теперь злоумышленник может экспортировать XML-файл политики через Help -> Troubleshooting. Он будет содержать конфигурацию, включая все хеши пароля администратора. Затем злоумышленник может отредактировать XML, чтобы изменить любые настройки клиента, например, заменить хеш пароля или отключить требование пароля. Этот вредоносный XML-файл политики затем можно снова импортировать с помощью кнопки рядом с Export.
Скрипт выполняет некоторые проверки, чтобы определить, имеет ли он повышенные привилегии; если нет, он заставляет пропатченный бинарный файл запускаться без прав администратора. Чтобы запустить интерфейс от имени администратора, запустите скрипт Python от имени администратора или задайте переменную as_admin равной True.
Чтобы избежать необходимости хранить конкретные смещения для каждой сборки, скрипт выполняет общий поиск/замену последовательности инструкций, которые, как я обнаружил, являются уникальными в трех протестированных мной версиях. Вероятно, что в другой версии может быть несколько совпадений, что может нарушить PoC. В этом случае просмотрите совпадения, чтобы найти блок, начинающийся с mov ecx, offset ServiceName ; "SepMasterService", чтобы найти соответствующую инструкцию JZ для патча в нижней части.
Для тестирования функциональности пароля можно добавить следующее в XML-файл политики (на том же уровне, что и GlobalGroups), чтобы включить защиту. Хеш — это MD5 строки "test".
<AdminPassword ExitNeedPassword="1" UINeedPassword="1" ImportExportNeedPassword="1" UninstallNeedPassword="1">098f6bcd4621d373cade4e832627b4f6</AdminPassword>
Symantec быстро отреагировала на проблему, CVE был зарегистрирован ими, и исправление было опубликовано как 14.3 RU6.
https://support.broadcom.com/external/content/SecurityAdvisories/0/21014