受影响的产品:
• QQ 9.7.1.28940 ~ 9.7.8.29039
• TIM 3.4.5.22071 ~ 3.4.7.22084
使用Ninja系统复现:
qq安装

受影响的组件:
• QQProtect.exe 4.5.0.9424(在 TIM 3.4.5.22071 中)
• QQProtect.exe 4.5.0.9426(在QQ 9.7.1.28940中)
• QQProtectEngine.dll 4.5.0.9424(在 TIM 3.4.5.22071 中)
• QQProtectEngine.dll 4.5.0.9426(在QQ 9.7.1.28940中)
一、总结
腾讯QQ和TIM是深圳市腾讯计算机系统有限公司开发的两款即时通讯软件。它们都有一个组件QQProtect.exe,位于%ProgramFiles(x86)%\Common Files\Tencent\QQProtect\bin. QQProtect.exe作为名为QPCore的 Windows 服务安装,并NT Authority\SYSTEM在系统启动时自动运行。组件QQProtect.exe及其依赖的DLL QQProtectEngine.dll均存在任意地址写入漏洞。低权限攻击者可以结合这两个漏洞在QQProtect.exe进程中加载恶意DLL并获取NT Authority\SYSTEMshell。

  1. 漏洞
    第一个漏洞是QQProtect.exe+0x40c9f8处的代码:

其中a2是一个可以被攻击者控制的指针,dword_41a740是一个全局变量,其值为0x00000001。因此攻击者可以在任何地址写入该值DWORD(1)。
第二个漏洞是QQProtectEngine.dll+0x3B4F6处的代码:

其中v3是可以被攻击者控制的指针。因此攻击者可以std::bit_cast(ptr) + 4在任何给定地址写入该值ptr。
QQProtect.exe由于QQProtect.exe没有ASLR保护,攻击者可以轻易篡改驻留的函数指针并利用ROP链执行任意代码。

  1. 概念证明
    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最后用一个命令获取shell:
$ QQProtect.exe

  1. 演示