20145324王嘉澜 《网络对抗》进阶实践之 shellcode注入和Return-to-libc攻击深入
Shellcode注入
•Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址
•实验参考
•实践过程
•生成shellcode(本次使用老师的shellcode)
•运行编译
•首先安装execstack这个指令
•设置环境
参数“2”表示开启,参数“0”表示关闭
•构造要注入的payload
•选择anything+retaddr+nops+shellcode的结构构造攻击buf,先猜测返回地址所在位置,并且找到shellcode所在地址
•在终端注入这段攻击buf
•再开另外一个终端,用gdb来调试shellcode5324这个进程
•对foo函数进行反汇编
•在ret处设置断点,接着继续运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,来分析之前猜测的返回地址位置是否正确以及shellcode的地址
•shellcode代码起始地址为0xffffd2fc,所以我们将返回地址改为0xffffd300
•成功
•实践知识总结
•ps -ef | grep shellcode5324:
查找与shellcode5324有关的进程,并用-ef格式显示出来
•(gdb) attach: GDB可以对正在执行的程序进行调度,它允许开发人员中断程序并查看其状态,之后还能让这个程序正常地继续执行
•(gdb) disassemble foo: 反汇编一段内存地址
•(gdb) c: 继续执行被调试程序,直至下一个断点或程序结束,Continue的简写
•chmod u+s 文件 :对文件设置强制位,即SET-UID,可以使非文件拥有者或文件所属群组的用户具有执行该文件的权限
•echo : 在显示器上显示一段文字
•gdb -q : -q用以使得gdb不输出gdb程序的版本等信息
Return-to-libc攻击深入
•缓冲区溢出的常用攻击方法是用 shellcode 的地址来覆盖漏洞程序的返回地址,使得漏洞程序去执行存放在栈中 shellcode。为了阻止这种类型的攻击,一些操作系统使得系统管理员具有使栈不可执行的能力。这样的话,一旦程序执行存放在栈中的 shellcode 就会崩溃,从而阻止了攻击。
•不幸的是上面的保护方式并不是完全有效的,现在存在一种缓冲区溢出的变体攻击,叫做 return-to-libc 攻击。这种攻击不需要一个栈可以执行,甚至不需要一个 shellcode。取而代之的是我们让漏洞程序调转到现存的代码(比如已经载入内存的 libc 库中的 system()函数等)来实现我们的攻击。
•实验参考
•实践过程
•输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash
•初始设置
漏洞程序
•编写retlib文件并进行编译,同时将其设为 Set-UID 程序
•编写读取环境变量的程序并进行编译
攻击程序
•编写攻击代码
•用刚才的 getenvaddr 程序获得 BIN_SH 地址
•gdb 获得 system 和 exit 地址
•修改 exploit.c 文件,填上刚才找到的内存地址
•删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c
•先运行攻击程序 exploit,再运行漏洞程序 retlib,可见攻击成功,获得了 root 权限: