zoukankan      html  css  js  c++  java
  • 20145208 蔡野《网络对抗》shellcode注入&Return-to-libc攻击深入

    20145208 蔡野《网络对抗》shellcode注入&Return-to-libc攻击深入

    Shellcode注入

    • shellcode的获取代码
    • 我使用了许心远同学博客中的代码:

    • 得到shellcode如下x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80
    • 对环境进行设置,设置为堆栈可执行,并关闭地址随机化:

    • 在Linux下有两种攻击buf的构造方法,这里选择nops+shellcode+retaddr的方法来构造攻击,对返回地址进行猜测,尝试找到shellcode的地址:

    • 然后在终端注入上面的input_shellcode来攻击buf,先不用着急按回车,新开一个终端查看进程pid:

    • 使用gdb调试程序,然后设置断点,查看注入buf的内存地址:

    • 然后在ret的地址位置设置断点后回到之前的终端回车,之后回到gdb进行调试:

    • 现在找到了01020304了,后面的信息明显不对,所以继续往前找:

    • 找到9090310c后再往前找:

    • 可以看出来这里开始就是shellcode了,所以找到了位置,并且返回地址也是对的,所以可以算出shellcode是在0xffffd400位置,将返回地址修改为0xffffd400,重新注入:

    • 成功了!

    Return-to-libc攻击深入

    • 使用如下命令安装用于编译 32 位 C 程序的东西:
    sudo apt-get update
    
    sudo apt-get install lib32z1 libc6-dev-i386
    
    sudo apt-get install lib32readline-gplv2-dev
    
    • 但是第三个安装失败,先暂时忽略:

    • 结果是不影响进入32位环境:

    • 进入32位linux环境之后,将地址随机化关闭,使用命令ln -s zsh sh/bin/sh指向zsh

    • 将漏洞程序代码保存到/tmp文件夹下:

    • 编译程序并设置SET-UID:

    • 编译的时候遇到错误,检查代码后发现原来是实验楼原代码调用头文件的时候没有#符号,纠正后成功:

    • 同样在/tmp文件夹下建一个读取环境变量的程序:

    • 和一个攻击程序(攻击程序暂时如下,要根据内存修改):

    • 现在需要用刚才的20145208_getenvaddr程序获得BIN_SH地址:

    • 通过gdb调试20145208_exploit攻击程序获得 system 和 exit 地址:

    • 把得到的地址填到攻击程序代码的对应位置:

    • 把之前调试用的攻击程序和badfile文件删除后重新编译修改后的攻击程序:

    • 先运行攻击程,再运行漏洞程序,可见攻击成功,获得了 root 权限:

    • 做到最后才发现之前做的有问题,没有新建一个用户,这样没办法知道是不是获取了root权限,因为本来就是root,所以重新做了一遍,过程都一样,所以只修改了最后一张图作为验证。

    深入思考

    将/bin/sh重新指向/bin/bash时的攻击

    • 按照上面的方法从头开始做一遍,只需要改变重定向:

    • 结果没有获取权限,因为bash内置了权限降低的机制,就使得我们虽然可以让bof返回时执行system(“/bin/sh”),但是获取不到root权限。

    • 在网上查资料的时候了解到需要修改setuid()函数,就是我们可以利用函数setuid(0)来提升权限,只需要在调用系统函数system(“/bin/sh”)之前,先调用系统函数setuid(0)。

    • 获取setuid的方式和前面system、exit一样可以用gdb来看,得到setuid地址之后要对攻击程序进行修改,在bof的返回地址处(&buf[24])写入setuid()的地址,setuid的参数0写在buf[32]处,这是因为setuid()执行完毕之后,会跳转到setuid所在地址的下一个位置,所以这个位置应该放入system函数的入口地址,同理system的参数BIN_SH的地址放入&buf[36]处:

    • 测试成功获得权限:

  • 相关阅读:
    LINUX中常用操作命令
    NET Core Kestrel部署HTTPS
    Java中Enum枚举的使用
    Java多线程——sychronized
    Java中SynchronizedMap与ConcurrentHashMap的对比
    Java中HashMap实现原理
    数据结构——Java实现单向链表
    数据库——事务基础
    数据结构——Java实现二叉树
    Java中ThreadLocal的深入理解
  • 原文地址:https://www.cnblogs.com/20145208cy/p/6613070.html
Copyright © 2011-2022 走看看