CVE4398.docx

上传人:b****5 文档编号:3025534 上传时间:2022-11-17 格式:DOCX 页数:10 大小:59.22KB
下载 相关 举报
CVE4398.docx_第1页
第1页 / 共10页
CVE4398.docx_第2页
第2页 / 共10页
CVE4398.docx_第3页
第3页 / 共10页
CVE4398.docx_第4页
第4页 / 共10页
CVE4398.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

CVE4398.docx

《CVE4398.docx》由会员分享,可在线阅读,更多相关《CVE4398.docx(10页珍藏版)》请在冰豆网上搜索。

CVE4398.docx

CVE4398

CVE-2010-4398分析

KiDebug

1.废话

本文分析所采用的操作系统为Windows7旗舰版,使用到的工具有:

VMWare+Windbg+IDAPro5.5。

转载时请注明“KiDebug”。

联系方式:

KiDebug@

2.漏洞函数分析

POC及分析见翰海源网站:

或:

翰海源的分析有一个错误的地方,仍然以WindowsXP的win32k.sys5.1.2600.6033为例,在NtGdiEnableEudc的整个执行过程中,会在sub_BF8773B7、sub_BF88BD4A两个函数里调用到nt!

RtlQueryRegistryValues。

sub_BF88BD4A正如翰海源分析一样,没有问题,有问题的是sub_BF8773B7,它先于sub_BF88BD4A被调用,可以造缓冲区溢出。

sub_BF8773B7中启用了securitycookie,在不知道securitycookie值的情况下,很大几率会因为securitycookie值不匹配而蓝屏,造成拒绝服务。

securitycookie值随着系统的每次启动而不同,但系统启动后,以任何用户运行任何程序,这个值都不会改变。

现在以win32k.sys(6.1.7600.16691)为例,POC在进入win32k.sys后,在sub_BF81BA0B函数中调用到了nt!

RtlQueryRegistryValues,此时函数调用顺序如下:

Win32k!

NtGdiEnableEudc

Win32k!

GreEnableEUDC

Win32k!

sub_BF81B3B4

Win32k!

sub_BF81BA0B

nt!

RtlQueryRegistryValues定义及传递的参数如下所示:

NTSTATUS

RtlQueryRegistryValues(

INULONGRelativeTo,//0

INPCWSTRPath,//L"\REGISTRY\USER\(当前用户SID)\EUDC\936"

INPRTL_QUERY_REGISTRY_TABLEQueryTable,//win32k!

SharedQueryTable

INPVOIDContext,//0

INPVOIDEnvironmentOPTIONAL//0

);

win32k!

SharedQueryTable结构体成员的值如下:

win32k!

SharedQueryTable->QueryRoutine=0;

win32k!

SharedQueryTable->Flags=24;

win32k!

SharedQueryTable->Name=L"SystemDefaultEUDCFont";

win32k!

SharedQueryTable->EntryContext=ebp-0x20;

win32k!

SharedQueryTable->DefaultType=0;

win32k!

SharedQueryTable->DefaultData=0;

win32k!

SharedQueryTable->DefaultLength=0;

ebp-0x20实际上是一个UNICODE_STRING结构体,UNICODE_STRING.Buffer是位于0xBF81BA1F处调用MALLOCOBJ:

:

MALLOCOBJ函数分配的。

对于POC,nt!

RtlQueryRegistryValues将会依次调用到nt!

RtlpCallQueryRegistryRoutine、nt!

RtlpQueryRegistryDirect。

数据复制是在nt!

RtlpQueryRegistryDirect函数中完成的,定义及功能可以参考WRK。

以下是nt!

RtlpQueryRegistryDirect中部分代码,以Windows7旗舰版MS11-011(KB2479628)补丁前最新的ntkrnlpa.exe6.1.7600.16617为例:

1 nt!

RtlpQueryRegistryDirect:

PAGE:

005F89F6pushesi

PAGE:

005F89F7movesi,[ebp+Destination]

[ebp+Destination]是win32k中win32k!

SharedQueryTable->EntryContext,这个值指向的是栈地址ebp-20,为一个UNICODE_STRING结构体。

2 nt!

RtlpQueryRegistryDirect:

PAGE:

005F8A40addesi,8

PAGE:

005F8A27pusheax;size_t

PAGE:

005F8A28pushebx;void*

PAGE:

005F8A29pushesi;void*

PAGE:

005F8A2Acall_memcpy

如果注册表数值SystemDefaultEUDCFont的类型不是REG_SZ

(1)、REG_EXPAND_SZ

(2)、REG_MULTI_SZ(7)的话,执行以上代码,数据将会复制到栈上。

eax为数值数据长度,足够长的话,将会覆盖存在于栈上的函数返回地址。

3 nt!

RtlpQueryRegistryDirect:

PAGE:

005F8A76pusheax;size_t

PAGE:

005F8A77pushebx;void*

PAGE:

005F8A78pushdwordptr[esi+4]

