
PoC para Elevação de Privilégio no Serviço Coletor Padrão do Hub de Diagnóstico do Windows 10
PoC para Escalação de Privilégio no Serviço Coletor Padrão do Hub de Diagnóstico do Windows 10
A biblioteca de Empacotamento do Hub de Diagnóstico, usada pelo Serviço Coletor Padrão do Windows, pode ser forçada a copiar um arquivo arbitrário para um local arbitrário devido à falta de impersonação do cliente em DiagnosticsHub.StandardCollector.Runtime.dll.
Aqui está um artigo detalhado sobre como essa vulnerabilidade foi encontrada e explorada: Vulnerabilidade de Escalação de Privilégio no Serviço Coletor Padrão do Windows.
O Serviço Coletor Padrão permite que vários valores sejam definidos ao configurar uma sessão de diagnóstico, incluindo o diretório temporário (scratch) e o ID da sessão. O ID da sessão pode ser qualquer GUID e o diretório temporário pode ser qualquer local onde o usuário tenha permissões de gravação. Se a sessão de coleta for configurada com um ID de c13851b2-b1e1-438f-bf73-949df897f1bf e um caminho temporário de C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\, os seguintes eventos ocorrem ao chamar o método GetCurrentResult do objeto ICollectionSession:
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65Essas pastas e arquivos ETL são criados pelo serviço coletor para o pacote .diagsession que normalmente é criado quando uma sessão termina. Chamar o método Stop no objeto ICollectionSession fará com que o serviço coletor confirme o pacote de diagnóstico chamando Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage. A função CommitPackage copiará ou moverá o arquivo original {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl para a pasta GUID aleatório: {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
A operação de cópia/movimento acionada pela função CommitPackagingResult em DiagnosticsHub.StandardCollector.Runtime.dll é executada sem impersonar o usuário (ao contrário da criação inicial de arquivo/pasta), levando a um possível problema TOCTOU se a pasta de destino for substituída por um ponto de montagem que redirecione a cópia para um local arbitrário. Para explorar esse problema de forma útil, um atacante precisaria trocar o conteúdo do arquivo ETL antes que ele seja copiado. Isso pode ser feito vencendo a condição de corrida com um OpLock após o identificador de arquivo ter sido liberado pelo serviço.
Embora não tenhamos controle total sobre o nome do arquivo .etl que é copiado, podemos usar o truque do symlink do diretório de objetos para controlá-lo. A configuração de ponto de montagem+symlink seria algo assim:
{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dllTer controle sobre o conteúdo do arquivo, o local de cópia e o nome do arquivo dá ao atacante inúmeras possibilidades de carregamento de DLL. No entanto, o PoC incluído demonstra que o controle do nome do arquivo não é necessário, pois o serviço coletor carrega alegremente uma DLL com qualquer nome, desde que esteja no diretório C:\Windows\System32 ou C:\Windows\System32\DiagSvcs. Isso é feito iniciando uma nova sessão de coleta com um agente que possui um nome de assembly correspondente ao nome da DLL copiada c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl.
O PoC incluído é uma solução VS com um projeto de DLL em C++ para o payload de abrir notepad.exe e um projeto em C# para interagir com o serviço e explorar a vulnerabilidade com a biblioteca NtApiDotNet.
Passos para reproduzir:
Resultado Esperado:
A operação de confirmação do pacote impersona o usuário e falha ao tentar copiar o arquivo.
Resultado Observado:
O arquivo é copiado para a pasta de destino do ponto de montagem C:\Windows\System32, depois carregado como um agente coletor e, finalmente, notepad.exe é iniciado com privilégios de SYSTEM.