来自 网络 2021-06-10 14:21 的文章

防cc攻击_bgp高防服务器_新用户优惠

防cc攻击_bgp高防服务器_新用户优惠

TL;DR初始内核地址揭示"越狱"入伍写原语的候选函数对象()KeWaitForSingleObject()TmpSetNotificationResourceManager()对象()KeReleaseMutex()增量原语避免kereleasembruntatus()中的RtlRaiseStatus()安全忽略Windows上的安全取消链接>=8kitrynawaitthread()中的增量原语正在退出KiTryUnwaitThread()正在退出KiProcessThreadWaitList()和KeReleaseMutex()增量原语摘要函数调用假用户地结构要求任意内核读取原语权限提升注意事项演示结论TL;DR在本系列前面的第3部分中,我们解释了如何赢得竞争条件,并用指向userland中另一个伪的_kenlist的受控数据替换称为_kenlist的内核对象。我们展示了它允许我们重复注入登记队列,因为恢复线程卡在TmRecoverResourceManager()循环中。现在,我们努力解释这个控件在构建更好的漏洞利用原语(例如导致权限提升的任意读/写原语)方面的实际用途。我们还需要弄清楚如何使恢复线程退出循环并干净地返回内核。初始内核地址揭示在研究如何构建一个write原语,并在内核接触到我们的假userland\u kenlist之后打印它时,cc攻击和云防御,ddos防御品牌,我们注意到两个有趣的地址正在泄漏到我们的伪-u kenlist内部的子结构中。为了证明这一点,我们在第3部分中提到的KENLISTMENT_SUPERIOR标志逻辑上设置了一个断点,然后查看内核正在处理的userland_KENLISTMENT的内容:1: kd>u型新台币!TmRecoverResourceManager+0x192:FFFFF 800`02d75b2a 41bf00080000 mov r15d,800小时FFFFF 800`02d75b30 44897c2448 mov dword ptr[rsp+48h],r15dFFFFF 800`02d75b35 eb37 jmp nt!TmRecoverResourceManager+0x1d6(fffff 800`02d75b6e)FFFFF 800`02d75b37 85c9测试ecx,ecxFFFFF 800`02d75b39 750d jne nt!TmRecoverResourceManager+0x1b0(fffff 800`02d75b48)FFFFF 800`02d75b3b 488b4718 mov rax,qword ptr[rdi+18h]FFFFF 800`02d75b3f 83b8c000000005 cmp dword ptr[rax+0C0h],5FFFFF 800`02d75b46 7414 je nt!资源管理器0x1C02800(FFB5+D800)1: 千分之二以上rax=00000000001307b8 rbx=FFFFF A8013F3EB01 rcx=0000000000000001rdx=0000000000000004 rsi=FFFFF A8014AC5620 rdi=00000000001300b8rip=FFFFF 80002D75B2A rsp=FFFFF 88003C749D0 rbp=FFFFF 88003C74B60r8=0000000000000001 r9=0000000000000000R10=0000000000000000000000r11=FFFFF 88002F00180 r12=FFFFF A8013F3EAF0 r13=FFFFF A8013F3EC00r14=000000000000000000R15=00000000000001001: kd>dt\u KENLISTMENT@rdi-0x88新台币!_肯利斯特+0x000 cookie:0+0x008 NamespaceLink:_KTMOBJECT_NAMESPACE_LINK+0x030登记ID:_GUID{00000000-0000-0000-0000-000000000000}+0x040互斥体:_KMUTANT+0x078 NextSameTx:_LIST_ENTRY[0x00000000`00000000-0x0]+0x088 NextSameRm:_LIST_ENTRY[0x00000000`0033fec8-0x0]+0x098资源管理器:(null)+0x0a0事务:0x00000000`001307b8 U K事务+0x0a8状态:0(KEnlistmentUninitialized)+0x0ac标志:0x81+0x0b0通知掩码:0+0x0b8键:(null)+0x0c0 KeyRefCount:0+0x0c8恢复信息:(null)+0x0d0恢复信息长度:0+0x0d8动态名称信息:(null)+0x0e0动态名称信息长度:0+0x0e8最终通知:(null)+0x0f0 supsubEnrollment:(null)+0x0f8 SupSubEnlHandle:(空)+0x100从属Xhandle:(空)+0x108 CrmEnlistmentEnId:_GUID{00000000-0000-0000-0000-000000000000}+0x118 crmenlistmentmId:_GUID{00000000-0000-0000-0000-000000000000}+0x128 CrmEnlistmentRmId:_GUID{00000000-0000-0000-0000-000000000000}+0x138下一步:0+0x13c历史记录:[20]_KENLISTMENT_History1: kd>dt KMUTANT@rdi-0x88+0x40新台币!_KMUTANT公司+0x000报头:_DISPATCHER_报头+0x018变体列表项:_LIST_ENTRY[0xfffffa80`0531ae58-0xfffffa80`13f3eb30]+0x028所有者线程:0xfffffa80`0531ab50_KTHREAD+0x030已放弃:0""+0x031 ApcDisable:0''上面我们看到,我们的假用户地登记已经添加了两个指针_KMUTANT.MuntatListentry公司进入。我们检查关联池头以确认其类型:1: kd>!池0xfffffa80`0531ae58 2池页FFFFF A800531AE58区域是非页面池*fffff a800531aaf0大小:510先前大小:80(已分配)*Thre(受保护)Pooltag Thre:线程对象,二进制:nt!ps公司1: kd>!池0xfffffa80`13f3eb30 2池页fffff a8013f3eb30区域是非分页池*fffff a8013f3ea80大小:2c0先前大小:340(已分配)*TmRm(受保护)Pooltag TmRm:Tm KRESOURCEMANAGER对象,二进制:nt!tm公司经过分析,我们发现这是在锁定与我们的假动作相关联的假动作时发生的。因为了解这个漏洞有助于我们解释如何打破while循环,恢复线程被卡住了,所以我们先来讨论一下。我们注意到,与停留在TmRecoverResourceManager()中的恢复线程相关联的_KTHREAD地址以及与恢复状态相关联的_KRESOURCEMANAGER结构都被注入到其中一个互斥体链接列表中,该列表跟踪进程当前持有哪些互斥体。即使在我们的假互斥体从这个列表中删除之后,这两个指针仍然保留在结构中,因此它允许我们在事实发生之后从userland读取它们。要了解为什么会发生这种泄漏,ddos防御策略,我们需要查看TmRecoverResourceManager()循环中的KeWaitForSingleObject(),ddos攻击防御价格,它在我们的userland\u KENLISTMENT结构中被调用:当(惩罚!=登记负责人地址){if(ADJ(pEnlistment)->Flags&KENLISTMENT_FINALIZED)如果(调整(笔迹)->Flags&KENLISTMENT_FINALIZED){pEnlistment=调整(pEnlistment)->下一次,弗林克;}其他{对象(形容词(宾语));KeWaitForSingleObject(&ADJ(pEnlistment)->互斥,执行,0,0,0i64);假设我们使用的是一个空白的slate互斥体,这意味着我们可以指定它的任何字段,因为它是假的,而且在userland中,ddos20攻击防御,这是第一次引用它。互斥体属于\u-KMUTANT类型:KeWaitForSingleObject()是一个巨大的函数,因此我们将在这里详细介绍它的一些内部结构。如果我们看看下面的一些代码,Object是我们的\u KMUTANT*,所以我们设置Object->标题.信号状态>0输入第二个if条件。如果((Object->标题.类型&0x7F)!=变形对象){//...}如果(Object->标题.信号状态>0||CurrentThread==对象->所有者线程和对象->Header.TimerMiscFlags==当前PRCB->DPCROUTINACTIVE){信号状态=对象->标题.信号状态;if(信号状态==0x80000000){//...}E、 g.让我们设置对象->标题.信号状态到1。然后下面的SignalState变为0,因此我们将避开goto分支并继续。对象->标题.信号状态=——信号状态;if(信号状态)去试试螺纹锁之类的东西;CurrentThread->WaitStatus=0i64;接下来我们将看到以下代码:if(\u interlockedBitStandSet64(&CurrentThread->线程锁,0i64)){旋转计数器=0;做{如果(++自旋计数器和HvlLongSpinCountMask | |!(高压照明和0x40)_mm_pause();其他的HvlNotifyLongSpinWait(旋转计数器);}while(CurrentThread->ThreadLock | | u interlockedBitStandSet64(&CurrentThread->ThreadLock,0i64));CurrentPrcb=超时B;}CurrentThread->KernelApcDisable-=Object->ApcDisable;if(CurrentPrcb->CurrentThread==当前线程)dpcroutinective=当前prcb->dpcroutinective;其他的dpCroutInActive=0;_m_预取(Object);ObjectLock=对象->收割台。锁定;HIBYTE(ObjectLock)=dpcroutinective;Object->OwnerThread=CurrentThread;对象->收割台。锁定=对象锁;在本例中,CurrentThread是一个指针,该指针指向当前的_KTHREAD,与陷于TmRecoverResourceManager()循环中的恢复线程关联,因此代码将Object->OwnerThread设置为该线程,这正是我们感兴趣的。下一步,我们的∗KMUTANT*(Object)被插入到所有者线程变种链表中(_KTHREAD.MutantListHead),而在插入之后:源代码管理器总是闪烁的与我们的资源管理器有关,因为它是最后一个被锁定的变种。Flink入口将指向&_KTHREAD.MutantListHead,这是突变体头目被抓。MutantListHead=&CurrentThread->MutantListHead;MutantListHead_Blink=当前线程->变种人头颅。眨眼;对象->变形了,弗林克=&CurrentThread->MutantListHead;对象->眨眨眼=突变体ListHead_闪烁;MutantListHead_Blink->Flink=&Object->MutantListEntry;当前线程->变种人头颅。眨眼=&Object->MutantListEntry;下图说明了此泄漏到变形了,弗林克以及变了点。眨眼\u KMUTANT的字段,该字段还包含一个将其定义为MutantObject类型的内部_DISPATCHER_头成员。

防cc攻击_bgp高防服务器_新用户优惠

总之,通过将我们的\u-KMUTANT链接到我们的所有者线程变异列表中,我们可以泄漏两个重要的内核结构的地址,我们稍后将依赖这两个结构。"越狱"入伍先前详细的初始内核地址揭示结果非常有价值。请记住,对于TmRecoverResourceManager()中卡在while循环中的恢复线程,我们以前没有真正的出路。回想一下,这是循环条件:EnrollmentHead_addr=&pResMgr->EnrollmentHead;pEnlistment_shifted=pResMgr->征兵队长。弗林克;同时(笔迹移动)