20145236《网络对抗》进阶实验——Return-to-libc攻击

基础知识

  • Return-into-libc攻击方式不具有同时写和执行的行为模式,因为其不需要注入新的恶意代码,取而代之的是重用漏洞程序中已有的函数完成攻击,让漏洞程序跳转到已有的代码序列(比如库函数的代码序列)。攻击者在实施攻击时仍然可以用恶意代码的地址(比如libc库中的 system()函数等)来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。这就是为什么攻击者会采用return-into-libc的方式,并使用程序提供的库函数。这种攻击方式在实现攻击的同时,也避开了数据执行保护策略中对攻击代码的注入和执行进行的防护。

  • 攻击者可以利用栈中的内容实施return-into-libc攻击。这是因为攻击者能够通过缓冲区溢出改写返回地址为一个库函数的地址,并且将此库函数执行时的参数也重新写入栈中。这样当函数调用时获取的是攻击者设定好的参数值,并且结束后返回时就会返回到库函数而不是 main()。而此库函数实际上就帮助攻击者执行了其恶意行为。更复杂的攻击还可以通过 return-into-libc的调用链(一系列库函数的连续调用)来完成。

实验步骤

一、配置实验环境

  1. 在自己的虚拟机上输入命令安装一些用于编译32位C程序的东西,输入命令linux32进入32位linux环境,输入/bin/bash使用 bash
sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-devsudo apt-get install lib32readline-gplv2-dev
  1. 这个攻击最终的目标是要获取root权限,因此在做之前,我先另外添加了一个用户:

  2. 进入32位linux环境,将地址随机化关闭sudo sysctl -w kernel.randomize_va_space=0,并且把/bin/sh指向zsh:

二、漏洞程序

  1. 将漏洞程序保存在/tmp目录下,编译该程序:

  2. 编译该代码,使用–fno-stack-protector来关闭阻止缓冲区溢出的栈保护机制,并设置给该程序的所有者以suid权限,可以像root用户一样操作:

三、在/tmp文件夹下编写getenvaddrexploit

  1. getenvaddr用来读取环境变量:

  2. 将攻击程序"exploit.c"保存在/tmp目录下:

  3. 在root用户下编译:

  4. 用刚才的getenvaddr程序获得BIN_SH地址:

  5. 利用gdb获得systemexit地址:

  6. 将上述三个地址修改入"exploit.c"文件:

  7. 删除刚才调试编译的exploit程序和badfile文件,重新编译修改后的"exploit.c"文件:(由于exploit文件受保护无法用命令删除,所以在图形化界面tmp文件夹下直接手动删除)

四、攻击

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

五、深入思考

将/bin/sh 重新指向/bin/bash(或/bin/dash),观察能否攻击成功,能否获得 root 权限。

  • 首先,我们将/bin/sh重新指向/bin/bash,运行漏洞程序:

  • 发现无法获取root权限,因为bash内置了权限降低的机制,虽然我们可以使得bof返回时执行system(“/bin/sh”),但是我们也依旧获取不到root权限。

  • 如果我们要想在/bin/sh指向/bin/bash时获取root权限,那我们就要想办法在调用/bin/bash之前提升正在运行的进程的Set-UID至root权限,那么我们就可以绕过对bash的权限限制。

  • 之后在查资料时发现了Linux下一个setuid()函数,查看其帮助文档:

  • 从帮助文档中可以得知setuid()用来重新设置执行目前进程的用户识别码,不过,要让此函数有作用,其有效的用户识别码必须为0(root)。在Linux 下,当root 使用setuid()来变换成其他用户识别码时,root 权限会被抛弃,完全转换成该用户身份,也就是说,该进程往后将不再具有可setuid()的权利。

  • 因此我们可以利用函数setuid(0)来实现我们的目标,在调用系统函数system(“/bin/sh”)之前,先调用系统函数setuid(0)来提升权限。

  • 我们先要对攻击程序进行修改,在bof的返回地址处(&buf[24])写入setuid()的地址,setuid的地址同样可以通过gdb来获得:

  • setuid的参数0写在与其入口地址相隔一个字节的位置(即buf[32])处(因为setuid()执行完毕之后,会转向存放setuid入口地址的下一个位置,所以这个位置应该放入system函数的入口地址),同理system的参数放入&buf[36]处。

  • 修改完成后,编译运行,发现攻击成功!

