第十周学习总结

NMap+Wireshark

将两台电脑的虚拟机都设为桥接模式,ping测试成功后开始进行实验。
攻击方ip:192.168.1.101
防守方ip:192.168.1.22
攻击方使用nmap进行扫描:

防守方使用tcpdump抓包:

针对抓到的数据包利用Wireshark进行分析:


由抓取的数据包可以看出攻击方正在进行tcp端口扫描。

缓冲区溢出漏洞

缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
1.输入命令安装一些用于编译32位C程序的东西:

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

2.输入命令linux32/bin/bash进入32位linux环境:

3.Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:
sudo sysctl -w kernel.randomize_va_space=0

4.为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash:

sudo su
cd /bin
rm sh
ln -s zsh sh
exit


5.一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode:

本次实验的shellcode,就是以上代码的汇编版本:

6.漏洞程序
把以下代码保存为“stack.c”文件,保存到 /tmp 目录下。代码如下:

编译该程序,并设置SET-UID。命令如下:

sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit


GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。而 -z execstack 用于允许执行栈。
7.攻击程序
我们的目的是攻击刚才的漏洞程序,并通过攻击获得root权限。
把以下代码保存为“exploit.c”文件,保存到 /tmp 目录下。代码如下:


现在我们要得到shellcode在内存中的地址,输入命令:

gdb stack
disass main

结果如图:

接下来的操作:

根据语句 strcpy(buffer+100,shellcode); 我们计算shellcode的地址为 0xffffd290(十六进制)+100(十进制)=0xffffd2f4(十六进制)
现在修改exploit.c文件:将 \x??\x??\x??\x?? 修改为 \xf4\xd2\xff\xff
然后,编译exploit.c程序:

8.运行结果
先运行攻击程序exploit,再运行漏洞程序stack:

如上图,获得了root权限,攻击成功。

posted on 2017-05-07 11:39  20169319李新玉  阅读(182)  评论(0编辑  收藏  举报

导航