Windows内核破绽应用 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Windows内核破绽应用

申博_新闻事件 申博 63次浏览 已收录 0个评论

客栈缓冲区溢出

在第一部份中,我们会从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内核破绽应用

应用客栈溢出的POC

在Win7装备上编译并实行二进制文件后,我们能够在WinDbg中取得它:

我们能够看到有一个接见争执,EIP指向31624130。

在此形式上运用Metasploit的pattern_offset.rb以后,我们找到它的偏移量32,让我们继续举行开发。

应用溢出

如今剩下的就是运用HEVD中供应的TokenStealingPayloadWin7 shellcode掩盖保留的返回地点,然后完成。

注重:你大概须要轻微修正shellcode,以避免崩溃。

猎取Shell

起首考证我们是不是是一般用户:

Windows内核破绽应用

一般用户

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

Windows内核破绽应用

NT Authority/SYSTEM Shell

 

范例殽杂

在第二部份中,我们将绕过罕见的内存破坏破绽(在我们正在应用的驱动顺序中,内存破坏破绽占大多数)。由于应用起来很轻易,我还要使其成为本文的第一部份。

什么是范例殽杂?

范例殽杂是一个破绽,个中应用顺序不考证对象的范例(函数,数据范例等),然后按预期体式格局对其举行处置惩罚,但通报的对象是其他对象。

破绽

如今我们已消灭它,让我们看一下易受攻击的代码(位于TypeConfusion.c中的函数TriggerTypeConfusion)。

内核起首搜检缓冲区是不是驻留在用户域中,然后在非页面缓冲池中为其分派内存。完成此操纵后,内核将用户形式缓冲区中的ObjectID分派给内核形式缓冲区,并对对象范例实行雷同的操纵。

 

完成以后,内核在对象(内核形式而不是用户形式)上挪用TypeConfusionInitializer函数。

Windows内核破绽应用

在对象上挪用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内核破绽应用

IntegerOverflow.c中的破绽函数

然后,内核搜检缓冲区是不是驻留在用户地区中,然后为我们打印一些信息,这对整数溢出很有协助。

完成此操纵后,内核将搜检数据大小(以及终止符的大小,终止符为4字节)是不是大于KernelBuffer的大小。假如是这,则它退出时不会在kernel-land缓冲区中复制user-land缓冲区。

Windows内核破绽应用

大小搜检

然则,假如不是这类状况,那末它将继续举行,然后将数据复制到内核缓冲区。

这里要注重的另一件事是,假如它在用户地区缓冲区中碰到BufferTerminator,它将住手复制并继续前进。因而,我们须要将BufferTerminator放在用户形式缓冲区的末端。

Windows内核破绽应用

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

溢出

IntegerOverflow.c的第100行中的问题在于,假如我们将size参数设置为0xFFFFFFFC,然后增加BufferTerminator的大小(为4个字节),则有用大小为– 0xFFFFFFFC + 4 = 0x00000000,小于KernelBuffer的大小。因而,我们经由过程了数据大小搜检,然后将缓冲区复制到内核形式。

破绽考证

如今,为了考证这一点,我们将缓冲区发送到HEVD,然则要通报0xFFFFFFFC作为缓冲区的大小。如今,我们将不会安排庞大的缓冲区并使内核崩溃,而只是发送一个小缓冲区并举行确认。

Windows内核破绽应用

触发整数溢出的PoC

由于我们晓得缓冲区有512个ULONG,所以我们将发送此数据,并检察内核会做什么?

注重:这里的重点是DeviceIoControl的第4个参数,而不是现实的数据。

末了,将此缓冲区发送到HEVD,看看会发作什么。

Windows内核破绽应用

胜利触发整数溢出破绽

如你在图片中看到的,UserBuffer Size显现为0xFFFFFFFC,但我们依然想法绕过了大小有用性搜检并触发了整数溢出。

我们确认了经由过程安排0xFFFFFFFC,能够绕过搜检大小,如今剩下的就是在UserBuffer以后安排一个形式(唯一的形式),然后在其后安排终止符以查找保留的返回指针掩盖。

假如你不晓得怎样实行此操纵,请浏览本文的第1部份。

应用溢出破绽

剩下的就是运用HEVD中供应的TokenStealingPayloadWin7 shellcode掩盖保留的返回地点,然后完成就能够了。

注重:你大概须要轻微修正shellcode,以避免崩溃。

猎取shell

起首考证我们是不是是一般用户:

Windows内核破绽应用

一般用户

能够看出,我只是一般用户。

运转破绽应用顺序后,我成为了NT权限/体系。

Windows内核破绽应用

胜利应用整数溢出破绽

你能够在我的代码库中,找到全部代码。

本文翻译自: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/


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Windows内核破绽应用
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址