欢迎访问Sunbet官网(www.sunbet.us),Allbet欧博官网(www.ALLbetgame.us)!

首页Sunbet_新闻事件正文

Windows内核破绽应用

b9e08c31ae1faa592019-11-2990漏洞

客栈缓冲区溢出 在第一部份中,我们会从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函数的原型为:   我用C++编写了一个函数,该函数挪用DeviceIoControl来挪用StackOverflowIoctlHandler,后者顺次挪用TriggerStackOverflow,这是易受攻击的函数。 由于我们晓得缓冲区有512个ULONG,因而能够一定的是,今后,我们将增加Metasploit框架中pattern_create.rb生成的100字节形式。 末了,将此缓冲区发送到HEVD,看看会发作什么? 注重:此函数在标头文件StackOverflow.h中,主函数挪用它,你能够在我的代码库中找到全部代码。

Windows内核破绽应用  漏洞 第1张

应用客栈溢出的POC

在Win7装备上编译并实行二进制文件后,我们能够在WinDbg中取得它: 我们能够看到有一个接见争执,EIP指向31624130。 在此形式上运用Metasploit的pattern_offset.rb以后,我们找到它的偏移量32,让我们继续举行开发。 应用溢出 如今剩下的就是运用HEVD中供应的TokenStealingPayloadWin7 shellcode掩盖保留的返回地点,然后完成。 注重:你大概须要轻微修正shellcode,以避免崩溃。 猎取Shell 起首考证我们是不是是一般用户:

Windows内核破绽应用  漏洞 第2张

一般用户

能够看出,我只是一个一般的用户。运转破绽应用顺序后,我成为了NT权限/体系。

Windows内核破绽应用  漏洞 第3张

NT Authority/SYSTEM Shell

  范例殽杂 在第二部份中,我们将绕过罕见的内存破坏破绽(在我们正在应用的驱动顺序中,内存破坏破绽占大多数)。由于应用起来很轻易,我还要使其成为本文的第一部份。 什么是范例殽杂? 范例殽杂是一个破绽,个中应用顺序不考证对象的范例(函数,数据范例等),然后按预期体式格局对其举行处置惩罚,但通报的对象是其他对象。 破绽 如今我们已消灭它,让我们看一下易受攻击的代码(位于TypeConfusion.c中的函数TriggerTypeConfusion)。 内核起首搜检缓冲区是不是驻留在用户域中,然后在非页面缓冲池中为其分派内存。完成此操纵后,内核将用户形式缓冲区中的ObjectID分派给内核形式缓冲区,并对对象范例实行雷同的操纵。   完成以后,内核在对象(内核形式而不是用户形式)上挪用TypeConfusionInitializer函数。

Windows内核破绽应用  漏洞 第4张

在对象上挪用TypeConfusionInitializer

让我们来看看这个函数: 该函数吸收对象并挪用对象内部存在的函数指针,下面,让我们看一下TypeConfusion.h标头文件中存在的KERNEL_TYPE_CONFUSION_OBJECT的构造(本质上是一个构造)。该标头文件包括用户形式对象以及内核形式对象的定义,这使得应用这个破绽比应用客栈溢出更轻易。 起首,让我们看看用户形式对象包括什么。用户形式对象是一个包括2个成员的构造: 1.对象ID; 2.对象范例。
欧盟发布5G网络威胁图谱 2019年11月,ENISA发布了题为《Threat Landscape of 5G Networks》的报告,分析了5G网络所存在的安全威胁。报告中描述了5G网络安全威胁图谱和5G网络在安全方面的挑战。加入了创建综合5G架构、识别重要资产(资产图表)、对影响5G的威胁进行评估(威胁图表)、识别资产暴露的程度(威胁-资产映射)、以及威胁源动机的初步评估。 5G网络技术架构 资产 5G中的资产种类包括: · 策略(policy)。 · 管理过程(Management processes)。 · 商业应用(business application)。 · 商业服务(business services)。 · 协议(protocol)。 · 数据网络(data network)。 · 切片(slicing)。 ·
关于内核形式对象,它也是一个包括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权限/体系 整数溢 在这一部份中,我们将应用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)。

Windows内核破绽应用  漏洞 第5张

IntegerOverflow.c中的破绽函数

然后,内核搜检缓冲区是不是驻留在用户地区中,然后为我们打印一些信息,这对整数溢出很有协助。 完成此操纵后,内核将搜检数据大小(以及终止符的大小,终止符为4字节)是不是大于KernelBuffer的大小。假如是这,则它退出时不会在kernel-land缓冲区中复制user-land缓冲区。

Windows内核破绽应用  漏洞 第6张

大小搜检

然则,假如不是这类状况,那末它将继续举行,然后将数据复制到内核缓冲区。 这里要注重的另一件事是,假如它在用户地区缓冲区中碰到BufferTerminator,它将住手复制并继续前进。因而,我们须要将BufferTerminator放在用户形式缓冲区的末端。

Windows内核破绽应用  漏洞 第7张

将用户形式数据复制到内核形式函数客栈

溢出 IntegerOverflow.c的第100行中的问题在于,假如我们将size参数设置为0xFFFFFFFC,然后增加BufferTerminator的大小(为4个字节),则有用大小为– 0xFFFFFFFC + 4 = 0x00000000,小于KernelBuffer的大小。因而,我们经由过程了数据大小搜检,然后将缓冲区复制到内核形式。 破绽考证 如今,为了考证这一点,我们将缓冲区发送到HEVD,然则要通报0xFFFFFFFC作为缓冲区的大小。如今,我们将不会安排庞大的缓冲区并使内核崩溃,而只是发送一个小缓冲区并举行确认。

Windows内核破绽应用  漏洞 第8张

触发整数溢出的PoC

由于我们晓得缓冲区有512个ULONG,所以我们将发送此数据,并检察内核会做什么? 注重:这里的重点是DeviceIoControl的第4个参数,而不是现实的数据。 末了,将此缓冲区发送到HEVD,看看会发作什么。

Windows内核破绽应用  漏洞 第9张

胜利触发整数溢出破绽

如你在图片中看到的,UserBuffer Size显现为0xFFFFFFFC,但我们依然想法绕过了大小有用性搜检并触发了整数溢出。 我们确认了经由过程安排0xFFFFFFFC,能够绕过搜检大小,如今剩下的就是在UserBuffer以后安排一个形式(唯一的形式),然后在其后安排终止符以查找保留的返回指针掩盖。 假如你不晓得怎样实行此操纵,请浏览本文的第1部份。 应用溢出破绽 剩下的就是运用HEVD中供应的TokenStealingPayloadWin7 shellcode掩盖保留的返回地点,然后完成就能够了。 注重:你大概须要轻微修正shellcode,以避免崩溃。 猎取shell 起首考证我们是不是是一般用户:

Windows内核破绽应用  漏洞 第10张

一般用户

能够看出,我只是一般用户。 运转破绽应用顺序后,我成为了NT权限/体系。

Windows内核破绽应用  漏洞 第11张

胜利应用整数溢出破绽

你能够在我的代码库中,找到全部代码。 本文翻译自: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/

网友评论