windows内核_Windows内核漏洞利用
堆栈缓冲区溢出
在第一部分中,我们会从HackSysExtremeVulnerableDriver中的普通堆栈缓冲区溢出开始。
当堆栈上存在的缓冲区获取的数据超出其存储容量时(例如,在一个16字节缓冲区中复制20个字节,就可以是字符数组或类似对象),其余数据将写入附近位置,从而有效覆盖或破坏堆栈。
其核心思想是控制此溢出,这样我们可以覆盖堆栈上保存的返回地址,并且在执行当前(易受攻击的)函数后,它将返回我们的覆盖值,其中包含我们的shellcode。
注意:执行完shellcode后,代码执行必须返回到应用程序,在本例中是内核,否则将破坏应用程序。通常,应用程序崩溃了,我们可以重新启动它,但是如果内核内存损坏,内核会发出内核恐慌,并且将显示“蓝屏死机”,这是我们最不希望发生的事情。
为了解决这个问题,我们需要恢复执行路径,以便在执行完shellcode之后,它返回到执行易受攻击的函数后应该返回的函数。
易受攻击性
现在我们已经清除了它,让我们看一下易受攻击的代码(位于StackOverflow.c中的函数TriggerStackOverflow)。最初,该函数创建可容纳512个成员元素的ULONG数组(在common.h头文件中,BufferSize设置为512)。
易受攻击性的函数
然后,内核检查缓冲区是否驻留在用户区域中,然后在非页面缓冲池中为其分配内存。
一旦完成,内核便将数据从用户模式缓冲区复制到内核模式KernelBuffer,该模式实质上是一个ULONGs数组。
溢出
注意RtlCopyMemory的第三个参数,它本质上是memcpy,Size参数是用户模式缓冲区的大小,而不是内核模式缓冲区的大小,这正是缓冲区溢出发生的地方。
漏洞验证
现在,要验证错误是否真正存在,我们将编写一个函数,该函数调用函数StackOverflowIoctlHandler的IOCTL。IOCTL代码在Exploit / common.h文件中给出。
注意:我们可以从编译的驱动程序本身获取IOCTL代码,既然我们有自己的优势,所以为什么不使用它?
什么是IOCTL代码?
I/O控制代码(IOCTL)用于用户模式应用程序和驱动程序之间的通信,或用于堆栈中驱动程序内部的通信,I/O控制代码是使用IRP发送的。
基本上,如果驱动程序具有与之关联的IOCTL代码,则可以直接在该驱动程序中调用内核函数。要使用IOCTL代码,我们使用DeviceIoControl函数,函数可在此处找到。
DeviceIoControl函数的原型为:
DeviceIoControl的原型
我用C++编写了一个函数,该函数调用DeviceIoControl来调用StackOverflowIoctlHandler,后者依次调用TriggerStackOverflow,这是易受攻击的函数。
由于我们知道缓冲区有512个ULONG,因此可以肯定的是,此后,我们将添加Metasploit框架中pattern_create.rb生成的100字节模式。
最后,将此缓冲区发送到HEVD,看看会发生什么?
注意:此函数在标头文件StackOverflow.h中,主函数调用它,你可以在我的代码库中找到整个代码。
利用堆栈溢出的POC
利用堆栈溢出的POC
在Win7设备上编译并执行二进制文件后,我们可以在WinDbg中获得它:
在WinDbg中崩溃
我们可以看到有一个访问冲突,EIP指向31624130。
在此模式上使用Metasploit的pattern_offset.rb之后,我们找到它的偏移量32,让我们继续进行开发。
利用溢出
现在剩下的就是使用HEVD中提供的TokenStealingPayloadWin7 shellcode覆盖保存的返回地址,然后完成。
注意:你可能需要稍微修改shellcode,以免崩溃。
获取Shell
首先验证我们是否是普通用户:
普通用户
可以看出,我只是一个普通的用户。运行漏洞利用程序后,我成为了NT权限/系统。
NT Authority/SYSTEM Shell
类型混淆
在第二部分中,我们将绕过常见的内存损坏漏洞(在我们正在利用的驱动程序中,内存损坏漏洞占大多数)。因为利用起来很容易,我还要使其成为本文的第一部分。
什么是类型混淆?
类型混淆是一个漏洞,其中应用程序不验证对象的类型(函数,数据类型等),然后按预期方式对其进行处理,但传递的对象是其他对象。
漏洞
现在我们已经清除它,让我们看一下易受攻击的代码(位于TypeConfusion.c中的函数TriggerTypeConfusion)。
内核首先检查缓冲区是否驻留在用户域中,然后在非页面缓冲池中为其分配内存。完成此操作后,内核将用户模式缓冲区中的ObjectID分配给内核模式缓冲区,并对对象类型执行相同的操作。
分配ObjectID和ObjectType
完成之后,内核在对象(内核模式而不是用户模式)上调用TypeConfusionInitializer函数。
在对象上调用TypeConfusionInitializer
让我们来看看这个函数:
函数类型ConfusionObjectInitializer
该函数接收对象并调用对象内部存在的函数指针,下面,让我们看一下TypeConfusion.h标头文件中存在的KERNEL_TYPE_CONFUSION_OBJECT的结构(本质上是一个结构)。该标头文件包含用户模式对象以及内核模式对象的定义,这使得利用这个漏洞比利用堆栈溢出更容易。
对象原型
首先,让我们看看用户模式对象包含什么。用户模式对象是一个包含2个成员的结构:
1.对象ID;
2.对象类型。
对于内核模式对象,它也是一个包含2个成员的结构:
1.对象ID;
2.第二个成员是UNION,它本身包含:
2.1对象类型;
2.2回调(函数指针);
现在,如果你还记得,一个UNION一次可以容纳一个成员,在这里它可以是Object Type或指向由TypeConfusionInitializer函数调用的函数的指针。
当函数TriggerTypeConfusion函数无法验证第二个成员是ObjectType还是Callback时,就会发生混淆。
利用混淆情况
要利用混淆情况,我们所要做的就是发送一个结构,该结构的第二个成员是我们要从内核领域调用的函数的地址。
在漏洞已经被利用的情况下,它将成为我们的令牌窃取Shellcode的地址,并替换我们进程的令牌,因此当创建一个新进程时,将使用该令牌创建它。
但是有一个问题,HEVD附带的shellcode(TokenStealingPayloadWin7无法正常工作并导致设备崩溃)。
修改shellcode
由于函数TypeConfusionInitializer会像调用函数一样调用回调指针,因此我们需要设置函数序言和结尾,并将ret 8更改为ret。
注意:我会将shellcode函数编译为裸函数,但如果你不这样做,则可以直接使用提供的shellcode。我只是不希望编译器将额外的代码添加到我的shellcode中。
你可以点此,找到漏洞利用代码。
获得Shell
首先验证我们是否是一个普通用户。
普通用户
可以看出,我只是一个普通用户。运行漏洞利用程序后,我会拥有NT权限/系统
通过利用Type Confusion开发SYSTEM Shell
整数溢出
在这一部分中,我们将利用HackSysExtremeVulnerableDriver中的整数溢出。
什么是整数溢出?
对于那些不知道整数溢出的人,他们可能会想到整数如何溢出?实际的整数不会溢出。CPU会将整数存储在固定大小的内存分配中。如果你熟悉C / C++编程语言或类似语言,则可能会想起数据类型以及每种数据类型具有特定的固定大小。
在大多数设备和操作系统上,char是1个字节,int是4个字节长。这意味着char数据类型可以容纳8位大小的值,范围从0到255,或者在有符号值的情况下从-128到127。整数也是如此,在int大小为4字节的设备上,它可以保存0到232 – 1之间的值(无符号值)。
现在,让我们考虑使用一个无符号整数,其最大值可以是232 – 1或0xFFFFFFFF。如果加1时会发生什么?由于所有的32位都设置为1,因此加1将使它成为33位的值,但是由于存储区只能容纳32位,因此将这32位设置为0。
在执行操作时,CPU通常将数字加载到32位寄存器中(这里说的是x86),添加1将设置Carry标志,寄存器保存值0,因为所有32位现在都是0。
现在,如果进行大小检查,则该值是否大于(例如10),则检查将失败,但是如果没有大小限制,则比较操作将返回true。
为了更详细地了解它,让我们看一下该漏洞,看看如何利用HEVD中的整数溢出漏洞来获得在Windows内核中的执行代码。
易受攻击性
现在我们已经清除了它,让我们看一下易受攻击的代码(函数IntegerOverflow.c中的TriggerIntegerOverflow)。
最初,该函数创建可容纳512个成员元素的ULONG数组(在common.h头文件中,BufferSize设置为512)。
IntegerOverflow.c中的漏洞函数
然后,内核检查缓冲区是否驻留在用户区域中,然后为我们打印一些信息,这对整数溢出很有帮助。
完成此操作后,内核将检查数据大小(以及终止符的大小,终止符为4字节)是否大于KernelBuffer的大小。如果是这,则它退出时不会在kernel-land缓冲区中复制user-land缓冲区。
大小检查
但是,如果不是这种情况,那么它将继续进行,然后将数据复制到内核缓冲区。
这里要注意的另一件事是,如果它在用户区域缓冲区中遇到BufferTerminator,它将停止复制并继续前进。因此,我们需要将BufferTerminator放在用户模式缓冲区的末尾。
将用户模式数据复制到内核模式函数堆栈
溢出
IntegerOverflow.c的第100行中的问题在于,如果我们将size参数设置为0xFFFFFFFC,然后添加BufferTerminator的大小(为4个字节),则有效大小为– 0xFFFFFFFC + 4 = 0x00000000,小于KernelBuffer的大小。因此,我们通过了数据大小检查,然后将缓冲区复制到内核模式。
漏洞验证
现在,为了验证这一点,我们将缓冲区发送到HEVD,但是要传递0xFFFFFFFC作为缓冲区的大小。现在,我们将不会放置巨大的缓冲区并使内核崩溃,而只是发送一个小缓冲区并进行确认。
触发整数溢出的PoC
因为我们知道缓冲区有512个ULONG,所以我们将发送此数据,并查看内核会做什么?
注意:这里的重点是DeviceIoControl的第4个参数,而不是实际的数据。
最后,将此缓冲区发送到HEVD,看看会发生什么。
成功触发整数溢出漏洞
如你在图片中看到的,UserBuffer Size显示为0xFFFFFFFC,但我们仍然设法绕过了大小有效性检查并触发了整数溢出。
我们确认了通过放置0xFFFFFFFC,可以绕过检查大小,现在剩下的就是在UserBuffer之后放置一个模式(唯一的模式),然后在其后放置终止符以查找保存的返回指针覆盖。
如果你不知道如何执行此操作,请阅读本文的第1部分。
利用溢出漏洞
剩下的就是使用HEVD中提供的TokenStealingPayloadWin7 shellcode覆盖保存的返回地址,然后完成就可以了。
注意:你可能需要稍微修改shellcode,以免崩溃。
获取shell
首先验证我们是否是普通用户:
普通用户
可以看出,我只是普通用户。
运行漏洞利用程序后,我成为了NT权限/系统。
成功利用整数溢出漏洞
你可以在我的代码库中,找到整个代码。
本文翻译自:https://pwnrip.com/windows-kernel-exploitation-part-1-stack-buffer-overflows/ https://pwnrip.com/windows-kernel-exploitation-part-2-type-confusion/ https://pwnrip.com/windows-kernel-exploitation-part-3-integer-overflow/
windows内核_Windows内核漏洞利用相关推荐
- CVE-2022-0185 价值$3w的 File System Context 内核整数溢出漏洞利用分析
文章目录 1. 漏洞发现 2. 漏洞分析 3. 漏洞利用方法1-任意写篡改 `modprobe_path` 3-1 泄露内核基址 3-2 任意地址写思路 3-3 FUSE 页错误处理 3-4 完整利用 ...
- android4 设置栈大小,【技术分享】Android内核漏洞利用技术实战:环境搭建栈溢出实战...
[技术分享]Android内核漏洞利用技术实战:环境搭建&栈溢出实战 2017-08-14 16:22:02 阅读:0次 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn ...
- Windows MS17-010漏洞利用介绍
利用metasploit开源安全漏洞检测工具实现漏洞检测及利用 1.metasploit介绍 ------Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验 ...
- [译] APT分析报告:08.漏洞利用图谱–通过查找作者的指纹来寻找漏洞
这是作者新开的一个专栏,主要翻译国外知名安全厂商的APT报告,了解它们的安全技术,学习它们溯源APT组织和恶意代码分析的方法,希望对您有所帮助.当然,由于作者英语有限,会借助机翻进行校验,还请包涵!前 ...
- 漏洞挖掘、漏洞分析和漏洞利用
漏洞挖掘.漏洞分析和漏洞利用 利用漏洞进行***可以大致分为漏洞挖掘.漏洞分析.漏洞利用三个步骤.这三部分所用的技术有相同之处,比如都需要精通系统底层知识.逆向工程等:同时也有一定的差异. 1 ...
- php Wrapper LFI,LFI漏洞利用总结(转载)
主要涉及到的函数 include(),require().include_once(),require_once() magic_quotes_gpc().allow_url_fopen().allo ...
- 方程式 Eternalblue 漏洞利用复现
漏洞原理 详细的漏洞原理参照文章: http://www.91ri.org/16946.html 懒得点连接的大人们可以看这里: 首先SrvOs2FeaListToNt首先调用SrvOs2FeaLis ...
- 自检代码中trustmanager漏洞_Windows内核漏洞利用教程
堆栈溢出漏洞 首先,我们将从HackSysExtremeVulnerableDriver中的vanilla栈溢出漏洞开始讲起. 当向堆栈上的缓冲区存放的数据超出其存储容量时(例如,向16字节缓冲区(这 ...
- 【漏洞通告】Windows 内核信息泄漏漏洞CVE-2021-31955
漏洞名称 : Windows 内核信息泄漏漏洞 组件名称 : Windows 影响范围 : Windows 10 21h1/20h2/1809/1909/2004 Windows Server 201 ...
- 安卓内核UAF漏洞利用探秘
雷锋网编者按:8月16日,第三届中国互联网安全领袖峰会(CSS 2017)在北京国家会议中心召开.作为九大分会场之一的腾讯安全探索论坛(TSec)以"安全新探索"为主题,云集了国际 ...
最新文章
- 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决
- redis主从复制,读写分离
- input获取焦点软键盘弹出影响定位
- ACCP学习旅程之-----使用C#开发数据库应用程序(第二章)
- 2_常用样式-border
- 修改thymeleaf默认路径
- 多个线程作用于同一个runnable对象
- 【HNOI2016】序列【莫队】【单调栈】【ST表】
- dp动态规划_最短路径累加和最大问题
- Swift 5用Template自动创建VIPER架构代码
- 三岁小孩开发搜索引擎,搜索引擎白热化[原创]
- 节约里程法求解CVRP问题
- 【Jmeter测试】03—— post请求测试
- 未来精英论坛3.0 | 探秘桔厂科技和人文
- 前沿探索:腾讯云数据库自治服务最佳实现
- Core Java笔记------来自达内项目经理穆笛
- 《手把手教你移植InfoNES(到HANKER-LM4F232)》
- 对比分析冯诺依曼结构和哈佛结构。
- 企业宣传片的转场技巧
- 苹果账号 协议、税务和银行业务填写教程