20145215《网络对抗》shellcode注入&Return-to-libc攻击深入
20145215《网络对抗》shellcode注入&Return-to-libc攻击深入
Shellcode注入
基础知识
- Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址。
实践过程
shellcode的生成方法指导书上已经写得很详细了,在做实验时我直接用的是老师上课用的shellcode:

将环境设置为:堆栈可执行、地址随机化关闭

选择
anything+retaddr+nops+shellcode的结构构造攻击buf,先猜测返回地址所在位置,并且找到shellcode所在地址

在终端注入这段攻击buf:

先不输入“回车”,在后面的调试过程中需要继续运行的时候再回车,此时再打开另外一个终端,用gdb来调试
20145215pwn1这个进程,先找到该进程的进程ID,再打开gdb,用attach指令对该进程进行调试:

对
foo函数进行反汇编:

在
ret处设置断点,接着继续运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,来分析我们之前猜测的返回地址位置是否正确以及shellcode的地址:

- 由上图可以看出,第一个红色方块中的内容是我们之前猜测返回地址而输入的值,第二个方块中的内容则是
shellcode代码,由此我们可以推断出shellcode地址为:0xffffd384 继续运行,如红色方块中所示,可以确认返回地址是被我们之前输入的
\x01\x02\x03\x04所覆盖的:

将返回地址修改为
0xffffd384,重新注入,可以发现已经成功了!


Return-to-libc攻击深入
基础知识
Return-into-libc攻击方式不具有同时写和执行的行为模式,因为其不需要注入新的恶意代码,取而代之的是重用漏洞程序中已有的函数完成攻击,让漏洞程序跳转到已有的代码序列(比如库函数的代码序列)。攻击者在实施攻击时仍然可以用恶意代码的地址(比如 libc 库中的 system()函数等)来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。这就是为什么攻击者会采用return-into-libc的方式,并使用程序提供的库函数。这种攻击方式在实现攻击的同时,也避开了数据执行保护策略中对攻击代码的注入和执行进行的防护。- 攻击者可以利用栈中的内容实施
return-into-libc攻击。这是因为攻击者能够通过缓冲区溢出改写返回地址为一个库函数的地址,并且将此库函数执行时的参数也重新写入栈中。这样当函数调用时获取的是攻击者设定好的参数值,并且结束后返回时就会返回到库函数而不是 main()。而此库函数实际上就帮助攻击者执行了其恶意行为。更复杂的攻击还可以通过return-into-libc的调用链(一系列库函数的连续调用)来完成。
实践过程
其实一开始想用实验楼的环境来做,但是不知道为什么在输入sudo的随机密码时一直提示错误,所以最后就直接在kali上做了。当然,这个攻击最终的目标是要获取root权限,因此在做之前,我先另外添加了一个用户:

进入32位linux环境,将地址随机化关闭,并且把
/bin/sh指向zsh:

将漏洞程序保存在
/tmp目录下:


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

读取环境变量的程序:

将攻击程序保存在
/tmp目录下:

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

利用gdb获得
system和exit地址:

将上述所找到的三个内存地址填写在
20145215exploit.c中:

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

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

深入思考
将/bin/sh重新指向/bin/bash时的攻击
首先,我们将/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]处。

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

