Gdb调试复现Dirty Pipe漏洞(CVE-2022-0847)之内核态调试

news2024/12/22 17:14:09

第一、准备环节-增加内核调试辅助语句:

首先,为了更好的查看关键因素的变化:稍微做了两处修改:

第一处:splice前后,增加getchar和puts;

第二处:prepare
pipe过程中,增加getchar和puts;

修改后代码执行结果如下:

下面内容重点关注程序运行启动之后,该漏洞利用的两个关键要素:prepare_pipe函数、splice函数的内核态分析,此外对只读的suid文件的写入进行分析。

第二、关键因素-prepare_pipe函数的内核调试

这里的prepare_pipe函数有两个环节:第一个环节是write循环,第二个环节是read循环。

在第一个环节中,当程序执行到prepare_pipe函数中write循环,这里的内核态重点是关注flag信息,此时执行状态如下:

对应的内核态执行内容:

一步一步的调试,查看flags数值变化:

结合如下的代码

可以看到517行将该flags设置为0x10,也就是can
merge,这里以pipe->bufs[1]->flags为例,看内核流程和对应的变量。

这里只是显示了一次循环的结果,总计有16次循环,都会将此flags设置为can
merge标记。

第二个环节就是进入到read循环,对应的执行状态和代码如下:

Read完成后,原有的flag没有改变,依旧是0x10,最终prepare_pipe结束之前得到的flags信息如下:

其中,显示3个bufs对应的flags的位置如下:

从而可以看出,prepare_pipe已经顺利完成了flags的设置,全部设置为can
merge的flag。

第三、关键因素-splice函数的内核调试

设置断点

对应此时的内核代码:

以及对应的栈帧信息

进入该函数之后,可以查看flags,根据我们在用户态的推断,此时应该是0x10,gdb显示确实也是如此:

此图说明,第一个要素此时已经准备好了。下面就是splice里面的关键的page的赋值

在尚未执行到buf-page=page时,这里的buf->page和page的值如下:

完成page赋值之后,pipe的bufs[0],已经赋值为chsh这个suid文件的page了。

请记下此处的page信息0xffffea00002b3000,这里的page就是后续我们write函数的目的地址。只有能够write到这个page中,才能算是漏洞利用成功。

第四、将elfcode写入到只读suid文件对应的可读写的内存page中

设置write断点:

对应的用户态代码如下

一步一步调试进入到内核态中if判断的分支中:

此时,各个变量对应的数值如下:

此时,该page就是/usr/bin/chsh这个suid文件在内存中的page,因为该page的flag为0x10,can
merge,所以,后续的内容只要不超过这个page大小,就会继续在这个page中写入。这里的chars就是elfcode。大小只有0x196,加上1之后,不超过一个page的大小。所以,就直接覆写到该page中了。这里的操作就是本漏洞利用的重点。

该处函数执行流会进入到如下代码段:

此时453行的ret为0,接着执行copy_page_from_iter函数,查看此时的汇编代码:

此时,就查看调用时的参数,终于可以确认该pipe_write函数的目的是处于0xffffea00002b3000的page。

此处执行的copy_page_from_iter的C代码如下:

接着进入到copy_page_from_iter_iovec,

进入copy_page_from_iter_iovec函数的栈之后:

然后查看该函数中关键的变量page和buf信息如下:

此时,由上图可见,最核心的两个参数都已经准备好了,page就是我们前面得到的可以merge的page,而拷贝的内容就是buf,也是我们准备好的elfcode。该流程继续执行下去就完成了将elfcode拷贝到该page中,而该page对应着具有suid权限的/usr/bin/chsh文件。

至此,内核态最核心的两个关键要素以及写入suid文件对应的page这三个部分就差不多了,剩下的就参考用户态调试即可。还是要感谢发现这个漏洞的Max
Kellermann以及国内众多针对这个漏洞的展开详细描述的各位专家。这两篇文章(用户态调试和内核态调试)如有不到之处,还请各位多指教。最后,完结散花。

调试即可。还是要感谢发现这个漏洞的Max
Kellermann以及国内众多针对这个漏洞的展开详细描述的各位专家。这两篇文章(用户态调试和内核态调试)如有不到之处,还请各位多指教。最后,完结散花。

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Bean生命周期,就像人的一生

这篇我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像。1 简单说说IoC和BeanIoC,控制反转,想必大家都知道,所谓的控制反转,就是把new对象的权利交给容器,所有的对象都被容器控制&…

利用STC15输出两路互补SPWM波形

利用STC15输出两路互补SPWM波形🎞逻辑分析仪信号采集演示: 🔖本案例使用的是IAP15W4K61S4验证。 📍相关篇《STC15系列PWM相关功能寄存器介绍》 📌相关开源PCB《【PCB开源分享】STC/IAP15W4K61S4开发板》 &#…

Linux(七)进程间通信

进程间是如何进行通信的? 通过前面的学习之后,我们知道进程间是具有独立性的,在操作系统的层面来看,进程就是一块pcb,是对运行中的程序动态运行过程的描述,在Linux角度下,进程就是一个task_stru…

2-2JVM-GC垃圾回收

GC垃圾回收 了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行、并行、并发、G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导致内…

YOLOv5/v7 Falsk Web 监测平台 | YOLOv5/v7 Falsk Web 部署

