
Windows 10 Diagnostics Hub Standard Collector Service에서의 권한 상승 PoC
Windows 10 Diagnostics Hub Standard Collector Service의 권한 상승을 위한 PoC
Windows 표준 수집기 서비스에서 사용되는 Diagnostics Hub 패키징 라이브러리는 DiagnosticsHub.StandardCollector.Runtime.dll의 클라이언트 가장(client impersonation) 부재로 인해 임의의 파일을 임의의 위치로 복사하도록 강제할 수 있습니다.
이 취약점이 어떻게 발견되고 악용되었는지에 대한 자세한 문서는 여기에서 확인할 수 있습니다: Windows 표준 수집기 서비스의 권한 상승 취약점.
표준 수집기 서비스는 진단 세션 구성 시 임시 디렉터리(scratch directory)와 세션 ID를 포함한 여러 값을 정의할 수 있게 해줍니다. 세션 ID는 임의의 GUID일 수 있고, 임시 디렉터리는 사용자에게 쓰기 권한이 있는 모든 위치일 수 있습니다. 컬렉션 세션이 ID c13851b2-b1e1-438f-bf73-949df897f1bf 및 임시 경로 C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\로 구성된 경우, ICollectionSession 객체의 GetCurrentResult 메서드를 호출할 때 다음 이벤트가 발생합니다:
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-5DF276F69E65이러한 폴더와 ETL 파일은 일반적으로 세션이 종료될 때 생성되는 .diagsession 패키지를 위해 수집기 서비스에 의해 생성됩니다. ICollectionSession 객체에서 Stop 메서드를 호출하면 수집기 서비스가 Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage를 호출하여 진단 패키지를 커밋합니다. CommitPackage 함수는 원본 {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl 파일을 임의의 GUID 폴더인 {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl로 복사하거나 이동합니다.
DiagnosticsHub.StandardCollector.Runtime.dll의 CommitPackagingResult 함수에 의해 트리거되는 복사/이동 작업은 (초기 파일/폴더 생성과 달리) 사용자를 가장하지 않고 수행되므로, 대상 폴더가 복사를 임의의 위치로 리디렉션하는 마운트 지점으로 교체되면 TOCTOU 문제가 발생할 수 있습니다. 이 문제를 실질적으로 악용하려면 공격자는 ETL 파일이 복사되기 전에 그 내용을 교체해야 합니다. 이는 서비스가 파일 핸들을 해제한 후 OpLock으로 경쟁 상태(race condition)를 이겨내면 가능합니다.
우리는 복사되는 .etl 파일의 이름을 완전히 제어할 수는 없지만, 객체 디렉터리 심볼릭 링크 트릭을 사용하여 이를 제어할 수 있습니다. 마운트 지점 + 심볼릭 링크 구성은 다음과 같은 형태입니다:
{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.dll파일 내용, 복사 위치, 파일 이름을 제어할 수 있게 되면 공격자는 수많은 DLL 로딩 가능성을 얻을 수 있습니다. 그러나 포함된 PoC는 파일 이름 제어가 필요하지 않음을 보여줍니다. 수집기 서비스는 C:\Windows\System32 또는 C:\Windows\System32\DiagSvcs 디렉터리에만 있다면 어떤 파일 이름의 DLL이라도 기꺼이 로드하기 때문입니다. 이는 복사된 DLL의 이름 c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl과 일치하는 어셈블리 이름을 가진 에이전트로 새 수집기 세션을 시작하여 수행됩니다.
포함된 PoC는 notepad.exe를 실행하는 페이로드를 위한 C++ DLL 프로젝트와, NtApiDotNet 라이브러리를 사용하여 서비스와 상호 작용하고 취약점을 악용하는 C# 프로젝트로 구성된 VS 솔루션입니다.
재현 단계:
예상 결과:
패키지 커밋 작업은 사용자를 가장하고 파일 복사를 시도할 때 실패합니다.
실제 결과:
파일이 마운트 지점 대상 폴더인 C:\Windows\System32로 복사된 다음 수집기 에이전트로 로드되고, 마지막으로 notepad.exe가 SYSTEM 권한으로 실행됩니다.