• 20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结


    20145308 《网络对抗》 逆向及BOF进阶实践 注入shellcode+Return-to-libc攻击 学习总结

    实践目的

    • 注入shellcode
    • 实现Return-to-libc攻击

    知识点学习总结

    • Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起
    • Linux中两种基本构造攻击buf的方法:retaddr+nop+shellcode,nop+shellcode+retaddr,缓冲区小就就把shellcode放后边,不然就放前边
    • Return-to-libc是缓冲区溢出的变体攻击,这种攻击不需要一个栈可以执行,甚至不需要一个shelcode,取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的lib库中的system()函数等)来实现我们的攻击

    实践过程

    shellcode的注入

    • 编写一段sellcode,文件保存名20145308shellcode

    • 安装execstack

    • 设置堆栈可执行,并查询堆栈是否可执行,以便shellcode在堆栈上可以执行

    • 关闭地址随机化,避免每次执行分配的内存地址不同

    • 采取nop+shellcode+retaddr方式构造payloadx4x3x2x1将覆盖到堆栈上的返回地址的位置,需要将它改为shellcode的地址)

    • 确定x4x3x2x1处返回地址应该填什么

    • 注入攻击buf

    • 另开一个终端,用gdb调试5308pwn进程

    • 首先要找到5308pwn进程号,找到5308的进程号是2906

    • 启动gdb调试进程,设置断点,查看注入buf的内存地址

    • 设置断点后,在另一个终端按下回车,并寻找返回地址,看到01020304表示返回地址的位置是0xffffd33cshellcode就紧挨着这个地址,加四字节为0xffffd340

    • 退出gdb,按照anything+retaddr+nops+shellcode修改input_shellcode如下

    • 成功

    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位linux环境,并使用bash

    • 关闭地址空间随机化

    • 使用另一个shell程序(zsh)代替/bin/bash,设置zsh程序

    • 在编译时手动设置栈不可执

    • 编写retlib.c

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

    • 上述程序有一个缓冲区溢出漏洞,它先从一个叫“badfile”的文件里把 40 字节的数据读取到 12 字节的 buffer,引起溢出。fread()函数不检查边界所以会发生溢出。由于此程序为 SET-ROOT-UID 程序,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得 root shell。应该注意到此程序是从一个叫做“badfile”的文件获得输入的,这个文件受用户控制。现在我们的目标是为“badfile”创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个 root shell

    • 需要用到一个读取环境变量的程序:getenvaddr.c

    • 编译

    • 编写exploit.c

    • 用刚才的getenvaddr程序获得BIN_SH地址,0xffffdf43

    • gdb获得systemexit地址

    • 编译

    • gdb,得到system地址0xf7e2eb30exit地址0xf7e227e0

    • 修改exploit.c文件,填上刚才找到的内存地址

    • 删除刚才调试编译的exploit程序和badfile文件,重新编译修改后的exploit.c

    • 先运行攻击程序exploit,生成了badfile文件,再运行漏洞程序retlib,可见攻击成功,获得了root权限

    其他

    • 刚开始的时候,感觉进阶实验很难,不敢动手,经过老师上课讲解之后,决定尝试一次,最后成功做出了实验,也通过实验对shellcode注入部分的知识有一定的了解
    • 但是实验是在关闭地址随机化和设置堆栈可执行等前提下进行的,在现实里基本没有相似的情况,操作系统都会实施措施保护计算机,所以还需要进阶学习
    • 进阶学习,选择了Return-to-libc的实验,实现了在栈不可执行的情况下,让漏洞程序调转到现存的代码
    • 开始编译exploit程序出错,运行结果是攻击程序和漏洞程序都是运行错误,后来发现自己写代码的时候把fopen写成了open导致错误
  • 相关阅读:
    C#2.0新特性
    .NET Framework 4.5新特性
    C#4.0 中的新特性
    C#3.0中的新特性
    开始使用Mac OS X——写给Mac新人
    关于WF4 State Machine 状态机工作流的发布问题.
    C# 3.5新特性
    libssh2编译错误(configure error: cannot find OpenSSL or Libgcrypt)解决方法
    程序员转产品经理的思考
    升级PHP版本
  • 原文地址:https://www.cnblogs.com/yg961022/p/6517699.html
Copyright © 2020-2023  润新知