이 저장소에는 권한 없는 사용자가 임의의 커널 드라이버를 시스템에 로드할 수 있게 해주는 TeamViewer의 취약점에 대한 공격 개념 증명이 포함되어 있습니다. 취약점을 보고하고 책임감 있게 공개할 수 있도록 협력해주신 Zero Day Initiative에 감사드립니다.
이러한 취약점으로 끝난 연구에 대한 자세한 내용은 내 블로그의 다음 3부작 블로그 시리즈에서 확인할 수 있습니다. 그들은 이러한 취약점을 더 자세히 다루고 프로세스 중에 내가 실패한 부분도 보여줍니다. 세 번째 부분은 재미있는 부분입니다. :P.
익스플로잇에 대한 비디오는 여기에서 찾을 수 있습니다:
시스템 서비스 IPC에 연결할 때 유효한 TeamViewer 클라이언트를 스푸핑 (블로그에 설명된 대로 간단한 인증)할 수 있게 된 후 임의의 드라이버 설치를 트리거할 수 있었습니다. TeamViewer가 설치 중인 드라이버의 서명을 확인하지 않았습니다.
따라서 TeamViewer 덕분에 USER에서 KERNEL로의 권한 확장이 가능했습니다.
가장 좋은 접근 방식 중 하나는 잘 알려진 기술인 BYOD(Bring Your Own Vulnerable Driver)를 사용하여 유효한 서명된 드라이버를 Windows 커널에 로드한 다음 이를 활용하여 사용자 수준에서 임의의 토큰 변경과 같은 권한 있는 작업을 수행하는 것입니다. 특권을 가진 프로세스.
TeamViewer가 시스템에 설치되면 SYSTEM으로 실행되는 서비스인 TeamViewer_service.exe가 생성됩니다.
이 서비스는 클라이언트의 일부 작업을 돕는 도우미입니다. 따라서 클라이언트는 상승된 권한으로 실행되지 않으며 일부 작업은 서비스에 위임됩니다.
서비스(IPC)와의 통신은 소켓( Overlapped I/O 및 IoCompletionPort 사용)을 통해 구현됩니다. 기본적으로 TeamViewer 시스템 서비스는 localhost에서 5939/tcp 를 수신합니다.
TeamViewer는 드라이버 설치나 서명 확인 등을 요청하기 위해 클라이언트가 보낸 매개변수를 필터링하지 않습니다.
따라서 아이디어는 다음과 같습니다. TV 클라이언트를 스푸핑하여 VPN 드라이버 설치를 요청하지만 다른 INF를 표시합니다. TeamViewer의 동일한 원본 INF를 다시 활용했지만 다른(권한이 없는) 경로에서 "잘못된" 드라이버의 이름을 teamviewervpn.sys 로 바꾸었습니다. 이는 원래 INF의 대상이 되는 드라이버 이름이기 때문입니다.
이는 TeamViewer 옵션도 무시합니다 . 변경하려면 이 컴퓨터에 대한 관리 권한이 필요합니다 .
권한이 없는 사용자가 버튼을 클릭하면 TeamViewer 옵션이 비활성화되므로 이 확인은 GUI를 통해서만 유효합니다. 그러나 소켓에 연결하여 임의의 드라이버 로드를 수행하는 것은 가능합니다.
클라이언트가 해당 PID와 버전 중 다른 데이터를 지정한 IPC 메시지 때문에 익스플로잇은 버전에 따라 다릅니다. 클라이언트 버전은 SYSTEM 서비스 버전과 일치해야 합니다. 익스플로잇은 Main.cpp에서 대상으로 삼고 있는 TeamViewer_service.exe 버전으로 수정되어야 합니다(140~143행).
따라서 기본적으로 SYSTEM 서비스에 연결하는 TeamViewer 클라이언트를 스푸핑하고 임의의 드라이버 설치를 요청합니다. TeamViewer 서비스는 이를 커널에 친절하게 로드합니다.
TeamViewer에는 제가 처음 발견한 메시지( VPN 드라이버 설치를 클릭할 때 표시됨)와 매우 유사한 또 다른 IPC 메시지가 있습니다. 이 다른 메시지는 프린터 드라이버를 설치하라는 메시지입니다.
따라서 본질적으로 CVE-2024-7479와 CVE-2024-7481은 동일하지만 TeamViewer는 동일한 오류를 두 번 범했습니다. 메시지는 다르지만 매우 유사합니다. 그들은 다른 IPC Method Id를 가지고 있습니다.
결과는 동일하며 임의의 드라이버를 로드할 수 있습니다.