Windows系统各种安全机制笔记

win7

SafeSeh:
在调用异常处理函数之前,对要调用的异常处理函数进行一系列的有效性校验,如果发现异常处理函数不可靠(被覆盖了,被篡改了),立即终止异常处理函数的调用。不过SafeSEH需要编译器和系统双重支持,缺少一个则保护能力基本就丧失了 在当今时代,超过99%的现代Microsoft程序和库都经过编译以参与SafeSEH,那么所有内容都将启用SafeSEH缓解措施。
所有安全缓解措施的问题通常都在于拥有第三方程序DLL,而当第三方程序模块未启用SafeSEH时,它将破坏整个程序的安全性,从而使所有其他SafeSEH保护的模块变得毫无用处。,
绕过方法
方法一:覆盖函数返回地址。若攻击对象启用了 SafeSEH 但是 没有启用 GS 或者存在未受 GS 保护的函数,则可用这个方法。
方法二:攻击虚函数表来绕过 SafeSEH。
方法三:将 shellcode 部署在堆中以绕过 SafeSEH。
方法三:利用未启用 SafeSEH 的模块绕过 SafeSEH。
方法四:DEP 关闭时,可以利用加载模块之外的指令作为跳板。

DEP:
DEP的主要作用是阻止数据页(默认的堆,栈以及内存池页)执行代码。
绕过方法
方法一:ROP跳转到VirtualProtect函数来将shellcode 所在内存页设置为可执行状态,然后转入shellcode执行
方法二:ROP跳转到ZwSetInformationProcess函数将DEP关闭再转入shellcode执行
方法三:ROP跳转到VirtualAlloc函数来开辟一段具有执行权限的内存空间,然后转入shellcode执行

GS:在返回地址和EBP的上面多了一个cookie值 如果被修改会结束进程
绕过方法
方法一:把栈撑爆提前触发异常覆盖SEH链 仅仅修改局部变量
方法二:硬碰硬(1/256)的可能
方法三:通过另一个漏洞 比如格式化字符串漏洞 读到cookie的值然后在exp里写进去
方法四:攻击虚函数表

ASLR:PEB,TEB随机化,堆,栈随机化,映像加载基址随机化,ASLR的随机化主要是防止缓冲区溢出攻击,以防止攻击者能够使用JMP ESP,CALL ESP或POP POP RET序列之类的小工具的地址。(这些通常都与缓冲区溢出攻击有关)
绕过方法
方法一:利用未启用ASLR的块

方法二:堆喷射
方法三:覆盖部分返回地址

fs:[18]==teb fs:[30]==peb 实在受不了模块加载基址从pe里跟他干掉就好了

SEHOP
此特性旨在阻止借助 SEH(Structured Exception Handler)覆盖技术实现漏洞利用的 Exp。由于这种保护机制是在程序运行时提供的,因而不论编译时是否添加了此保护选项,系统都会为程序提供该保护,win7下默认关闭此保护
绕过:伪造seh链表

堆cookie:
在Windows XP SP2和Windows Server 2003后启动,它们的长度为8位,并提供多达256个用于保护内存块的密钥。因此,如果您要利用堆损坏漏洞,则理论上它的工作效率为1/256倍。堆cookie被添加到每个堆条目的标头中。释放堆条目时,将验证该堆cookie。这就是为什么在释放块时可以检测到损坏的原因。

win7之后

SMEP或Supervisor模式执行保护是最早在Windows 8(在Windows上下文中)中实现的保护。她不允许我们从环0开始执行存储在环3页面中的代码,通常从更高的环执行代码。这意味着我们无法从内核模式执行用户模式代码。:
绕过:
利用:关于SMEP的控制,取决于cr4寄存器,这个寄存器的比特位们代表了不同的内容。其中,第20位表示的是SMEP的开关。我们可以利用ROP Chain来关闭这个比特位。
利用NtQuerySystemInformation函数 泄露内核模块地址

