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

本文介绍了Linux内核态与用户态的区别,详细讲解了如何搭建内核分析环境,包括内核编译和Busybox文件系统制作。接着,探讨了在内核环境中进行权限提升的基本概念,如进程权限、cred结构,以及提权方法。通过示例展示了如何利用内核模块漏洞进行提权,并列举了内核保护机制和用户与内核交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片

说明

该系列文章主要是从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这本书(https://xinqiu.gitbooks.io/linux-insides-cn/content/)。

默认的编译会生成多个文件,包含了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的数据结构建立(

### CTF竞赛中Linux的作用和应用场景 #### Linux作为主要操作系统平台的重要性 在CTF(夺旗赛)环境中,Linux扮演着不可或缺的角色。由于许多服务器端应用和服务部署于Linux平台上,因此熟悉Linux环境成为参赛者必备技能之一[^1]。 #### 工具链支持 大量用于渗透测试、漏洞挖掘以及数据分析的安全工具原生运行于Linux之上,如Nmap, Wireshark等。这些工具极大地提高了效率并简化了复杂任务处理流程,在比赛中被广泛采用来辅助解题过程[^2]。 #### 编程脚本编写能力 Python和其他解释型语言通常安装在Linux发行版中,默认情况下就具备强大的库函数集合,这使得快速开发原型变得容易实现;同时bash/shell编程也允许使用者通过简单的命令组合完成自动化操作,这对于时间敏感的比赛场景尤为重要[^3]。 #### 文件权限管理机制的理解 深入理解Linux下的文件系统及其访问控制列表ACLs有助于破解涉及权限提升或绕过保护措施类型的挑战题目。例如,当面对一个存在弱配置的服务时,知道如何查看进程状态(`ps aux`)、查找可执行位设置不当的程序(find / -perm -u=s),可以为寻找突破口提供更多思路[^4]。 ```bash find / -perm -u=s 2>/dev/null ``` 此命令可用于发现具有SUID/SGID属性的潜在危险二进制文件。 #### 网络协议栈特性掌握 Linux内核自带丰富的网络诊断功能,比如tcpdump抓包分析、iptables防火墙规则设定等功能模块,这些都是在网络攻防对抗环节解决问题的关键所在。此外,精通socket API接口调用也是解决某些特定类型pwnable challenge的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值