
CVE-2023-34312
영향받는 제품:
영향받는 구성 요소:
Tencent QQ 및 TIM은 선전 텐센트 컴퓨터 시스템 유한회사(Shenzhen Tencent Computer System Co., Ltd.)가 개발한 두 가지 인스턴트 메신저 소프트웨어입니다. 두 소프트웨어 모두 %ProgramFiles(x86)%\Common Files\Tencent\QQProtect\bin에 위치한 QQProtect.exe 구성 요소를 가지고 있습니다. _QQProtect.exe_는 _QPCore_라는 Windows 서비스로 설치되며 시스템이 시작될 때 NT Authority\SYSTEM으로 자동 실행됩니다. QQProtect.exe 구성 요소와 해당 종속 DLL인 QQProtectEngine.dll 모두 임의 주소 쓰기 취약점을 가지고 있습니다. 낮은 권한의 공격자는 두 취약점을 결합하여 QQProtect.exe 프로세스 내에 악성 DLL을 로드하고 NT Authority\SYSTEM 셸을 얻을 수 있습니다.
첫 번째 취약점은 QQProtect.exe+0x40c9f8의 코드입니다:

여기서 a2는 공격자가 제어할 수 있는 포인터이고 dword_41a740은 값이 0x00000001인 전역 변수입니다. 따라서 공격자는 임의의 주소에 DWORD(1) 값을 쓸 수 있습니다.
두 번째 취약점은 QQProtectEngine.dll+0x3B4F6의 코드입니다:

여기서 v3는 공격자가 제어할 수 있는 포인터입니다. 따라서 공격자는 임의의 주소 ptr에 std::bit_cast<DWORD>(ptr) + 4 값을 쓸 수 있습니다.
공격자는 QQProtect.exe에 존재하는 함수 포인터를 변조할 수 있으며, QQProtect.exe는 ASLR 보호가 없기 때문에 ROP 체인을 사용하여 쉽게 임의 코드를 실행할 수 있습니다.
poc 코드는 Rust 언어로 작성되었습니다. 컴파일하려면 i686-pc-windows-msvc 툴체인을 사용해야 합니다.
$ cd poc
$ cargo +stable-i686-pc-windows-msvc build --release --config "build.rustflags = [\"-C\", \"target-feature=+crt-static\"]"
다음 두 개의 DLL을 얻게 됩니다:
target\release\tinyxml.dll
target\release\evil.dll
그런 다음 위의 두 DLL과 %ProgramFiles(x86)%\Common Files\Tencent\QQProtect\bin\QQProtect.exe를 같은 폴더에 넣습니다.
마지막으로 한 가지 명령으로 NT Authority\SYSTEM 셸을 얻습니다:
$ QQProtect.exe <PATH TO evil.dll>
