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 //查询文件的堆栈是否可执行
构造要注入的payload
· 在Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode
和nop+shellcode+retaddr``。因为retaddr在缓冲区的位置是固定的,shellcode可能在它前面或者后面,或者说缓冲区小就把shellcode放后面,缓冲区大就把shellcode放前面。 · 我们还是尝试对于pwn1用
nop+shellcode+retaddr`的方法
payload结构为nop+shellcode+retaddr
· 编写payload
需要注意的是:千万不能以
x0a
作为结束。因为x0a
相当于回车,如果回车了下面的操作就gg了。
· 打开一个新终端(终端2),将payload注入到pwn1中。注意一定不能多敲回车。
· 在终端中输入(cat input_shellcode;cat) | ./pwn1
· 保持终端2中程序的运行状态。
终端1中查询pwn1进程的UID
gdb调试,进入对应UID端口
反汇编,设置断点
ps:continue执行的时候,在终端2敲一下回车,终端1中的continue就会暂停在断点处了~
往上查询找到shellcode,同时找到要覆盖的地址
要覆盖的地址(返回地址)是0xffffd32c
重新构造payload
成功啦!
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用户,要创建一个新用户。
设置实验背景
· 进入32位环境,关闭地址随机化,设置zsh程序代替/bin/bash
· 在/tmp文件夹下编写漏洞程序retlib
· 在root用户下编译,关闭栈保护机制,并设置SET-UID
在/tmp文件夹下编写getenvaddr和exploit
· 用来读取环境变量的代码getenvaddr:
上图手滑了好几处,正确的代码应该是长这样的:
· 用来攻击的代码:exploit
· 也是在root用户下编译的
获取地址并修改exploit
· 获取BIN_SH地址
· 进入gdb设置断点,调试运行获取system和exit地址
· 将上述三个地址修改入exploit.c
文件
最后~攻击,over
先运行exploit再运行retlib就可以可获得root权限,成功!
实验感想
心好累,我的流量一去不复返了。操作中很多细节的地方需要注意,比如多一个少一个回车的问题,就很容易有影响。我第一次做的时候因为直接在pwn1的文件上做了,但是又从头来过,所以就很尴尬的是,pwn1文件已经被修改了,所以我从码云上下载了新的pwn1文件,但是权限有问题,需要先chmod u+x pwn1
改一下它的权限之后才可以继续往下做,之前拷贝的老师的虚拟机应该是已经更改过权限的~这个故事告诉我们,做实验的时候还是先拷贝一下比较好,或者来个虚拟机快照之类的也不错~谁知道哪天就崩了呢。