介绍

CVE-2018-8120漏洞是Windows 7 及 Windows Server 2008系列中的一个经典的提权漏洞,这篇文章中我们将一步步分析漏洞成因,并构造利用POC。

复现环境

Win7 x86虚拟机(Vmware)

漏洞点

​ 该漏洞存在于SetImeInfoEx函数中;在一处访问内核对象的数据时,没有判断是否合法即进行访问。

回溯分析

​ 交叉引用查找发现,只有在系统调用函数NtUserSetImeInfoEx中调用该函数

​ 查看这部分代码,可以知道SetImeInfoE函数的第一个参数来源是GetProcessWindowsStation

​ 想要搞清楚pWinStation的结构,需要找到GetProcessWindowStation函数原型,在MSDN上对该函数的定义如下:

HWINSTA GetProcessWindowStation();
If the function succeeds, the return value is a handle to the window station.

​ 这样,我们就知道了pWinStation是Window Station的Handle。在Windows中Handle实际也就是内核的对象引用,这里是WindowsStation对象。在Windbg中查看得到该对象的信息

​ 对比漏洞触发时引用的位置v3[5]实际是WindowStation结构偏移0x14的数据对象即spklList;而spklList默认为NULL!

另外在查询该API时,同是也能查到关于Window Station其余的API信息,其中关系最紧密的就是

//CreateWindowStation创建一个Window Staion
HWINSTA CreateWindowStationA(
 LPCSTR        lpwinsta,
 DWORD         dwFlags,
 ACCESS_MASK      dwDesiredAccess,
 LPSECURITY_ATTRIBUTES lpsa
);

//SetProcessWindowStation 为当前进程设置Window Station

BOOL SetProcessWindowStation(
 HWINSTA hWinSta
);

验证POC

根据上面的漏洞点、溯源成因分析。我们可以用相关的API接口构造一个简单的POC。

其中NtUserSetImeInfoEX函数属于系统调用,没有直接的导出函数可以调用,所以需要根据调用号自定义实现。

该函数的定义在Win7上没有找到(在Win10后win32k.sys的系统调用可以在win32u.dll中找到)但是有公开的文档

在这里可以找到Windows系统调用在各个版本号上的系统调用号。

还可以在ntdll.dll中找到系统调用如何自定义实现

(其中mov eax, 0x….是系统调用号)

据此我们可以实现自定义的NtUserSetImeInfoEx函数

接下来我们需要编译并在目标Windows7上运行。

运行之后windbg收到异常,断下状态如下

继续运行,目标系统蓝屏

深入分析可利用性

​ 根据上述内容,我们知道SetImeInfoEx函数的第一个参数是pWinStation,第二个参数实际就是NtUserSetImeInfoEx的参数(char*)的前0x15c的内容。也即都是可控的。

而我们发现在SetImeInfoEx中,最终将执行qmemcpy操作,而且目的地址、源地址在某种程度都是可控的。只要在访问NULL时不会触发异常即可!

这一部分代码还可以从Windows泄漏的部分源码中查到,可以辅助分析。win2000源码

探索Windows 7 内核分配NULL空间地址

​ 在用户层应用程序中,NULL引用可能是无法导致代码执行的。但是在内核态,NULL引用却有意向不到的效果(Win7上)

​ 这里不得不提Windows的一个未公开API(在ntdll.dll中)

NTSTATUS NtAllocateVirtualMemory(
 _In_  HANDLE   ProcessHandle,
 _Inout_ PVOID   *BaseAddress,
 _In_  ULONG_PTR ZeroBits,
 _Inout_ PSIZE_T  RegionSize,
 _In_  ULONG   AllocationType,
点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