区块链技术博客
www.b2bchain.cn

老表带你学Linux kernel pwn 入门(二)

这篇文章主要介绍了老表带你学Linux kernel pwn 入门(二)的讲解,通过具体代码实例进行17723 讲解,并且分析了老表带你学Linux kernel pwn 入门(二)的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=17723

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

文章目录

  • 写在前面
  • 基础知识
    • 涉及的保护机制与绕过方法
  • 目标分析与准备
    • root权限准备
    • 文件系统重要信息获取
    • 驱动程序分析
      • 检查驱动保护机制
      • 驱动漏洞分析
  • exp编写思路
    • 1.canary泄露和kaslr的绕过
    • 2. 内核ROP绕过SMEP
    • 3.提权弹shell

写在前面

本篇是老表带你学linux kernel pwn 系列的第二篇,展示在面对aslr和开启Smep保护时的栈溢出赛题解题方式。新手上路,详细记录。

基础知识

涉及的保护机制与绕过方法

  • KALSR 内核空间地址随机化

    • 基本原理

    实际效果是,内核中的虚拟地址在加载时均会加上一个相同的偏移

    实 际 地 址 = v m l i n u x 中 的 静 态 地 址 + 随 机 值 实际地址 = vmlinux中的静态地址 + 随机值 =vmlinux+

    • 绕过原理
  • stack canary

    • 基本原理
    • 绕过原理

目标分析与准备

本章对demo中的初始文件进行处理,为后续分析过程打下准好准备。

初始demo提供四个文件:

  • baby.ko
  • bzImage
  • initramfs.cpio
  • startvm.sh

root权限准备

  • 修改initramfs.cpio为root.cpio

老表带你学Linux kernel pwn 入门(二)

stesid cttyhack setuidgid 0000 sh 
  • 配置startvm.sh脚本为root.sh

老表带你学Linux kernel pwn 入门(二)

-append 'console=ttyS0 loglevel=3 oops=panic panic=1 nokaslr'  -gdb tcp::1234 

文件系统重要信息获取

  • 重要环境信息换取

    cat /proc/cpuinfo

    老表带你学Linux kernel pwn 入门(二)

    蓝色方框表示开了smepsmap

    lsmod查看驱动的启动地址

    老表带你学Linux kernel pwn 入门(二)

    这个地址可以用来调整ida的基址,方便调试驱动时打断点。

驱动程序分析

检查驱动保护机制

gdb ./baby.ko checksec 

老表带你学Linux kernel pwn 入门(二)

可以看出,开了canary因此需要把canary泄露出来。

驱动漏洞分析

  • ida逆向

    老表带你学Linux kernel pwn 入门(二)

    edit->segments->rebase program 修改基址为0xffffffffc0002000

    记录call _copy_to_user的指令地址0xffffffffc0002051

  • 脆弱性分析

    • copy_from_user存在栈溢出
    • copy_to_user可以把内核数据复制到用户态从而造成泄漏

exp编写思路

简单总结一下通过一次内核溢出实现提权弹shell的过程:在有机会劫持eip 时,找出prepare_kernel_credcommit_creds函数的准确位置。开了kaslr的导致函数的准确位置无法确定,因此需要绕过kaslr获取函数的准确位置。

同时开了canary,因此需要泄露canary的值,并在伪造的栈中填上canary的值。

1.canary泄露和kaslr的绕过

首先,我们来想办法泄露出canary的值,同时想办法泄露出一个内核中的值用来求解内核地址空间随机化的偏移值。

  • 泄露canary值的过程

    利用调试简单介绍下canary的原理。

    • leak infopoc编写

      首先,先随意编写一个利用_copy_to_user泄露信息的poc,并调试分析这个过程

    #include <stdio.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <stdint.h>  int main(int argc, char *argv[]){     int fd = open("/dev/baby",0);     char temp[0x1000];     ioctl(fd,0x6002,temp);     write(1,temp,0x200);     getchar();     reutrn 0; } 
    • 调试准备

      准备root权限,未开aslr的虚拟机用于调试,编译上面的poc,并开始调试,断点下载0xffffffffc0002051 具体细节可以看系列(一)

      老表带你学Linux kernel pwn 入门(二)

    • 泄露过程

      开始调试,_copy_to_user(a,b,c)效果上就是内存拷贝,把ba拷贝c个字节。

      在上面的断点处si,进入_copy_to_user内部记录。蓝色方框中为内核中的kernel_buf的起始地址,橘色方框中为buf的起始地址。

老表带你学Linux kernel pwn 入门(二)
依据rsprbp观察函数调用栈栈底附近的结构,如下图所示,蓝色方框中为rbp,红色方框内为返回地址,绿色方框内的为canary的值,canary的最高位都是0x00。
老表带你学Linux kernel pwn 入门(二)根据rbp,rsb,rsi,ret和canary的在栈上的位置可以用下图表示。

补 图 补图
泄露函数可以复制0x200个字节,因此计算canary的偏移为 0 x 7 e 48 − 0 x 7 d c 8 = 0 x 80 0x7e48 -0x7dc8 = 0x80 0x7e480x7dc8=0x80,随意一个内核地址,方便起见,我们就用rsi,这样泄露出来的起始地址就是buf[0]

  • 泄露内核地址
    c o m m i t _ c r e d s k a s l r − c o m m i t _ c r e d s n o k a s l r = l e a k _ a d d r e s s k a s l r − l e a k _ a d d r e s s n o k a s l r commit_creds_{kaslr} -commit_creds_{nokaslr} = leak_address_{kaslr}-leak_address_{nokaslr} commit_credskaslrcommit_credsnokaslr=leak_addresskaslrleak_addressnokaslr

    其他需要用到的地址计算方式类似。

2. 内核ROP绕过SMEP

3.提权弹shell

本文转自互联网,侵权联系删除老表带你学Linux kernel pwn 入门(二)

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 老表带你学Linux kernel pwn 入门(二)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们