「Kernel Pwn」简单复习一下 kernel pwn
内容提要
本文介绍了Linux内核中的Pwn攻击,包括KCanary、KASLR、SMEP、SMAP和FGKASLR等防护机制。作者提供了实例和方法,展示了如何在实际环境中进行内核Pwn攻击。
延伸解读
防护机制递进:从基础到高级的绕过思路
文章以强网杯2018 core 为例,逐步启用 KCanary、KASLR、SMEP、SMAP、KPTI 和 FGKASLR 等防护,展示了不同阶段的绕过方法。例如,在仅有 KCanary 时,通过读取 /tmp/kallsyms 获取函数地址并利用栈溢出;当启用 SMEP/SMAP 时,通过 ROP 修改 CR4 寄存器或直接在内核中执行提权函数;面对 KPTI 时,利用 swapgs_restore_regs_and_return_to_usermode 切换页表。这种递进方式有助于理解各防护的作用及应对策略。
关键技巧:CR4 寄存器与 KPTI 页表切换
SMEP 和 SMAP 本质是 CR4 寄存器的两个比特位,文章通过 ROP 链将 CR4 置为 0x6f0 来关闭它们。对于 KPTI,文章指出不能直接返回用户态,而需借助 swapgs_restore_regs_and_return_to_usermode 函数中的指令正确切换 CR3 页表。此外,还提到若不切换页表直接返回,会触发 SIGSEGV 而非内核 panic,可通过信号处理器执行后续操作。这些技巧是内核漏洞利用中的常见手法。
替代利用路径:覆盖 modprobe_path 获取 root
当难以直接调用 commit_creds 时,文章介绍了覆盖 modprobe_path 的方法。modprobe_path 是内核中的一个变量,当执行未知文件头的程序时,内核会以 root 权限执行 modprobe_path 指定的程序。通过 ROP 链覆盖该变量为恶意脚本路径,再触发执行,即可获得 root 权限。文章给出了具体 ROP 链构造和利用脚本,并建议直接拷贝 flag 以避免环境变量问题。
FGKASLR 的应对与局限
FGKASLR 通过对函数进行随机化增加利用难度,但文章指出,若已知符号地址,FGKASLR 影响有限。对于无法获取符号的情况,可利用 __ksymtab 段中固定的偏移计算函数地址,但作者发现实际 vmlinux 中存储的是直接地址而非偏移,且恢复的符号表可能缺失,因此该方法暂未成功。这反映了 FGKASLR 绕过在实际环境中的复杂性。
Q&A
什么是Kernel Pwn攻击?
Kernel Pwn攻击是针对Linux内核的漏洞利用技术,攻击者通过利用内核中的漏洞获取系统权限。
KCanary、KASLR、SMEP和SMAP的作用是什么?
这些是Linux内核中的防护机制,旨在防止栈溢出、地址泄露和其他攻击方式,增强系统安全性。
如何在启用KASLR的情况下进行内核漏洞利用?
可以通过读取内核符号表获取函数地址,结合栈溢出等技术来实现漏洞利用。
FGKASLR防护下如何计算地址?
在FGKASLR防护下,可以利用固定偏移段来计算所需地址,确保攻击成功。
如何通过覆盖modprobe_path获取root权限?
通过覆盖modprobe_path变量,执行恶意程序以获取root权限,这是利用内核漏洞的一种方法。
KPTI保护的绕过方法有哪些?
可以通过特定函数切换页表,或利用内核态和用户态的PGD隔离来绕过KPTI保护。