
Prova de conceito de escalonamento local de privilégios no servidor de mídia Plex - CVE-2021-42835
Plex Media Server para Windows anterior à versão 1.25.0.5282, vulnerável a Time Of Check Time Of Use (TOCTOU) que permite que usuários com baixos privilégios obtenham privilégios de SYSTEM.
Tomer Peled, Netanel Cohen e Amir Shen, pesquisadores de segurança da BugSec.
Plex para Windows usa PlexUpdateService.exe para instalar novas atualizações. O serviço é executado no contexto de SYSTEM. Ao instalar uma atualização, o serviço primeiro verifica a integridade do arquivo e a assinatura digital, somente se as verificações forem bem-sucedidas a atualização será instalada.
Neste processo, após a verificação de integridade e assinatura, houve uma falha de design que tratou o arquivo de atualização de forma inadequada. O arquivo foi fechado e reaberto posteriormente para instalação.
Esta falha permite que um invasor troque o arquivo de atualização por um malicioso assim que o serviço terminar de verificar a integridade e a assinatura, resultando em execução de código no contexto de SYSTEM.
Este POC utiliza ferramentas desenvolvidas por James Forshaw com pequenas modificações. O original pode ser encontrado aqui - https://github.com/googleprojectzero/symboliclink-testing-tools
Para alcançar o acima, usamos uma pasta Junction que primeiro apontará para uma pasta contendo um arquivo de atualização válido e depois será trocada para uma pasta contendo o arquivo malicioso.
Descobrimos que a ordem de acesso ao arquivo era a seguinte:
Criamos um ponto de montagem na pasta junction para apontar para uma pasta que contém o arquivo de atualização válido. Configuramos um opLock no cacert.pem com uma função de callback. Assim que ele acessa, alteramos o ponto de montagem para a pasta maliciosa.
Além disso, criamos um cliente RPC que acionará a atualização.
PlexClient/PlexClient.cpp substitua ROOTDIR pelo seu caminho.
const wchar_t* pszString = L"<ROOTDIR>\\PlEXcalaison\\TOCTOU\\junction\\plex.exe"; // Path to the update file.
PlEXcalaison/BaitAndSwitch/BaitAndSwitch.cpp substitua ROOTDIR pelo seu caminho.
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