20145215《网络对抗》shellcode注入&Return-to-libc攻击深入的更多相关文章
- 20145307陈俊达《网络对抗》shellcode注入&return to libc
20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...
- 20145327《网络对抗》——注入shellcode并执行和Return-to-libc攻击深入
20145327<网络对抗>--注入shellcode并执行 准备一段Shellcode 老师的shellcode:\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68 ...
- 20145318《网络对抗》注入shellcode及Return-to-libc
20145318<网络对抗>注入shellcode及Return-to-libc 注入shellcode 知识点 注入shellcodeShellcode实际是一段代码(也可以是填充数据) ...
- 20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
20145308 <网络对抗> 逆向及BOF进阶实践 注入shellcode+Return-to-libc攻击 学习总结 实践目的 注入shellcode 实现Return-to-libc ...
- 20144303石宇森《网络对抗》注入shellcode和Return-to-libc攻击
20144303石宇森<网络对抗>PC平台逆向破解 实验1:shellcode注入 实验基础 1.Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,n ...
- 20145211《网络对抗》注入Shellcode并执行&&Return-to-libc攻击
Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...
- 20145310《网络对抗》注入shellcode及Return-to-libc
Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...
- 20145315《网络对抗》——注入shellcode以及 Return-to-libc攻击实验
shellcode 准备一段Shellcode 我用的老师的shellcode:\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3 ...
- 20145320《网络对抗》注入Shellcode并执行
20145320注入Shellcode并执行 准备一段Shellcode 首先先准备一段C语言代码:这段代码其实和我们的shell功能基本一样 为了之后能够看到反汇编的结果,这次采用的静态编译.正常返 ...
- 20145305 《网络对抗》注入Shellcode并执行&Return-to-libc 攻击实验
注入Shellcode并执行 实践指导书 实践过程及结果截图 准备一段Shellcode 我这次实践和老师用的是同一个 设置环境 构造要注入的payload 我决定将返回地址改为0xffffd3a0 ...
随机推荐
- lnmp如何实现伪静态,默认目录伪静态
LNMP一键安装包一直是我小内存VPS的首选安装环境,因为它占用资源少,性能高.最新发布的lnmp0.7还增加了对LNMPA的支持,LNMPA使用Nginx作为前端服务能够更快更及时的静态页面.js. ...
- 【php增删改查实例】第四节 -自己 DIY 一个数据库管理工具
本节介绍如何自己DIY一个数据库管理工具,可以在页面输入sql 进行简单的增删改查操作. 首先,找到xampp的安装目录,打开htdocs: 新建一个php文件,名称为 mysqladmin.php ...
- SPA程序加载首界面eclipse卡顿解决笔记
最近在开发SPA程序项目时遇到一个问题,因为是在开发阶段,所以直接就在eclipse中启动项目. 每次进入首界面时,eclipse就会长时间卡顿,前端界面也加载不出来,很影响开发效率. 在查找问题的时 ...
- Jq_$.getJSON( )
jQuery中的$.getJSON( )方法函数主要用来从服务器加载json编码的数据,它使用的是GET HTTP请求.使用方法如下: $.getJSON( url [, data ] [, succ ...
- VirtualBox虚拟机怎么导入已经存在的vdi文件
VirtualBox虚拟机怎么导入已经存在的vdi文件 第一章 1.原因 早上一不小心将virtualBox 卸载了,(不知道怎么了, 里面得虚拟机全部都没有了,但是vdi文件还在) 2.解决办法 直 ...
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
昨天在爬取电影的时候生成的表单打开result.html时,发现页面出现如下乱码: 第一种方法: 上网找了半天,网上的解决方案是这样的: 1.Win + R输入gpedit.msc打开组策略编辑器; ...
- Jmeter目录文件讲解
1.bin:核心可执行文件,包含配置 2.windows启动文件:jmeter.bat mac或linux启动文件:jmeter jmeter-server:mac或linux分布式压测启动文件 jm ...
- Python+opencv 图像拼接
1.http://www.cnblogs.com/skyfsm/p/7411961.html ,给出了很好地拼接算法实现 2.由于不是Python的,所以简单做了一些翻译转成Python+opencv ...
- 小学生都能写智能语音助手了,我这颗转战AI的心要何去何从?
前言——我是不是老了 前天看了一个关于AI类的综艺节目我感觉整个人都不好了.这个综艺的名字叫<智造将来>上面那个小屁孩自己写了一个智能语音助手,这个小屁孩叫袁翊闳是2018年百度AI开发者 ...
- JWT总结
Json web token (JWT) 什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该toke ...