ctf中linux内核态的漏洞挖掘与利用系列1

本文是ctf系列的第一篇,主要介绍Linux内核态与用户态的区别,讲解如何搭建内核分析环境,以及探讨内核权限提升的基本概念。通过实例展示了如何在内核环境中进行提权,包括内核模块、保护机制和用户与内核的交互。文章还提供了一个内核空指针解引用漏洞的利用样例。
摘要由CSDN通过智能技术生成

说明

该系列文章主要是从ctf比赛入手,针对linux内核上的漏洞分析、挖掘与利用做讲解,本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。

linux内核态与用户态的区别

Intel CPU 为例,按照权限级别划分,Intel把 CPU指令集 操作的权限由高到低划为4级:ring 0 (通常被称为内核态,cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡, cpu也可以将自己从一个程序切换到另一个程序)ring 1 (保留)ring 2 (保留)ring 3 (通常被称为用户态,只能受限的访问内存,且不允许访问外围设备) 如下图所示:

越是内环则cpu的权限越高,并且内环可以随意访问外环的资源而外环则被禁止。

因此相比用户态的漏洞,内核态的漏洞具有更强的破坏力,拿到了内核的权限则基本上相当于控制了整个操作系统。

linux内核分析环境搭建

如果只是单纯的搭建内核的分析调试环境,一般来说需要自己手动下载对应版本的内核并进行编译,从kernel官网下载即可,这里笔者下了4.19的内核版本,在编译安装过程中可能会遇到模块缺失的问题,在ubuntu上使用apt安装对应的模块即可,笔者本地手动安装的模块如下:

install libncurses5-dev\
sudo apt-get install flex\
sudo apt-get install bison\
sudo apt-get install libopenssl-dev 

首先使用make menuconfig来生成默认的config文件,这是一个图形化的配置,可以在 kernel hacking 选项中启用部分调试选项来更好的分析kernel上的漏洞。接着使用 make 命令来进行编译,当然这只是默认的编译选项,针linux内核的编译非常多的选择,有兴趣的同学可以参考Linux Insides这本书(xinqiu.gitbooks.io/linux-insid…

默认的编译会生成多个文件,包含了vmlinux、System.map、bzImage等文件,这里主要关注bzImage文件,因为它是可加载的内核镜像文件,x86架构的默认生成于 arch/x86/boot目录。一般来说ctf题目都会给出对应的内核镜像文件、启动脚本、根文件系统等3个文件,通过这三个文件基本可以通过qemu加载起整个操作系统便于进行后续的分析、调试。

接下来需要编译文件系统了,这里使用busybox进行编译,下载好源码后,通过make menuconfig控制编译选项,在build options选择static binary,接下来执行 make install 可在当前目录生成一个_install目录,保存着编译后的文件,之后通过下面的脚本对系统运行时所需内容进行初始化,需在_install 目录下进行。

#!/bin/sh\
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin}}\
echo """#!/bin/sh\
mount -t proc none /proc\
mount -t sysfs none /sys\
mount -t debugfs none /sys/kernel/debug\
mkdir /tmp\
mount -t tmpfs none /tmp\
mdev -s\
exec /bin/sh""">>init\
chmod +x init 

接着切换到 _install 目录并使用压缩指令 find . | cpio -o --format=newc > ../rootfs.cpio 对_install目录下的所有内容进行打包,这样就可以通过 bzImage 以及rootfs.cpio 两个文件使用qemu将整个内核运行起来。运行命令如下:\

qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.cpio -s -append "nokaslr" 

这样一个简单的linux系统就运行起来了,通过-s 参数可以让gdb通过远程网络连接的方式对内核进行调试,break后gdb中断如下:

此时已经可以对任意包含符号的函数下断点了,为了进行初步测试,这里在new_sync_read函数下断点,当有用户输入命令后则会触发,如下:

这样一个基础的内核调试分析环境就已经搭建起来了。

如何在内核环境中进行提权****

基本概念

用户对于支持多任务的 Linux 系统来说,用户就是获取资源的凭证,本质上是其所划分权限的归属。

权限权限用来控制用户对计算机资源(CPU、内存、文件等)的访问。

进程进程是任何支持多道程序设计的操作系统中的基本概念。通常把进程定义为程序执行时的一个实例。实际上,是进程在帮助我们完成各种任务。用户执行的操作其实是带有用户身份信息的进程执行的操作。

进程权限既然是进程在为用户执行具体的操作,那么当用户要访问系统的资源时就必须给进程赋予权限。也就是说进程必须携带发起这个进程的用户的身份信息才能够进行合法的操作。

内核结构

内核涉及到进程和程序的所有算法都围绕一个名为task_struct的数据结构建立(4.19中该结构有600多行,有兴趣的读者自行参考),对于Linux内核把所有进程的进程描述符task_struct数据结构链成一个单链表,该数据结构定义在include/sched.h中,部分结构如下:(参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值