• linux常见漏洞利用技术实践


    2.1 利用跳板覆盖返回地址

    2.1.1 使用范围

    当系统打开ASLR(基本都打开了)时,使用硬编码地址的话,就无法成功利用漏洞.在这种情况下就可以使用这种技术.程序必须关闭NX


    2.1.2 原理

    当函数执行完,弹出了返回地址,rsp往往指向(返回地址+8),我们将shellcode放在此处就可以让程序执行,注意跳板不一定是rsp(和和程序的位数有关)


    2.1.2 原理

    当函数执行完,弹出了返回地址,rsp往往指向(返回地址+8),我们将shellcode放在此处就可以让程序执行,注意跳板不一定是rsp


    2.1.3 实践

    1 拿到程序第一件事就是先运行一下,熟悉要分析的东西(这一点不光是pwn,不管是re还是渗透,先对于目标有个直观了解都是很重要的事)

    enter image description here

    2 打开ida,,可以看到程序非常的简单


    我们输入的数据最终会复制到[bp-20h],而且没有长度限制,肯定就是有栈溢出漏洞


    3 接下来我们检查一下程序打开了哪些保护措施

    enter image description here

    可以看到程序没有没有打开任何保护措施,现在唯一需要解决的就是系统自带的ASLR,(注意,使用gdb调试时,每次看到的栈地址可能是不变的,这并不代表系统没有打开ASLR,gdb调试时会自动关闭ASLR)


    4 接下来是定位返回地址

    前面看到了我们输入的数据最终会复制到[bp-20h],我们先尝试输入40个数据,用python生成40个数据

    从第四十个字节开始的八个字节就会覆盖返回地址

    5 写exp

    首先我们需要一个shellcode,这可以通过msf生成 生成命令如下

    #!bash
    show payload   
    use linux/x64/exec
    set cmd /bin/sh
    generate -t py -b "/x00"
    

    即可得到shellcode


    然后我们还需要一个跳板作为返回地址 peda就有这种功能

    jmpcall rsp
    enter image description here

    我们就采用第一个地址, 注意64位系统,和little endian

    然后我们使用zio写exp


    python pwn1.py运行即可看到

    已拿到shell

    enter image description here


    2.2 GOT覆写

    2.2.1 使用范围

    刚才我们是通过栈溢出漏洞攻击函数的返回地址,但是现在对于栈溢出,已经有很多保护,例如canary(与windows下的GS技术类似).同时现在更常见的是指针覆盖漏洞,在这种情况下我们拥有一次修改任意内存的机会,在这时我们采用的往往就是GOT覆写技术.


    2.2.2 原理

    GOT是全局偏移表,类似于windows中PE结构的IAT,只不过windows中IAT中的函数地址是写保护的,没办法利用,但是GOT是可写的,我们可以将其中的函数地址覆盖为我们的shellcode地址,在程序后面调用这个函数时就会调用我们的shellcode了


    2.2.3 实践

    在这儿我用的实验程序来自panable.kr中的passcode,比较简单,源码如下


    编译后的程序见附件,32位 linux

    感觉锐锐_z的指点

    1 分析程序可知,scanf时,没有用取地址符,会使用栈上的数据作为指针存放输入的数据,而我们第一次输入的数据就是在栈上,简单调试可知,在welcome()函数中的name的最后4字节会在login()函数中被用作地址指针

    2 这样,我们就获得了修改任意地址数据的一次机会

    3 分析程序可知如果我们用后面调用system()的地址覆盖了printf()在GOT中的指针,那么在第二次login()中第二次调用printf()时就会直接去调用system()

    4 现在我们需要知道两个东西,一是GOT中printf()的地址,二是程序中调用system()的地址

    objdump -R passcode
    

    enter image description here

    即可获得printf()在的地址0804a000这是攻击目标,

    然后打开gdb,运行到调用system()的地方,为什么我们可以直接使用这个地址呢,因为linux下面的程序默认没有随机化code段,

    要写入的值即为 0x080485e3

    2.3 ret2libc技术


    2.3.1 使用范围

    当系统打开DEP时,我们不能自己直接在栈上放shellcode,就使用几乎每个linux系统都会自带的libc中的代码.

    2.3.2 原理

    一种常见的利用方式是用libc中的system()的地址覆盖返回地址,同时在栈上布置好的参数,程序返回时就会产生一个shell

    2.3.3 实践

    在这儿用的程序是强网杯的urldecoder(程序见附件),再次感谢tracy_子鹏学长指点

    这道题同时开了ASLR和DEP.,运行环境为32位linux

    1. 分析程序后发现,前面读入数据时,只有遇到换行和EOF才会结束,但是后面检查字符串长度是用的strlen,于是可以通过在字符串中加入x00来绕过长度检查
    2. 继续分析程序流程,发现,当输入为%1x00时就可以成功覆盖返回地址
    3. 接下来就考虑利用漏洞的方法
    4. 观察到溢出后,程序会多输出一些栈上的数据出来,想到可以利用输出出来的一些数据定位libc加载的基址,然后将返回地址覆盖为前面读入数据的代码地址,再读一次数据,再溢出一次,这一次执行到返回时,就执行libc中的system函数
    5. 题目提供了libc,可以计算其中各函数的偏移,找到libc中system函数和/bin/sh字符串的地址,同时在栈上布置好参数,即可成功利用

    enter image description here











  • 相关阅读:
    判断是否IPv6网络
    Makefile使用库
    Makefile编译
    Makefile编译库
    lua定义一个简单的类
    c++ 注册类到 lua
    redis的安装
    yield return的作用
    使用boost的asio,io_service无法初始化
    apache+php+mysql的配置(转载)
  • 原文地址:https://www.cnblogs.com/volva/p/11814989.html
Copyright © 2020-2023  润新知