控制流保护/完整性(CFG / CFI):
微软在Win 8.1 Update 3以及Win 10中启用了一种抵御内存泄露攻击的新机制,即Control Flow Guard(CFG)——控制流防护。编译检测代码会根据指针地址来进行间接跳转,通过对应用程序可以从何处运行代码添加严格限制,CFG被广泛实施以保护和抵御内存损坏漏洞
漏洞攻击过程中,常见的利用手法是通过溢出覆盖或者直接篡改某个寄存器的值,篡改间接调用的地址,进而控制了程序的执行流程。CFG通过在编译和链接期间,记录下所有的间接调用信息,并把他们记录在最终的可执行文件中,并且在所有的间接调用之前插入额外的校验,当间接调用的地址被篡改时,会触发一个异常,操作系统介入处理。。
CFI即控制流完整性Control-Flow Integrity,主要是通过对二进制可执行文件的动态改写,以此为其增加额外的安全性保障。对jmp的目的地址前插入一个在改写时约定好的校验ID,在jmp的时候看目的地址前的数据是不是我们约定好的校验ID,如果不是则进入错误处理流程。
同理在call 和 ret的时候也可以进行改写
CFG防护方法需要在编译链接阶段来完成准备工作,同时需要操作系统的支持。CFI无需编译时的帮助,且不仅能够防御call调用,能够对全部执行流进行保护。但CFI需要插入大量的检测点,并且在执行过程中检测的频率极高,难免对程序执行效率带来影响。

内核地址空间布局随机化(KASLR):KASLR是ASLR的内核实现,其中,KASLR使得内核开发实际上变得不可能而且极其困难,因为它几乎使直接查找内核驱动程序的基址等地址变得几乎不可能。这使内核驱动程序的开发变得异常困难。
绕过:
在Windows 10的某些旧版本上,存在利用漏洞通过使用线程环境块(TEB)中的Win32ThreadInfo指针或使用桌面堆来强制内核泄漏的漏洞。由于桌面堆是在用户模式下映射的,因此攻击者可以搜索它

内核补丁保护(KPP):
KPP也称为PatchGuard,KPP是包含内核保护的64位Windows系统上的功能,KPP旨在阻止对内核各部分进行不受支持的修改。在64位系统上,对Windows内核进行了设计,以便内核驱动程序具有与内核相同的特权集,将该驱动程序放入KernelLand中,期望该驱动程序不会修改或修补Windows内核中的核心系统结构就不写绕过了

零页禁用:这意味着空指针引用通用的利用方式没了

不执行非分页池:Windows默认使用这种类型的池而不是以往(NX)的非分页池

win10

win32k禁用
Win32k 系统调用禁用限制,限制使用 NTUser 和 GDI 的功能

内核 DEP
和三环一样,注意不是smep

阻止不受信任的字体
有助于防止字体被用于特权提升攻击 阻止不受信任的字体这一设置可让你阻止用户将“不受信任”的字体加载到网络,这可以缓解与分析字体文件相关联的特权提升攻击。 但是,自 Windows 10 版本 1703 开始,这一缓解功能的重要性有所降低,因为字体分析被隔离在 AppContainer 沙盒中

Windows 堆的保护功能
堆是 Windows 用来存储动态应用程序数据的内存中的位置。 通过进一步减少可用作攻击一部分的堆漏洞风险,Windows10 继续改善了早期的 Windows 堆设计。
Windows10 对堆的安全有几项重要改进:
堆元数据强化用于堆使用的内部数据结构,可加强针对内存损坏的保护功能。
堆分配随机化,即,使用随机的位置和大小进行堆内存分配,这会使攻击者更难预测要覆盖的关键内存位置。 具体说来,Windows10 将随机偏移量添加到新分配堆的地址,从而使分配更少可预测。
堆保护在内存块之前和之后的页面,这种情况可作为行程线路工作。 如果攻击者尝试进行的写入超出了某一内存块(即称为缓冲区溢出的常用技术),该攻击者将必须覆盖一个保护页面。 任何修改保护页面的尝试均被视为内存损坏,Windows10 通过即时终止该应用做出响应。

内核池的保护功能
Windows 中的操作系统内核将保留两个内存池,其中一个内存池保留在物理内存(“非分页缓冲池”)中,其中一个可以分页在物理内存(“分页缓冲池”)中。 随着时间的推移,已添加了许多缓解措施,例如进程配额指针编码;lookaside、delay 闲和池页面 cookie;和 PoolIndex 界限检查。 Windows 10 添加了多个 “池强化” 保护(如完整性检查),可帮助保护内核池免受更多高级攻击。

内存保留:最少为系统保留 64 KB 的进程内存。 不允许应用分配该部分的内存。 这使恶意软件更难使用诸如 “NULL 取消引用” 之类的技术来覆盖内存中的关键系统数据结构

win10下的任意地址写漏洞利用思路
https://www.jianshu.com/p/0f2fb534b8e1

未完待续,

猜你喜欢

转载自blog.csdn.net/qq_43045569/article/details/104793899
今日推荐