精华内容
下载资源
问答
  • 内核漏洞
    2021-09-05 23:56:05

    内核漏洞利用指南一–攻击核心

    在这个领域知识与最佳的实践一直在相互促进不断发展。新研究与试验会加深我们对事物的理解,这种理解反过来也改变了研究事物的方式,
    让其变的更加专业,更加有效。

    从业人员和研究人员必在评估中须依靠自己的经验与知识并结合一些信息或手段。这些信息和手段可以是任意的,也可以是本文提及的。

    在使用这些信息时,他们应该留心他们自己与他人的安全。其中就包括那些有职业责任的人。

    在法律的最大范围内,对于因产品责任、疏忽或其他原因而使用本书材料中包含的放法、产品、说明或想法而对人员或财产造成的任何伤害和/或损害,
    出版商或作者、贡献者或编辑均不承担任何责任。

    前言

    在多重安全措施下,用户空间的漏洞利比起内核级漏洞利用变的越发艰难。因此内核级漏洞利用在攻击者和利用编写者中越来越受欢迎。
    与计算机操作系统的核心共舞是一件危险的事情。本书涵盖了应用于UNIX derviatives, Mac OS X 和Windows的内核级漏洞利用的理论技术,与实践。

    内核利用是艺术与科学二者的结合。每个操作系统都有自己的怪癖,因此要塑造每个利用,让其充分利用其目标。者本书将讨论最流行操作系统家族,
    UNIX 衍生系统,Mac OS X,以及WIndows。探讨如何获得这些系统的控制权。

    这本的组织结构

    本书被划分为4部分9章节。 第一部分,内核空间一趟旅行,介绍了我们的目标以及内核,目的是建立一个理论基础,在本书的其余部分
    都将围绕这个基础开始构建我们对内核漏洞利用的理解。这就是本书这一部分的内容:

    第一章,从用户空间到内核空间的攻击,介绍了世界范围内的漏洞利用,分析究竟是什么导致了安全研究员与攻击者改变了焦点,
    让焦点从用户空间应用转向到探索正在运行的系统核心,内核身上。
    第二章,内核漏洞的分类,建立一个不同类型漏洞分类,查看他们共有的特征和利用方法。我越能模型化不同的bug类型,我们越能够
    设计编写可靠有效的漏洞利用。当我们从进攻的另一边防守看问题时,会发现这种分类也很方便。我们越理解bug类型,我们越能够发明出
    保护和对抗手段去去应对这些漏洞。
    第三章, 成功内核利用的阶梯,解剖漏洞利用的构建块,对于每一种第二章讲述的bug类型,解释其中的技术以及最优方式。虽然操作系统们以各自不同的方式实现了他们自己的子系统,这章的目标依然是提供一种容易适用各种不同内核和不同架构的通用方式。
    

    第二部分,UNIX 家族,Mac OS X和Windows
    在这里我们将开始弄脏我们双手,开始深入不同操作系统的细节并且开始为每一种bug编写利用。对于每一种系统,我们也会花时间介绍调试工具与方法,这些工具和方法在利用的开发中会变得极为有用。在可能情况下,我们将呈现真实的漏洞利用而不是手工的例子。这里就是你将在本书这个部分所能发现的东西。

    第四章,UNIX家族,分析UNIX衍生系统,主要集中在Linux上,另一部分在(Open)Solaris开源系统上。本章的一部分是详细的介绍用于这些系统调试技术的主要工具(动态追踪,以及内核调试)。
    
    第五章, Mac OS X,涵盖了越来越受欢迎的Leopard版的Mac OS X操作系统。在对主要错误类分析过程中,我们展示了,在寻找内核漏洞的过程中,如何分析逆向内核的封闭部分。
    
    第六章, Windows, 涵盖了世界上最流行的操作系统,Microsoft WIndows。不像之前的章节,这一张我们没有内核源码,因此我们对漏洞和利用的理解来源于逆向工程。因此学习调试和逆向工程工具变得比第4第5章更加重要。我们将会在本章中拿出一部分讲解这个主题。
    

    第三部分, 远程内核利用, 将我们注意从本地假设转变为远程情况。的却我们进入一个棘手的领域,在这个领域中,很多我们曾经学到的用于本地攻击的技术不在适用。虽然Bug类型保持不变,我们需要加入新的武器集合到我们的武器库。第三部分被划分诚两章,重提之前部分的数据结构(第一部分更加理论,第二部分更加实践)在这章你会发现:

    第七章,直面远程内核漏洞利用挑战, 从理论开始,分析何远程场景为什么如影响我们利用方法,提出新的技术解定位远程问题。尽管是一个理论章节,但是也会有几个例子展示,并且主要应用是WIndows操作系统。而对于Linux例子,将会拿出一整个章节去介绍。
    
    第八章, 集中到一起:一个Linux案例的学习,这是针对一个真实的漏洞一步一步分析开发一个可靠,瞬时的远程漏洞利用全过程。这个Linux内核漏洞影响SCTP子系统(http://cve.mitre.org/cgi-bi/cvename.cgi?name=CVE-2009-0065)
    

    第四部分 结束语,结束了这本书,其中夹带了我们对内核安全的见解。它由一个独立的章节构成。

    第九章, 内核进化:未来的攻击与防守
    从我们构建的起始,到我们学习到的内核利用,看到进攻与防守依然会持续。为了给进攻与防守技术多个方面排个序,本章我们转到计算机安全的基础:信息流控制。我们随后使用它作为我们的眼镜,去鉴别bug漏洞的基本特征。以便让我们更好的理解未来Kernel Exploit的发展方向。
    

    本书中提供的所有漏洞和工具的源代码是在书网站www.attackingthecore.com上有效的,这也是提及报告错误的主要位置; 寻找额外的材料; 并且,如果您愿意,请致致联系。请注意,文本中的上标数字表示题为题为章节末尾的终点的Corl-Sponding编号条目。本书中的Footnotes中的Footnotes使用上标刻字格式。

    结论

    撰写一本书是一个美妙而令人恐惧的体验。
    这对作者是一个记录他或她的思想中曾经浮动的许多概念的和关于他或她最喜欢的话题的机会。
    写这本书给我们带来了多方位的挑战。
    我们在解释中力求清晰正确。并将原本放在寻找打破事物的方法上的激情转移到提供有价值的信息上。

    我们希望你会喜欢我们做出的努力,就像我们享受为你整理的过程一样。

    更多相关内容
  • 内核漏洞的利用与防范内核漏洞的利用与防范内核漏洞的利用与防范
  • 内核漏洞:各种内核漏洞
  • 本演讲将介绍系统性模糊测试和挖掘OSX内核漏洞的方法,及如何利用Python提升模糊测试和漏洞挖掘分析效率,并最终分析我们发现的数个OSX内核中的0day。我们将介绍如何利用Python实现自动化提取驱动攻击面和生成测试...
  • Linux内核漏洞简介Linux内核漏洞进攻清单#CVE#描述#内核 [glibc] (glibc <= 2.26) [Sudo] (须藤1.8.6p7-1.8.20) [由于UFO到非UFO路径切换而导致的内存损坏] [由BPF验证程序引起的内存损坏]( 之前Linux内核...
  • Linux内核漏洞浅析

    2020-09-16 01:24:30
    Linux内核漏洞浅析
  • Windows内核漏洞 简介 Windows内核漏洞 进攻清单 #安全公告#KB#说明#操作系统 [Windows后台智能传输服务特权提升漏洞](Windows 7/8/10,2008/2012/2016/2019) [Microsoft Server Message Block 3.1.1(SMBv3...
  • Linux内核漏洞利用技术:覆写modprobe_path 安全架构 安全架构 业务风控 系统安全 APT
  • 在过去,我们往往直接使用Linux内核漏洞完成Android root权限的提升。不过自Android 4.4以来,Android系统安全性得到了不少改善。其中主要的一点就是借助内核DAC、SELinux等安全特性,将app对内核资源的访问权限进行...
  • 内核漏洞的利用与防范》系统地讲解内核级别漏洞利用所需的理论技术和方法,并将其应用于主流操作系统——unix家族、mac os x和 windows。本书分4个部分:第一部分介绍漏洞利用的目标、内核以及理论基础;第二部分...
  • 初步理解内核漏洞:(内核开发人员必读) 内核开发人员,如果不了解内核漏洞的话,容易在开发时引入漏洞,轻则导致内核崩溃,影响上面的所有应用程序;重则导致内核提权,即可以突破应用层的沙箱,进入内核,并在...

    初步理解内核漏洞:(内核开发人员必读)

    内核开发人员,如果不了解内核漏洞的话,容易在开发时引入漏洞,轻则导致内核崩溃,影响上面的所有应用程序;重则导致内核提权,即可以突破应用层的沙箱,进入内核,并在内核里面为所欲为。

    本文章就是讲解一下常见的内核漏洞类型,让内核开发人员有个初步的了解,从而在开发时就会有潜意识,不会制造比较明显的漏洞了。(对于专门挖过内核漏洞的人来说,该文章就没必要看了:)。

    常见的内核漏洞有下面几种:栈溢出(stack overflow)、堆溢出(heap overflow)、整型溢出漏洞(integer overflow)、释放后重用(use-after-free)、双重释放(double free)、线程竞争(race condtion).

    下面通过例子,一一进行简单地介绍:

    栈溢出:

    例子:

    static size_t deviceA_write(struct file *filp, const char __user *buf, size_t len, loff_t *data) 
    {
         int ret = 0;
         char tmp[100] = { 0 };
    
         /* write data to the buffer */
         if (copy_from_user(tmp, buf, len)) {
                    return -EFAULT;
    }

    上述是一个设备驱动的代码,提供了write的接口。即用户在应用层可以调用write函数,向该设备写数据。 内核开发人员都知道copy_from_user是从应用层往内核层拷贝数据,其第一个参数tmp为拷贝的目的地址;第二个参数buf 为拷贝的源地址;第三个参数为拷贝的数据的长度。在这里目标地址的长度为100,但是由于没有对拷贝的长度(len)做限制,当用户传入的长度大于100时,用户的数据就会覆盖掉tmp的100个字节以外的数据。由于栈是从高往低的,因此覆盖的数据会是比tmp的高地址的数据。程序的返回地址一般在进行函数调用时放到栈上,在这里如果将返回地址覆盖掉了,那么就可以控制指令计数器IP,从而可以在内核层任意执行代码了。(这里暂时不考虑内核的缓解措施)

    堆溢出:

    堆溢出和栈类似,只不过溢出的对象为堆而已。比如将上述例子中的char tmp[100] 换成char *tmp = kmalloc(100); 那么就变成堆溢出漏洞了。

    整型溢出:

    整型溢出,就是在进行整数运算时没有考虑到整数本身的上下限。比如unsigned int的下限是0, 上限是0xffffffff. 当a,b,c都是unsgined int 类型时, a = b + c,就有可能发生溢出,溢出的结果会导致a比b或者c都小。 比如b = 0xffffffff, c = 2, 那么a = b + c = 0xffffffff + 2 = 1, 如果对整型溢出不了解,是不是觉得很神奇? 两个数相加的和竟然变小了!

    例子:

    1  int driver_create_buffer(Command *userCommand)
    2  {
    3       ...
    4       uint32_t totalCount = 0;
    5       uint32_t *regAddrBuf = NULL;
    7       uint32_t kernelCount = 1000;
    8       const uint32_t userCount = userCommand->count;
    9       ...
    10      totalCount = kernelCount + userCount;
    11      regAddrBuf = kzalloc(totalCount * sizeof(uint32_t), GFP_KERNEL);
    12      copy_from_user(regAddrBuf, userCommand->buffer, userCount*sizeof(uint32_t));
    13       ...
    14   }

    上述代码的第10行, 将正整数kernelCount与userCount相加,存储到totalCount中。 而userCount是用户可以控制的,当将该值设为很大时,就会导致溢出,比如userCount= 0xffffffff - 1000 + 1时, 那么totalCount的大小就为1。在11行,分配的空间时按照totalCount 进行分配的,在而在12行拷贝的内容长度为userCount, 而userCount明显比totalCount大。因此会导致溢出漏洞。

    释放后重用:

    顾名思义,就是一个内核对象在释放后又使用该对象。这种的漏洞的利用技术已经很成熟了,这里先不介绍利用了:)

    1.  static int dealloc_session(void *core_handle,
    2.      struct session *session)
    3. {
    4.      ...
    5.      deregister(session->handle);
    6.      mutex_destroy(&session->lock);
    7.      sessions[session->id] = NULL;
    8.      kfree(session);
    9.      session = NULL;
    10.     ...
    11. }

    初一看,没什么问题, 将session的所有内容成员都释放以后,然后对session本身进行kfree以后,并且马上设置为NULL。 但是这里没有考虑多线程的问题。比如一个线程在第8行,将session内核对象释放以后,此时另外一个线程正在第5行访问该对象。那么就造成了释放后重用漏洞。

    双重释放:

    双重释放,顾命思义,就是将一个对象释放两次。那么开发人员说了,释放两次就释放两次,那能利用吗? 那么我要说了: 可以利用! 双重释放的漏洞是可以转化为释放后重用漏洞的。并且技术也很成熟。 下面看一个例子:

    1. static long deviceB_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
    2  {
    3.     ...
    4.     if (__copy_from_user(idc, (void __user *)arg, tmp)) {
    5.         kfree(idc);
    6.         err = -EFAULT;
    7.     } else {
    8.         err = spi_message(spi, idc, n_ioc);
    9.     }
    10.    kfree(ioc);
    11.    return 0;
    13. }

    ioctl是内核开发人员很熟悉的,通过ioctl可以给设备驱动添加新的功能。用户层可以直接调用ioctl来使用设备的新功能。 在上述例子中,第5行,将idc内核对象释放了,但是没有返回。在第10行又被释放了一次,造成了内核对象idc的双重释放。

    线程竞争:

    线程竞争漏洞并不是独立的漏洞,一般由于线程竞争会导致释放后重用漏洞或者双重释放漏洞或者堆溢出漏洞等。比如上述的释放后重用漏洞就是由于线程竞争导致的,这里不再进一步说明啦!

    Linux 内核学习经验总结

    学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。

    这份是整理的学习路线思维导图,下面有Linux内核相关视频学习资料:

    Linux内核相关学习视频,清晰版导图可以点击:学习资料 获取

     

     

    展开全文
  • 安全漏洞一内核漏洞利用

    千次阅读 2021-10-20 15:07:04
    漏洞描述 Windows 事件跟踪 (ETW) 机制允许记录内核或应用程序定义的事件以进行调试。 开发人员能够启动和停止事件跟踪会话,检测应用程序以提供跟踪事件,并通过调用 ETW 用户模式 Windows API 集来使用跟踪事件。 ...

    漏洞描述

    Windows 事件跟踪 (ETW) 机制允许记录内核或应用程序定义的事件以进行调试。 开发人员能够启动和停止事件跟踪会话,检测应用程序以提供跟踪事件,并通过调用 ETW 用户模式 Windows API 集来使用跟踪事件。

    最终,这些将导致对内核 (ntoskrnl.exe) 的相应系统调用请求以执行功能。在ETW请求更新周期性捕获状态中,在特定条件下,存在一个use-after-free漏洞,攻击者可以可控地分配一个0x30字节的缓冲区,释放它,然后重用这个缓冲区来执行任意代码。该漏洞于2021年8月末纰漏详情

    漏洞详情

    使用NtTraceControl() 函数发送更新定期捕获状态的请求,函数代码为 0x25(EtwFunctionUpdatePeriodicCaptureState) ,则会调用内核态函数EtwpUpdatePeriodicCaptureState

    第一次调用会申请一块TimerContextInfo内核池。

    第二次调用该函数在在内部可以通过传入的参数(控制GUID),导致(调用回调函数)释放到掉内核对象TimerContextInfo

    第三次调用该函数将再次访问TimerContextInfo,导致UAF

    该漏洞在windows 10低版本中并不存在EtwpUpdatePeriodicCaptureState,本文以windows 10 20H2 x64系统进行Exploit的开发。

    ed2k://|file|cn_windows_10_business_editions_version_20h2_updated_march_2021_x64_dvd_ca61aaaa.iso|6074574848|B6741C4E4B09337471B02DC95E953992|/
    
    

    为了感谢广大读者伙伴的支持,准备了以下福利给到大家:

    [一>获取<一]

    1、200多本网络安全系列电子书(该有的都有了)

    2、全套工具包(最全中文版,想用哪个用哪个)

    3、100份src源码技术文档(项目学习不停,实践得真知)

    4、网络安全基础入门、Linux、web安全、攻防方面的视频(2021最新版)

    6、 网络安全学习路线(告别不入流的学习)

    7、ctf夺旗赛解析(题目解析实战操作)
    [一>获取<一]

    漏洞成因

    第一次调用NtTraceControl函数并发送EtwFunctionUpdatePeriodicCaptureState代码,则会调用内核函数EtwpUpdatePeriodicCaptureState

    ♥ 该函数内部通过传入的LogId获取其对应的LoggerContext,通过控制Logid和GUID,满足EtwpCheckNotificationAccess条件,则会将LoggerContext->PeriodicCaptureStateGuids.ProviderCount置为传入的NumOfGuids。
    ♥ 并在后续申请大小为0x30的TimerContextInfo对象,并进行初始化,设置 TimerContextInfo->WorkItem.WorkerRoutine的回调函数为SendCaptureStateNotificationsWorker,参数为TimerContextInfo对象
    ♥ 调用ExSetTimer,并将LoggerContext->PeriodicCaptureStateTimerState设置为 EtwpPeriodicTimerSet(TRUE),计时器例程为TimerContextInfo

    image.png

    第二次调用时,通过控制传入的GUID,可以让其走Free分支,在这个分支LoggerContext->PeriodicCaptureStateGuids.ProviderCount将会被设置为0

    image.png

    如果在第二次调用之后,sendCaptureStateNotificationsWorker回调函数被执行,那么此时因为LoggerContext->PeriodicCaptureStateGuids.ProviderCount被重置为0,该函数只是简单的将LoggerContext->PeriodicCaptureStateTimerState = EtwpPeriodicTimerUnset(False)

    image.png

    并在函数末尾释放掉TimerContextInfo对象

    image.png

    然而再第三次调用,同样选择走Alloc_TimerContextInfo分支,在将LoggerContext->PeriodicCaptureStateGuids.ProviderCount置为传入的NumOfGuids后,因为之前申请的LoggerContext->PeriodicCaptureStateTimer,已经被设置了,所以不会申请新的LoggerContext,只是将LoggerContext->PeriodicCaptureStateTimerState 设置为 EtwpPeriodicTimerSet。当系统调用SendCaptureStateNotificationsWorker、ExAllocateTimer函数时,传入的参数TimerContextInfo已经被释放,导致UAF

    image.png

    POC开发

    在调用NtTraceControl,FunctionCode为EtwFunctionUpdatePeriodicCaptureState,InBuffer的结构体为

    image.png

    EtwpCheckNotificationAccess绕过

    POC开发的难点在于如何绕过EtwpCheckNotificationAccess的检测,该函数会检测GUID对应的SecurityDescriptor是否包含特定的权限

    image.png

    本次需要绕过的权限检测为0x80(**TRACELOG_GUID_ENABLE**)

    image.png

    系统中的GUID,包含TRACELOG_GUID_ENABLE的有很多,但是有一点我们需要明确,我们现在的权限相对较低,不能使用组为SYSTEM、LOCAL SERVICE、Administrators等权限较高的组,可以选择使用Everyone、Users等权限较低的用户

    image.png

    经过筛选,有3个GUID可以满足要求,如下,既是Authenticated Users 低权限组,又包含TRACELOG_GUID_ENABLE的ACCESS MASK权限

    14f8138e-3b61-580b-544b-2609378ae460             Allow NT AUTHORITY\Authenticated Users        001204e1    WMIGUID_QUERY, TRACELOG_CREATE_REALTIME, TRACELOG_CREATE_ONDISK, TRACELOG_GUID_ENABLE, TRACELOG_ACCESS_REALTIME                                                    
    541dae91-cc3c-5807-b064-c2561c16d7e8             Allow NT AUTHORITY\Authenticated Users        001204e1    WMIGUID_QUERY, TRACELOG_CREATE_REALTIME, TRACELOG_CREATE_ONDISK, TRACELOG_GUID_ENABLE, TRACELOG_ACCESS_REALTIME                                                    
    cb2ff72d-d4e4-585d-33f9-f3a395c40be7             Allow NT AUTHORITY\Authenticated Users        001204e1    WMIGUID_QUERY, TRACELOG_CREATE_REALTIME, TRACELOG_CREATE_ONDISK, TRACELOG_GUID_ENABLE, TRACELOG_ACCESS_REALTIME
    
    

    EtwpCheckNotificationAccess有两个参数

    第一个参数为 上述结构体中的Guids,我们可以通过上面3个GUID中的任意一个进行绕过

    第二个参数为LoggerId对应的LoggerContext结构体的InstanceGuid(可以通过对EtwpAcquireLoggerContextByLoggerId函数的逆向得到)

    image.png

    EtwpLoggerContext中默认的GUID

    windbg里面可以直观的看到EtwpLoggerContext里面保存的是个类型为_WMI_LOGGER_CONTEXT的数组

    image.png

    该结构体_WMI_LOGGER_CONTEXT,的0x124位置保存着InstanceGuid

    image.png

    通过以下命令,我们可以获取该数组内的所有InstanceGuid

    .for(r $t1=0;$t1<0x40;r $t1=$t1+1;){r $t1 ;dt nt!_GUID poi(poi(poi( nt!PspHostSiloGlobals+360h)+1c8)+($t1*8))+124h)}
    
    

    image.png

    这些LoggerId对应的权限虽然有包含0x80权限的,但其所处的组权限较高,因此我们通过控制LoggerId获取系统自身的InstanceGuid进行绕过可能不太理想

    image.png

    向EtwpLoggerContext注册GUID

    既然EtwpLoggerContext中不存在低权限,且又包含TRACELOG_GUID_ENABLE权限的GUID,那么我们是否可以注册一个GUID到EtwpLoggerContext中呢?

    发现确实可以注册GUID到EtwpLoggerContext中,该代码中,我们只需要将SessionGuid和ProviderGuid改为我们自己的GUID即可

    image.png

    注册GUID的部分代码如下,其中SessionHandle即为LoggerID

    image.png

    通过上述描述,我们可以通过注册一个GUID到EtwpLoggerContext数组中,然后通过该GUID的索引,构造ETW_UPDATE_PERIODIC_CAPTURE_STATE结构体,并前后发送三次请求即可造成BSOD

    image.png

    Exploit开发

    占位TimerContextInfo对象

    在POC开发中已经得知是第二次调用NtTraceControl之后,TimerContextInfo对象被释放。因此我们要在第二次调用之后进行占位,其大小为0x30字节(不包含Pool Header),类型为NonPagedPoolNx。通过对TimerContextInfo的逆向,该结构体大概如下

    image.png

    通过逆向在IopVerifierExAllocatePoolWithQuota的调用中会申请类型为NonPagedPoolNx的Pool,其上层调用如NtSetInformationFile、NtSetEaFile等函数都可以实现控制申请pool的大小,并写入内容。但是却存在一个问题,就是这类poolTag为IO的池,都会在IO结束时被释放,虽然被释放了,但是当前内核池的内容并没有立即被占用,内容还在,因此利用的成功率并不是百分之百。

    image.png

    本次占位笔者用的是NtSetEaFile函数,该函数内部检测DEVICE_OBJECT的Flags是否包含4(DO_BUFFERED_IO),因此第一个参数的句柄我给的是PEAuth的文件句柄,该devobj的Flags为0x44。

    image.png

    伪造Fake_WorkItem

    NtSetEaFile函数内部,会通过其第三个参数为pbuffer(Fake_WorkItem)、其第四个函数申请指定的大小的pool。该函数将把会pbuffer的内容放到新申请的内核的地址空间。

    只要占位成功,通过控制WorkItem.WorkerRoutine为我们的处理函数,WorkItem.Parameter为参数,即有可能实现对任意地址的破坏或者是读写。通常我们将这类处理函数称之为Gadget,之前有用过SeSetAccessStateGenericMapping,该函数有2个参数,本次需要有一个参数的函数RtlSetAllBits,其参数为PRTL_BITMAP类型,该函数内部我们可以看到,可以通过控制BitMapHeader->SizeOfBitMap大小,实现对BitMapHeader->Buffer进行0xff的填充的大小

    image.png

    因此Fake_WorkItem需要满足以下3个条件,(通过控制pbuffer即可)

    FakeContextInfo->WorkItem.List.Flink = 0(这样当前的 WorkItem 将被验证,并放到队列)
    FakeContextInfo->WorkItem.WorkerRoutine = RtlSetAllBits()
    FakeContextInfo->WorkItem.Parameter = RTL_BITMAP FakeBitMapHeader

    image.png

    伪造Fake_RtlBitMapAddr

    参考附录4,我们可以通过TheadName,来泄露其内核地址空间,通过调用RtlSetAllBits函数可以实现对Fake_RtlBitMapAddrBitMapHeader->Buffer实现0xff的设置,设置的大小为0x16个字节。我们可以通过设置token的0x40位置的Privileges,给自身进程添加SE_DEBUG_PRIVILEGE权限。

    因此构造的Fake_RtlBitMapAddr需要满足以下两个条件

    BitMapHeader->SizeOfBitMap==0x80(可以设置0x16个字节的0xff)
    BitMapHeader->Buffer==token.Privileges

    image.png

    提权

    通过Fake_WorkItem,可以成功的调用到RtlSetAllBits函数,又通过Fake_RtlBitMapAddr成功的将token.Privileges.Present以及Enabled都设置为了0xffffffffffffffff

    image.png

    因为有了SE_DEBUG_PRIVILEGE 权限,剩下就是是注入winlogo.exe进程即可。

    image.png

    展开全文
  • 内核漏洞的利用与防范.part1.rar
  • 21.3.1 内核漏洞的分类

    2021-05-12 10:32:53
    21.3 内核漏洞概述21.3.1 内核漏洞的分类运行在Ring0上的操作系统内核、设备驱动、第三方驱动能共享同一个虚拟地址空间,可以完全访问系统空间的所有内存,而不像用户态进程那样拥有独立私有的内存空间。由于内核...

    21.3  内核漏洞概述

    21.3.1  内核漏洞的分类

    运行在Ring0上的操作系统内核、设备驱动、第三方驱动能共享同一个虚拟地址空间,可以完全访问系统空间的所有内存,而不像用户态进程那样拥有独立私有的内存空间。由于内核程序的特殊性,内核程序漏洞类型也更加丰富。本篇收集了近年内公布的内核漏洞,并将相关的分析资料整理成如下格式,如图21.3.1所示。

    96252bfd9108ca58206f129fd0786616.png

    图21.3.1 内核漏洞命名格式您可以从本书的附带资料中得到完整的漏洞列表和资料,如图21.3.2所示。

    e65f7d9587aa67cd485898385a6d1ea2.png

    图21.3.2 已整理的内核漏洞列表截图

    我们可以从漏洞的严重程度和漏洞的利用原理两个角度来对内核漏洞进行分类。漏洞的严重程度是指漏洞利用后所造成的危害;漏洞的利用原理是指漏洞利用过程中使用的原理和技术。

    按照漏洞严重程度可分为以下4类:远程拒绝服务、本地拒绝服务、远程任意代码执行和本地权限提升,如图21.3.3所示。

    8a5ee0438e0d8c0648c7bfa7290172bc.png

    图21.3.3   按照漏洞严重程度给内核漏洞分类

    "远程拒绝服务"是指能够利用来使得远程系统崩溃或资源耗尽的内核程序bug或缺陷。例如"[2009-09-08][Microsoft][SMB2][SRV2.SYS][远程拒绝服务内核漏洞][36299]"。

    "本地拒绝服务"是指能够利用来使得本地系统崩溃或资源耗尽的内核程序bug或缺陷。例如"[2010-04-22][Microsoft][SfnINSTRING][Win32k.sys][本地拒绝服务内核漏洞]"。

    另一方面,按照漏洞利用原理可分为以下4类:拒绝服务、缓冲区溢出、内存篡改和设计缺陷,如图21.3.4所示。

    068ce41113d80bea9052bdc11f3a260c.png

    图21.3.4  按照漏洞利用原理给内核漏洞分类

    其中"内存篡改"类型又可以分成以下3个子类。

    任意地址写任意数据:指能够利用来使得向任意内核空间虚拟地址写入任意数据的内核程序bug或缺陷。例如"[2010-01-23][Rising][Antivirus_2008_2009_2010] [RsNTGdi.sys][任意地址写任意数据内核漏洞][本地权限提升][37951]"。

    固定地址写任意数据:指能够利用来使得向固定内核空间虚拟地址写入任意数据的内核程序bug或缺陷。目前暂无这种漏洞案例。

    任意地址写固定数据:指能够利用来使得向任意内核空间虚拟地址写入固定数据的内核程序bug或缺陷。例如"[2009-07-30][Microsoft][NtUserConsoleControl] [win32k.sys][任意地址写任意数据内核漏洞][本地权限提升]"。

    【责任编辑:云霞 TEL:(010)68476606】

    点赞 0

    展开全文
  • 介绍了了 Windows 10 1607 和 1703 版本中引⼊入的针对内核漏漏洞洞利利⽤用的防护措施,在此基础上将给出相应的绕过⽅方案, 从⽽而使我们能够重新获得内核态下的 RW primitives,并进⼀一步实现 KASLR 绕过以及...
  • linux内核漏洞提权过程

    千次阅读 2021-05-17 19:23:40
    获取 root 权限是 Linux 漏洞利用的终极目标。跟 Windows 中的 System 用户一样,root 用户拥有...2. 查看内核版本 3. 检测当前用户权限 4. 列举Suid文件 5. 查看已经安装的包,程序,运行的服务,过期的版本可能有漏洞
  • 本议题将介绍如何通过一个越界读漏洞,多次漏洞类型转换,在macOS Big Sur上完成100%稳定的内核代码执行,并分析漏洞审计的切入点和相关思路。
  • iOS内核漏洞挖掘Fuzz & 代码审计议程• iOS内核漏洞• 代码审计• 漏洞分析iOS安全体系• 安全机制• 功能多在内核层实现– 需要patch内核来d
  • 该系列文章主要是从ctf比赛入手,针对linux内核上的漏洞分析、挖掘与利用做讲解,本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 linux内核态与用户态的区别 以 Intel CPU 为例,按照权限级别...
  • 漏洞是个内核漏洞,跟Linux的发行版本没有关系,也就是说只要Linux 内核版本在v2.6.19-rc1 ~v5.12-rc8 之间的内核,都存在被黑客利用该漏洞攻击的可能。 该漏洞是由Andy Nguyen (theflow@)发现,于2021年07...
  • • 案例1-RFONTOBJ::VMAKEINACTIVE()堆破坏漏洞 • 案例2- XXXENABLEWNDSBARROWS UAF漏洞 • 案例3- EPATHOBJ::PPRFLATTENREC 未初始化漏洞 • 案例4 TAGCLS对象 UAF漏洞 • 案例5- NTUSERCALLNEXTHOOKEX类型混淆...
  • 近日,英特尔处理器芯片的安全漏洞问题让不少网民人心惶惶,信息安全问题又一次重回大家的视野。 各浏览器升级补丁方式如下: 360浏览器防御方法: 升级版本到360安全浏览器9.1,提升安全性防止攻击者利用CPU...
  • Linux脏牛内核漏洞复现
  • linux内核漏洞(CVE-2022-0847)

    千次阅读 2022-06-19 17:51:47
    linux内核漏洞(CVE-2022-0847)
  • 写任意内存是内核漏洞中一种常见模式,对其利用技术的研究具有重要意义。首先分析传统利用技术的思路方法、利用步骤;然后分析最新的漏洞利用缓解技术工作原理,如何截断利用途径;最后针对最新的缓解技术,基于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,696
精华内容 17,078
关键字:

内核漏洞