PAGE:

005F8A7Bcall_memcpy

如果注册表数值SystemDefaultEUDCFont的类型是REG_SZ

(1)、REG_EXPAND_SZ

(2)、REG_MULTI_SZ(7)的话,执行以上代码,数据将会复制到[esi+4](UNICODE_STRING.Buffer)指向的一片内存缓冲区上,不会有栈溢出的情况发生。

以下是示意图:

\REGISTRY\USER\(当前用户SID)\EUDC\下的键、数值对于普通用户来说都是可以修改的,因此在普通用户下可以修改“SystemDefaultEUDCFont”数值类型,使得nt!

RtlpQueryRegistryDirect将数据复制到栈空间里,覆盖sub_BF81BA0B函数的返回地址,跳到自定义的shellcode中,shellcode以Ring0权限执行,无论是加载驱动还是修改进程Token,都不是问题。

3.如何利用?

下面将分析POC中是如何设计数据长度、内容,以便能覆盖返回地址,并且使函数在运行过程中不会出错蓝屏的。

1 放置shellcode地址

上图是函数sub_BF81BA0B栈示意图。

如果注册表数值SystemDefaultEUDCFont的类型不是REG_SZ

(1)、REG_EXPAND_SZ

(2)、REG_MULTI_SZ(7)的话,nt!

RtlpQueryRegistryDirect将先填充数值类型和数据长度,然后再复制数据内容,数据的内容是从EBP-0x20+0x8开始复制的,返回地址位于EBP+0x4,所以shellcode的地址需要位于数据的(EBP+0x4)-(EBP-0x20+0x8)=0x1C处。

win32k!

sub_BF81BA0B从nt!

RtlQueryRegistryValues返回后,将会调用

errno_twcsncpy_s(

wchar_t*strDest,//参数1:

EBX

size_tnumberOfElements,//参数2:

0x104

constwchar_t*strSource,//PUNICODE_STRING->Buffer

size_tcount//PUNICODE_STRING->Length,也即3

);

只要将参数1:

EBX、参数2:

0x104覆盖成0,wcsncpy_s也就不会执行拷贝操作了。

所以数据长度需要是:

0x20-0x8+0x10=0x28(EBP前面0x18个字节,EBP、返回地址、两个参数4个DWORD共0x10个字节,所以一共是0x28个字节)

在XP、2003中,win32k!

SharedQueryTable->EntryContext=EBP-0x424,所以shellcode的地址需要位于数据的(EBP+0x4)-(EBP-0x424+0x8)=0x420处,数据长度需要是:

0x424-0x8+0x10=0x42C(EBP前面0x41C个字节,EBP、返回地址、两个参数4个DWORD共0x10个字节,所以一共是0x42C个字节)。

2 寻找函数sub_BF81BA0B返回地址

在执行完shellcode后,需要找到覆盖前的函数sub_BF81BA0B返回地址,以便整个线程继续运行下去。

Windows7引入了ASLR机制,内核模块的加载地址也是随机化的,所以需要获取到实际的函数sub_BF81BA0B返回地址,在函数sub_BF81B3B4中调用到了函数sub_BF81BA0B。

在函数sub_BF81B3B4开始处:

.text:

BF81B3B9subesp,24h

.text:

BF81B3BCpushebx

.text:

BF81B3BDpushesi

.text:

BF81B3BEpushedi

此时函数sub_BF81B3B4的EBP=ESP+0x24+0x4+0x4+0x4=ESP+0x30,

从sub_BF81BA0B返回,弹出shellcode地址,平衡push104h、pushebx两个参数,所以此时依然有EBP=ESP+0x30,EIP指向shellcode地址。

在EBP+4处是函数sub_BF81B3B4的返回地址0xBF81B8FC。

因此可以从ESP+0x34处取到sub_BF81B3B4函数的返回地址。

1.CallXXX函数二进制:

E8(4字节偏移)

2.返回地址

Call后面的4字节存储的是XXX函数相对于返回地址的偏移,因此:

XXX函数地址=返回地址+Call后面的4字节DWORD

在win32k!

GreEnableEUDC中调用sub_BF81B3B4的代码如下:

.text:

BF81B8F7callsub_BF81B3B4

.text:

BF81B8FCjmpshortloc_BF81B908

在得到0xBF81B8FC实际地址后,由call指令就可以获得sub_BF81B3B4函数的实际地址,进而搜索到0xBF81B46B实际的地址,即函数sub_BF81BA0B的返回地址:

.text:

BF81B460push104h

.text:

BF81B465pushebx

.text:

BF81B466callsub_BF81BA0B

.text:

BF81B46Btesteax,eax;函数sub_BF81BA0B的返回地址

取函数sub_BF81BA0B的返回地址是在shellcode中执行的。

Shellcode此外还需要恢复函数sub_BF81B3B4的EBP。

3 如何将CMD.exe提权为SYSTEM?

POC中是调用IoGetCurrentProcess

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1