加载头像
生活明朗
万物可爱。
随便逛逛
图片
2025-07-20Kernel初识 - Kernel ret2usr
Kernel ret2usr个人感觉这个手法有点类似于用户态的ret2shellcode,但又不完全相同 概述在【未】开启 SMAP/SMEP 保护的情况下,用户空间无法访问内核空间的数据,但是内核空间可以访问 / 执行用户空间的数据,因此 ret2usr 这种攻击手法应运而生——通过 kernel ROP 以内核的 ring 0 权限执行用户空间的代码以完成提权。 通常 CTF 中的 ret2usr 还是以执行 commit_creds(prepare_kernel_cred(NULL)) 进行提权为主要的攻击手法,不过相比起构造冗长的 ROP chain,ret2usr 只需我们要提前在用户态程序构造好对应的函数指针、获取相应函数地址后直接 ret 回到用户空间执行即可,在这种情况下 我们只需要劫持内核执行流,而无需在内核空间构造复杂的 ROP 链条 。 ✳ 对于开启了 SMAP/SMEP保护 的 kernel 而言,内核空间尝试直接访问用户空间会引起 kernel panic,我们将在下一章节讲述其绕过方式。 在 QEMU 启动参数中,我们可以为 CPU 参 ...
详情
图片
2025-08-07Kernel初识 - Kernel ROP
Kernel ROPROP 即返回导向编程(Return-oriented programming),应当是大家比较熟悉的一种攻击方式——通过复用代码片段的方式控制程序执行流。 内核态的 ROP 与用户态的 ROP 一般无二,只不过利用的 gadget 变成了内核中的 gadget,所需要构造执行的 ropchain 由 system("/bin/sh") 变为了 commit_creds(&init_cred) 或 commit_creds(prepare_kernel_cred(NULL)),当我们成功地在内核中执行这样的代码后,当前线程的 cred 结构体便变为 init 进程的 cred 的拷贝,我们也就获得了 root 权限,此时在用户态起一个 shell 便能获得 root shell。 状态保存通常情况下,我们的 exploit 需要进入到内核当中完成提权,而我们最终仍然需要着陆回用户态以获得一个 root 权限的 shell,因此在我们的 exploit 进入内核态之前我们需要手动模拟用户态进入内核态的准备工作——保存各寄存器的值到内核栈上, ...
详情
图片
2025-08-10Kernel初识 - Kernel UAF
Kernel UAFUAF 即 Use After Free ,通常指的是对于释放后未重置的垂悬指针利用 。此前在用户态下heap阶段的很多对于 ptmalloc 利用都是基于 UAF 漏洞进行进一步的利用 。 在 CTF 当中,内核的 “堆内存” 主要指的是直接映射区(direct mapping area),常用的分配函数 kmalloc 从此分配内存,常用的分配器为 slub allocator ,若是在 kernel 中存在垂悬指针,我们同样可以以此完成对 slab/slub 内存分配器的利用,通过 Kernel UAF 完成提权 。 CISCN2017 - babydriver 题目只给了我们 boot.sh 、bzImage 、rootfs.cpio 三个文件 观察一下 boot.sh 这应该是题目的启动脚本相关的: 脚本很正常 ,接下来我们将 rootfs.cpio 文件解包进一步分析 。 12345mkdir coremv rootfs.cpio rootfs.cpio.gzmv rootfs.cpio.gz coregunzip rootfs.cpio.gzcpi ...
详情
图片
2025-08-13House of emma
House of emma在 GLibc2.34 版本中,我们以往堆利用最常用的两个 Hook :malloc_hook 、free_hook 直接被取消,导致以往的大部分堆利用手法直接失效,这时候我们急需发现一个类似于 __free_hook 这样的函数指针调用,从而来削弱 getshell 的限制条件。 House of emma 因此诞生 利用范围: 2.23—— 至今 利用条件: 需要两次任意地址写已知地址 需要泄露libc地址以及堆块地址 能够触发IO流(House of kiwi 、FSOP) 由于在 glibc-2.24 的时候添加了对 vtable 的合法性检查,所以我们不能像以往一样直接对 vtable 进行一个劫持,但是这个检查对具体位置相对宽松,我们还是可以在一定范围之内对 vtable 起始位置进行一个偏移 ,我们就可以通过偏移来调用在 vtable 表中的任意函数,因此我们可以考虑将其指定为以下几个函数。 1234567891011121314151617181920212223242526272829303132333435363738394041424 ...
详情
图片
2025-08-08House of Corrosion
House of corrosion利用范围: 2.23 - 至今 利用效果: 任意地址读 任意地址写 任意地址值转移 利用条件: 需要一个UAF漏洞 可以分配较大的堆块(size <= 0x3b00) 不需要泄露地址 利用原理:House of corrosion 是一个针对于 global_max_fast 的相关利用技巧 ,通过一些其他的手法 ,把 global_max_fast 修改成一个极大值 ,比如 unsortedbin attack 、largebinattack 、tcache stashing unlink 等 (利用 unsortedbin attack 时不需要泄露地址,爆破 1/16 即可) ,于是我们就可以实现任意地址读写的功能 。 要想知道 House of corrosion 的具体原理 ,我们就要知道 global_max_fastbin 是什么 。 global_max_fast 是 glibc 堆管理器(ptmalloc2)中的一个全局变量,用于定义 fastbins 的最大 chunk 大小 。它决定了哪 ...
详情
图片
2025-08-10Kernel初识 - Kernel ROP with KPTI bypass
Kernel ROP with KPTI bypass KPTI 相关概念直接引用 CTFwiki KPTI 即 内核页表隔离(Kernel page-table isolation),内核空间与用户空间分别使用两组不同的页表集,这对于内核的内存管理产生了根本性的变化。 KPTI 的发明主要是用来修复一个史诗级别的 CPU 硬件漏洞:Meltdown。简单理解就是利用 CPU 流水线设计中(乱序执行与预测执行)的漏洞来获取到用户态无法访问的内核空间的数据,属于侧信道攻击的一种。 KPTI 同时还令内核页表中属于用户地址空间的部分不再拥有执行权限,这使得 ret2usr 彻底成为过去式 。 对于开启了 KPTI(内核页表隔离),我们不能像之前那样直接 swapgs ; iret 返回用户态,而是在返回用户态之前还需要将用户进程的页表给切换回来 。 众所周知 Linux 采用四级页表结构(PGD->PUD->PMD->PTE),而 CR3 控制寄存器用以存储当前的 PGD 的地址,因此在开启 KPTI 的情况下用户态与内核态之间的切换便涉及到 CR3 的切换,为了提高切 ...
详情
avatar
status
欢迎来到宇宙空间站, 希望你在这里找到所需的知识和教程, 开启一段充满奥秘的奇妙之旅!
公告
欢迎来到我的小站!
分类


网站资讯
文章总数 :
6
建站天数 :
全站字数 :
11.9k
总访客数 :
总访问量 :
最后更新 :
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體