
Symantec Endpoint Protection의 클라이언트 사용자 인터페이스 비밀번호 우회
Symantec Endpoint Protection 14.3.5351 클라이언트 사용자 인터페이스 비밀번호 인증 우회
Symantec Endpoint Protection은 UI에 비밀번호 보호 기능을 설정하여 구성 변경을 방지할 수 있습니다. 이 비밀번호 확인은 PPL(Protected Process Light)이나 커널 드라이버에 있지 않은 로직으로 구현되어 있습니다. 메모리의 반환 값을 변경하거나 바이너리를 패치하면 공격자가 비밀번호를 우회할 수 있습니다. 이 방법은 Tamper Protection이 활성화된 경우에도 작동합니다.
공격자가 관리자 권한으로 코드를 실행할 수 있다면, 악성 정책 XML 및/또는 중앙 SEP 관리를 위한 연결 설정을 가져올 수 있습니다. 이를 통해 사실상 클라이언트에 대한 완전한 제어권을 얻습니다. 정책 가져오기를 통해 제외 항목을 추가하고, UI 옵션을 잠금 해제하고, 관리자 비밀번호를 비활성화 또는 변경하고, 보호 기능을 영구적으로 비활성화하거나 클라이언트를 제거할 수 있습니다.
공격자에게 관리자 권한이 없는 경우, 문제 해결 정보 내보내기, 로그 읽기, 클라이언트 설정 보기에 사용할 수 있습니다. 14.0에서는 관리자 권한 없이 정책을 내보내고 Tamper Protection을 비활성화할 수 있었습니다. 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에서 모든 비밀번호 시도의 성공 여부를 제어하는 것으로 보이는 분기는 .text:00438043에 표시된 JZ 명령어입니다. 이것을 JNZ(명령어 0x74 -> 0x75)로 변경하면 분기가 반전되어 임의의 비밀번호가 허용됩니다.
Python 스크립트는 SEP 설치 폴더를 찾고, SymCorpUI.exe를 읽어 패치된 복사본을 스크립트 옆 폴더에 작성한 후, 원래 작업 디렉터리에서 패치된 버전을 실행합니다. 권한으로 실행하면 잘못된 비밀번호를 입력해도 수락하는 SEP UI가 실행됩니다.
이제 공격자는 도움말 > 문제 해결에서 정책 XML을 내보낼 수 있습니다. 여기에는 관리자 비밀번호 해시를 포함한 구성이 포함됩니다. 그런 다음 공격자는 XML을 편집하여 클라이언트의 모든 설정을 변경할 수 있습니다. 예를 들어 비밀번호 해시를 교체하거나 비밀번호 요구 사항을 비활성화할 수 있습니다. 이 악성 정책 XML은 내보내기 옆에 있는 버튼을 사용하여 다시 가져올 수 있습니다.
스크립트는 상승된 권한인지 확인하고, 그렇지 않은 경우 패치된 바이너리를 관리자 권한 없이 실행하도록 강제합니다. UI를 관리자로 실행하려면 Python 스크립트를 관리자로 실행하거나 as_admin 변수를 True로 하드코딩하십시오.
각 빌드에 대해 특정 오프셋을 저장하지 않기 위해, 스크립트는 제가 테스트한 세 가지 버전에서 고유한 것으로 확인된 명령어 시퀀스를 일반 검색/바꾸기합니다. 다른 버전에서 여러 일치 항목이 발견되어 PoC가 깨질 가능성이 있습니다. 이 경우 일치 항목을 살펴보고 mov ecx, offset ServiceName ; "SepMasterService"로 시작하는 블록을 찾아 하단 근처에서 패치할 관련 JZ 명령어를 찾으십시오.
비밀번호 기능을 테스트하기 위해 정책 XML(GlobalGroups와 같은 수준)에 다음을 추가하여 보호를 활성화할 수 있습니다. 해시는 문자열 "test"의 MD5입니다.
<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