20145236《网络对抗》进阶实验——Return-to-libc攻击的更多相关文章

  1. 20155328 《网络对抗》 实验八:Web基础

    20155328 <网络对抗> 实验八:Web基础 实验内容及过程记录 一.Web前端HTML 我们的kali是默认安装好了apache的.首先输入netstat -tupln |grep ...

  2. 网络对抗第一次实验——PC平台逆向破解(5)M

    网络对抗第一次实验--PC平台逆向破解(5)M 实践一 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 操作步骤: 获取实验用文件pwn1,复制,复制出来的文件改名为20155 ...

  3. 20155328 《网络对抗》 实验九 Web安全

    20155328 <网络对抗> 实验九 Web安全 基础 实验过程记录 在实验开始之前先把webgoat的jar包放到home目录下.打开终端,用命令java -jar webgoat-c ...

  4. 20145220韩旭飞《网络对抗》实验五:MSF基础应用

    20145220韩旭飞<网络对抗>实验五:MSF基础应用 主动攻击 首先,我们需要弄一个xp sp3 English系统的虚拟机,然后本次主动攻击就在我们kali和xp之间来完成. 然后我 ...

  5. 20145230熊佳炜《网络对抗》实验九:web安全基础实践

    20145230熊佳炜<网络对抗>实验九:web安全基础实践 webgoat webgoat的中文是代罪羔羊的意思,而它是一个有很多漏洞的web应用程序,我们可以利用它来研究关于web应用 ...

  6. 20145230熊佳炜《网络对抗》实验八:WEB基础

    20145230熊佳炜<网络对抗>实验八:WEB基础 实验目标 Web前端HTML:能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTM ...

  7. 20145230熊佳炜《网络对抗》实验五:MSF基础应用

    20145230熊佳炜<网络对抗>实验五:MSF基础应用 主动攻击 首先,我们需要弄一个xp sp3 English系统的虚拟机,然后本次主动攻击就在我们kali和xp之间来完成. 然后我 ...

  8. 20145231熊梓宏 《网络对抗》 实验9 Web安全基础实践

    20145231熊梓宏 <网络对抗> 实验9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? •SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面 ...

  9. 20145231熊梓宏 《网络对抗》 实验8 Web基础

    20145231熊梓宏 <网络对抗> 实验8 Web基础 基础问题回答 ●什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中输入信息的元素,表单在网页中主要负责数据采集 ...

  10. 20145231熊梓宏 《网络对抗》 实验5 MSF基础应用

    20145231熊梓宏 <网络对抗> 实验5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit就相当于是就是渗透攻击,其 ...

随机推荐

  1. MYSQL查询优化:Limit

    Limit语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的 ...

  2. 【C#数据结构系列】排序

    一:排序 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难.同样,存储在计算机中的数据的次序,对于处理这些数 ...

  3. 理解Java异常

    一.Java异常的简介 Java异常是Java提供的一种识别及响应错误的一致性机制.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.Ja ...

  4. Windows平台如何部署scrapy

    0.安装Anaconda 这个不教了,自己去Anaconda官网上下个安装包,装上就好. https://www.anaconda.com/distribution/ 1.使用Anaconda创建一个 ...

  5. CodeForces822A

    A. I'm bored with life time limit per test 1 second memory limit per test 256 megabytes input standa ...

  6. HDU4283(KB22-G)

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. 【 js 基础 】【读书笔记】Javascript “继承”

    是时候写一写 “继承”了,为什么加引号,因为当你阅读完这篇文章,你会知道,说是 继承 其实是不准确的. 一.类1.传统的面向类的语言中的类:类/继承 描述了一种代码的组织结构形式.举个例子:“汽车”可 ...

  8. JS中深浅拷贝 函数封装代码

    一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...

  9. python的深浅拷贝以及fromkeys的用法

    1.join()的用法:使用前面的字符串.对后面的列表进行拼接,拼接结果是一个字符串 # lst = ["alex","dsb",'wusir','xsb'] ...

  10. Vue.js之生命周期

    有时候,我们需要在实例创建过程中进行一些初始化的工作,以帮助我们完成项目中更复杂更丰富的需求开发,针对这样的需求,Vue提供给我们一系列的钩子函数. vue生命周期 beforeCreate 在实例初 ...