
Plex 미디어 서버 로컬 권한 상승 PoC - CVE-2021-42835
Windows용 Plex Media Server 버전 1.25.0.5282 이전 버전은 TOCTOU(Time Of Check Time Of Use) 취약점에 영향을 받으며, 낮은 권한의 사용자가 SYSTEM 권한을 획득할 수 있습니다.
Tomer Peled, Netanel Cohen, Amir Shen - BugSec의 보안 연구원들.
Windows용 Plex는 새 업데이트를 설치하기 위해 PlexUpdateService.exe를 사용합니다. 해당 서비스는 SYSTEM 컨텍스트에서 실행됩니다. 업데이트를 설치할 때 서비스는 먼저 파일 무결성과 디지털 서명을 확인하고, 검사가 성공한 경우에만 업데이트를 설치합니다.
이 과정에서 무결성 및 서명 확인 후 업데이트 파일을 부적절하게 처리하는 설계 결함이 있었습니다. 파일이 닫혔다가 설치를 위해 나중에 다시 열렸습니다.
이 결함으로 인해 공격자는 서비스가 무결성 및 서명 확인을 마치는 즉시 업데이트 파일을 악성 파일로 교체할 수 있으며, 결과적으로 SYSTEM 컨텍스트에서 코드 실행이 가능해집니다.
이 POC는 James Forshaw가 개발한 도구를 약간 수정하여 사용합니다. 원본은 여기에서 찾을 수 있습니다 - https://github.com/googleprojectzero/symboliclink-testing-tools
위를 달성하기 위해 먼저 유효한 업데이트 파일이 들어 있는 폴더를 가리킨 후 악성 파일이 들어 있는 폴더로 전환되는 Junction 폴더를 사용했습니다.
파일 접근 순서는 다음과 같다는 것을 발견했습니다.
Junction 폴더에 유효한 업데이트 파일이 들어 있는 폴더를 가리키는 마운트 지점을 만들었습니다. cacert.pem에 콜백 함수와 함께 opLock을 설정하고, 접근하는 즉시 마운트 지점을 악성 폴더로 변경합니다.
또한 업데이트를 트리거하는 RPC 클라이언트를 만들었습니다.
PlexClient/PlexClient.cpp에서 ROOTDIR을 자신의 경로로 바꾸세요.
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // Path to the update file.
PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp에서 ROOTDIR을 자신의 경로로 바꾸세요.
static LPCWSTR junction = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction"; // Path to junction folder , MAKE SURE IT IS EMPTY !
static LPCWSTR target1 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\valid"; // Path to folder contains the valid update file.
static LPCWSTR target2 = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\malicious"; // Path to folder contains the malicious file - MUST BE THE SAME NAME AS THE UPDATE FILE.
static LPCWSTR cacert = L"C:\\Program Files (x86)\\Plex\\Plex Media Server\\Resources\\cacert.pem"; // Path to cacert.pem - can be found in plex directory.
https://ir-on.io/2021/12/02/local-privilege-plexcalation/
https://forums.plex.tv/t/security-regarding-cve-2021-42835/761510