YOLOv7 Falsk Web 监测平台图片效果展示 YOLOv7 Falsk Web 监测平台视频效果展示 YOLOv7 Flask Web 检测平台 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开…

HTB_Jerry tomcat弱口令war包getshell

文章目录信息收集Tomcat war 包 getshell信息收集 扫描发现 8080 端口存在 tomcat 服务,访问 manage app 管理接口,需要输入账号密码 点击取消,看到默认账号密码,重新登录,登录成功,未修改 一般就是上传或…

JVM类加载

作用:负责从硬盘/网络中加载字节码信息,加载到内存中(运行时数据区的方法区中) 类加载过程: 加载 使用IO读取字节码文件,转换并存储 为每个类创建一个Class类的对象 存储在方法区中 链接(…

Jackson注解使用分析

文章目录Jackson常用注解1. 常用注解汇总2. 注解使用分析JsonIncludeJsonAnyGetterJsonAnySetterJsonNamingJsonAutoDetectJacksonInjectJsonAliasJsonValueJsonMergeJsonRawValueJsonEnumDefaultValueJsonFilterJsonSerializeJsonDeserializeJacksonAnnotationJacksonAnnotati…

excel合并技巧:查找函数遇到合并单元格怎么应对

大家都在期盼奖金的到来,可是核算奖金的同事正在苦恼,因为以前用得好好的VLOOKUP函数突然不合适了,很多人的奖金计算出来都变成了乱码:使用VLOOKUP函数每个部门只有第一行正确,其他都是乱码。看到这个表,相…

【服务器数据恢复】raid5硬盘离线后热备盘未启用的数据恢复案例

服务器数据恢复环境: 某品牌X3850服务器,组建的raid5磁盘阵列,该raid5磁盘阵列包含4块成员盘和1块热备盘。 服务器故障: 服务器在运行过程中由于未知原因突然崩溃,用户方工程师检查后发现该故障服务器raid5阵列中2块磁…

Electron + Vue 开发环境搭建

1.安装nodejs,下载网址:https://nodejs.org/en/ 点击安装程序,一路next即可 安装完成之后打开cmd测试,输入node -v查看node版本,输入npm -v查看npm版本 安装完成后,.msi格式的安装包已经将node.exe添加到…

Excel连接openGauss数据库实操

目录 前言 一、通过excel 添加数据源访问openGauss 1、查看Excel版本 2、下载 ODBC驱动 3、安装ODBC驱动 4、添加ODBC数据源 5、在excel中添加数据源(访问openGauss) 二、通过excel 的VBA(宏)访问openGauss 1、宏权限设置…

2.1 java基础 day02 流程控制 创建类和对象 栈堆元空间

1流程控制 流程控制: 1.1.计算机在执行代码时对指令代码执行顺序的控制 1.2.Java 流程控制主要分三种: 顺序执行 分支执行 重复执行 1.3.顺序执行 按代码和语法出现的先后顺序执行 1.4.分支执行 根据判断条件执行分支逻辑 可选分支、必选分支&#…

活体识别6:小视科技开源的静默活体检测

说明 该项目为小视科技的静默活体检测项目。开源地址在 https://github.com/minivision-ai/Silent-Face-Anti-Spoofing。 由于不是论文衍生项目,所以只有一个公众号文章的介绍:https://mp.weixin.qq.com/s/IoWxF5cbi32Gya1O25DhRQ 方案详情 该方案是…

【安全】端口复用:远程遥控iptablesSSLH工具

目录 基础知识点 链的概念 表的概念 表链关系 远程遥控iptables进行端口复用 Ⅰ、利用ICMP做遥控开关 ①创建端口复用链 ②创建端口复用规则,将流量转发至 22 端口 ③开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到…

使用Oracle VM VirtualBox安装Centos

1.下载安装Oracle VM VirtualBox 2.下载Centos 下载地址 旧版本 3.新建 选择镜像填写账户信息之后,我这边不知道什么原因,并不能完成所有工作,所以我一般不选择 4.选择镜像 5.安装 通过方向键和回车键选择 6.设置 选择中文 等待一些自动…

2023年“华数杯”国际大学生数学建模B题完整思路

2023华数杯如期开赛,本次比赛作为美赛的模拟赛,赛题和比赛时间都和美赛高度相似,因此大家 完全可以当作一次美赛之前的练习赛进行。美赛的发题时间与华数杯一致,都是早晨六点,现已经将机器翻译的初步翻译 结果进行了分…

c语言通讯录max——数据的持久化处理(详解)

用文件操作升级通讯录前言1.实现逻辑2.用哪种文件存储数据2. save_contact函数设计3. load_contact 函数设计5.代码总览contact.hcontact.ctext.c前言 在有关通讯录的上一篇博客中,作者用柔性数组实现了动态改变通讯录占用空间的功能,但是在最后还是留下…

【Go基础】Http编程

文章目录1. http协议1.1 请求方法1.2 URL1.3 协议版本1.4 请求头1.5 请求正文1.6 http response1.7 https2. go语言http标准库3. http router4. 请求校验5. http中间件6. GIN6.1 路由6.2 参数获取6.3 利用postman提交http请求6.4 生成response6.5 参数检验6.6 中间件6.7 会话7.…

互联网分层模型

互联网的逻辑实现被分为好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。用户接触到的只是最上面的那一层,根本不会感觉到下面的几层。要理解互联网就需要自下而上理解每一层的实现的功能。如上图所示,互联网…