
Plex media server - PoC di escalation dei privilegi locali - CVE-2021-42835
Plex Media Server per Windows precedente alla versione 1.25.0.5282 è vulnerabile a Time Of Check Time Of Use (TOCTOU) che consente agli utenti con privilegi bassi di ottenere privilegi SYSTEM.
Tomer Peled, Netanel Cohen e Amir Shen, ricercatori di sicurezza di BugSec.
Plex per Windows utilizza PlexUpdateService.exe per installare nuovi aggiornamenti. Il servizio è in esecuzione nel contesto SYSTEM. Quando installa un aggiornamento, il servizio verifica prima l'integrità del file e la firma digitale; solo se i controlli hanno avuto successo, l'aggiornamento verrà installato.
In questo processo, dopo il controllo di integrità e firma, c'era un difetto di progettazione che gestiva il file di aggiornamento in modo improprio. Il file veniva chiuso e riaperto successivamente per l'installazione.
Questa vulnerabilità consente a un utente malintenzionato di sostituire il file di aggiornamento con uno dannoso non appena il servizio ha terminato di verificare l'integrità e la firma, con conseguente esecuzione di codice nel contesto SYSTEM.
Questo POC utilizza strumenti sviluppati da James Forshaw con lievi modifiche. L'originale può essere trovato qui - https://github.com/googleprojectzero/symboliclink-testing-tools
Per ottenere quanto sopra, abbiamo utilizzato una cartella Junction che inizialmente punta a una cartella contenente un file di aggiornamento valido e poi scambia verso una cartella contenente il file dannoso.
Abbiamo scoperto che l'ordine di accesso ai file era il seguente:
Abbiamo creato un punto di montaggio sulla cartella junction per puntare a una cartella che contiene il file di aggiornamento valido. Abbiamo impostato un opLock su cacert.pem con una funzione di callback; appena viene acceduto, cambiamo il punto di montaggio verso la cartella dannosa.
Inoltre, abbiamo creato un client RPC che attiverà l'aggiornamento.
PlexClient/PlexClient.cpp sostituisci ROOTDIR con il tuo percorso.
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // Path to the update file.
PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp sostituisci ROOTDIR con il tuo percorso.
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