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    //查询文件的堆栈是否可执行

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

构造要注入的payload

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

payload结构为nop+shellcode+retaddr

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

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

· 打开一个新终端(终端2),将payload注入到pwn1中。注意一定不能多敲回车。
· 在终端中输入(cat input_shellcode;cat) | ./pwn1
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

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

终端1中查询pwn1进程的UID

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

gdb调试,进入对应UID端口

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

反汇编,设置断点

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

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

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

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

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

重新构造payload

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

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

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用户,要创建一个新用户。
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

设置实验背景

· 进入32位环境,关闭地址随机化,设置zsh程序代替/bin/bash
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

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

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

· 在/tmp文件夹下编写漏洞程序retlib
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

· 在root用户下编译,关闭栈保护机制,并设置SET-UID
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

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

· 用来读取环境变量的代码getenvaddr:
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc
上图手滑了好几处,正确的代码应该是长这样的:
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

· 用来攻击的代码:exploit
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

· 也是在root用户下编译的
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

获取地址并修改exploit

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

· 进入gdb设置断点,调试运行获取system和exit地址
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

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

· 将上述三个地址修改入exploit.c文件
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

最后~攻击,over

先运行exploit再运行retlib就可以可获得root权限,成功!
20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc

实验感想

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

相关文章:

  • 2021-09-05
  • 2021-09-25
  • 2021-12-01
  • 2021-07-05
  • 2021-08-15
  • 2021-09-27
  • 2021-12-24
  • 2022-01-11
猜你喜欢
  • 2022-01-24
  • 2021-06-16
  • 2021-08-01
  • 2021-09-16
  • 2021-06-06
  • 2021-10-10
相关资源
相似解决方案