20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

shellcode注入实践

编写shellcode

编写shellcode已经在之前的实验中搞定啦,这次直接用成品咯~

准备工作,设置环境

基础——Bof攻击防御技术
· 从防止注入的角度来看:在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。
· GCC中的编译器有堆栈保护技术(结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。)
· 此时就需要手动设置环境,如下所示:

apt-cache search execstack
apt-get install execstack
execstack --help
execstack -s pwn1    //设置堆栈可执行
execstack -q pwn1    //查询文件的堆栈是否可执行

1002160-20170331001618039-369481266.png

构造要注入的payload

· 在Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcodenop+shellcode+retaddr``。因为retaddr在缓冲区的位置是固定的,shellcode可能在它前面或者后面,或者说缓冲区小就把shellcode放后面,缓冲区大就把shellcode放前面。 · 我们还是尝试对于pwn1用nop+shellcode+retaddr`的方法

payload结构为nop+shellcode+retaddr

· 编写payload
1002160-20170331002225539-897483811.png

需要注意的是:千万不能以\x0a作为结束。因为\x0a相当于回车,如果回车了下面的操作就gg了。

· 打开一个新终端(终端2),将payload注入到pwn1中。注意一定不能多敲回车。
· 在终端中输入(cat input_shellcode;cat) | ./pwn1
1002160-20170331002518508-1336895491.png

· 保持终端2中程序的运行状态。

终端1中查询pwn1进程的UID

1002160-20170331002721711-1052323934.png

gdb调试,进入对应UID端口

1002160-20170331002700414-1201275315.png
1002160-20170331003052508-405196227.png

反汇编,设置断点

1002160-20170331002913633-1513456237.png

ps:continue执行的时候,在终端2敲一下回车,终端1中的continue就会暂停在断点处了~

往上查询找到shellcode,同时找到要覆盖的地址

1002160-20170331003143039-1221402579.png
1002160-20170331003158070-1535765930.png
1002160-20170331003216414-825540398.png

要覆盖的地址(返回地址)是0xffffd32c

重新构造payload

1002160-20170331003402102-1063747409.png

成功啦!
1002160-20170331003426039-1597362087.png

return-to-libc实验

首先需要配置32位linux环境

sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev

这里简直有毒[smile],我安装的时候总是报错,上网查了一下需要先apt-get update还有apt-get upgrade一下,然后吧我就开始在终端搞了,然后吧我嫌弃网速太慢就开了个热点,当时瞟了一眼看到的是17.1M,觉得没啥嘛反正月底了。然后[smile],我就收到了流量超量提醒,用了6G,手动再见。
这个故事告诉我们,开热点做实验很容易手滑。

添加新用户

· 因为最后的是要通过看“是否取得root权限”来判断成功与否的,所以攻击对象不能是root用户,要创建一个新用户。
1002160-20170331003613399-1214342677.png

设置实验背景

· 进入32位环境,关闭地址随机化,设置zsh程序代替/bin/bash
1002160-20170331004058445-1312054114.png

1002160-20170331004033367-1975693062.png

1002160-20170331004122774-928095401.png

· 在/tmp文件夹下编写漏洞程序retlib
1002160-20170331004153539-175457601.png

· 在root用户下编译,关闭栈保护机制,并设置SET-UID
1002160-20170331004232227-1267061897.png

在/tmp文件夹下编写getenvaddr和exploit

· 用来读取环境变量的代码getenvaddr:
1002160-20170331004309727-1864619046.png
上图手滑了好几处,正确的代码应该是长这样的:
1002160-20170331004448274-2002018029.png

· 用来攻击的代码:exploit
1002160-20170331004503961-1648232678.png
1002160-20170331004540367-1391727829.png

· 也是在root用户下编译的
1002160-20170331004630320-713692371.png

获取地址并修改exploit

· 获取BIN_SH地址
1002160-20170331004736774-1711447820.png

· 进入gdb设置断点,调试运行获取system和exit地址
1002160-20170331004805227-437908500.png

1002160-20170331004859367-471422310.png

· 将上述三个地址修改入exploit.c文件
1002160-20170331004846242-644780137.png

最后~攻击,over

先运行exploit再运行retlib就可以可获得root权限,成功!
1002160-20170331004939695-528391939.png

实验感想

心好累,我的流量一去不复返了。操作中很多细节的地方需要注意,比如多一个少一个回车的问题,就很容易有影响。我第一次做的时候因为直接在pwn1的文件上做了,但是又从头来过,所以就很尴尬的是,pwn1文件已经被修改了,所以我从码云上下载了新的pwn1文件,但是权限有问题,需要先chmod u+x pwn1改一下它的权限之后才可以继续往下做,之前拷贝的老师的虚拟机应该是已经更改过权限的~这个故事告诉我们,做实验的时候还是先拷贝一下比较好,或者来个虚拟机快照之类的也不错~谁知道哪天就崩了呢。

转载于:https://www.cnblogs.com/bestixyh/p/6649378.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值