其他
基于Win32k内核提权漏洞的攻防对抗
点击蓝字
关注我们
产生原因
1.2 GDI对象
利用框架
Win32k 的 NtGdiResetDC 函数中的一个释放后使用漏洞,在执行其自己的回调期间针对同一句柄第二次执行函数 ResetDC 时触发UAF漏洞。
2.2漏洞利用
信息泄露阶段
Demo1,通过GdiSharedHandleTable去泄露bitmap对象:
Demo2,通过HMValidateHandle函数泄漏内核对象:
Bitmap系列:SetBitmapBits/GetBitmapBits可对内核对象bitmap的pvScan0指向的像素数据内存进行修改。
Palette系列:GetPaletteEntries/SetPaletteEntries可对内核对象Palette的成员pFirstColor(指向4个bytes的数组PALETTENTRY)修改构造RW原语。
Wnd系列:SetWindowLog/SetWindowLogPtr对wnd(tagWnd)内核对象的修改能力。
Menu系列(最新):GetMenuBarInfo,当其第二参数、第三参数分别设置成-3,1的时候,可以借助menu bar info获取16字节的读取能力。
Token指针替换(_EX_FAST_REF替换)
Token中的成员替换
内核对象
3.1Bitmap
简介
Bitmap关键结构体及对象
CreateBitmap相关
扫描线
3.2Palette
简介
Palette关键结构体及对象
Createpalette相关
3.3Wnd
简介
可以想象Windows创建的所有窗口都有一个大表。它使用此表按其句柄查找窗口。(它内部的工作方式是否完全相同都很重要。) 窗口句柄的数据类型是 HWND, 这通常发音为"aitch-wind"。窗口句柄由创建窗口的函数返回 :CreateWindow 和 CreateWindowEx。
关键结构体及对象
关键函数分析
SetWindowLongPtr
xxxSetWindowData
获取相邻Wnd
3.4Menu
简介
Menu关键结构体及对象
信息泄露能力
攻防进化史
4.1Win7下的利用模式
缓解措施
Win32k.sys未分离 信息泄露的方式最多(目前已知技术均兼容win7) 0页内存机制未被缓解 Win32k 内核对象公开(成员偏移清晰)
利用思路
创建两个bitmap对象分别为hManager、hWorker,通过GdiSharedHandleTable泄露内核地址。 利用任意地址覆盖写漏洞,将hManager的pvScan0修改为指向hWorker成员pvScan0的地址。
构造对内核任意地址的RW原语(GetBitmapBits/SetBitmapBits)
本地提权—令牌替换
4.2RS1 下的利用模式
缓解措施
利用思路
User Object地址获取
= SHAREDINFO->USER_HANDLE_ENTRY->pKernel + handle&0xffff
Accelerator table 对象创建
堆分水
4.3RS2 下的利用模式
缓解措施
利用思路
获取lpszMenuName的地址.
堆风水
4.4RS3 下的利用模式
缓解措施
利用思路
创建两个palette对象分别为hManager、hWorker,并通过桌面堆泄露内核地址。
利用任意地址覆盖写漏洞,将hManager的pFirstColor修改为指向hWorker成员pFirstColor的地址。
构造对内核任意地址的RW原语(GetPaletteEntries/ SetPaletteEntries)
提权-令牌替换(与bitmap方式一致)
4.5攻防现状
缓解措施
附录
5.1参考链接
5.2环境介绍
靶场
往期推荐