实验 Attacks on TCP/IP Protocols

时间:2023-03-08 17:20:44

-------

转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html

-------

1 实验目的

进行这个实验的目的是获得TCP/IP协议缺陷和基于这些缺陷的攻击的经验。在TCP/IP协议上的缺陷是一种在协议设计和实现出现的漏洞。这给我们上了很宝贵的一课,关于为什么安全应当在一开始的时候就被考虑设计,而不是在事后加入。此外,学习这些缺陷,帮助学生理解在网络安全上的挑战和为什么许多网络安全测评是必须的。TCP/IP协议的缺陷在几个不同的层次发生。

2 实验环境

三台机器的操作系统为 Ubuntu,版本号12.04。

因为实验中间虚拟机的虚拟网络连接出现问题,重新加载了网络模块,因此在任务一中使用的是表1的IP和MAC地址。任务二、三中由于改变了拓扑结构,使用的是表3的IP地址。

表1 任务一中的IP和MAC地址

A

B

C

IP

*.*.65.132

*.*.65.133

*.*.65.134

MAC

*:*:*:*:11:11

*:*:*:*:01:aa

*:*:*:*:fc:0e

表2 任务三、四中的IP和MAC地址

A

B

C

IP

*.*.47.128

*.*.47.129

*.*.47.130

MAC

*:*:*:*:11:11

*:*:*:*:01:aa

*:*:*:*:fc:0e

表3 任务二、五中的IP和MAC地址

A

B

C

IP

Eth0:*.*.220.128

Eth1:*.*.205.129

Eth0:*.*.220.129

Eth0:*.*.205.128

MAC

*:*:*:*:11:11

*:*:*:*:01:aa

*:*:*:*:fc:0e

首先安装伪造、发送数据包需要的工具netwox,语句

sudo apt-get install netwox

然后安装用于抓取查看数据包的软件wireshark,仍然使用终端安装

sudo apt-get install wireshark

Wireshark也可以在软件中心通过图形界面进行下载安装。

打开wireshark之后,在左上角出现找不到网卡的情况,如图2.1。

实验 Attacks on TCP/IP Protocols

图2.1

为了解决这个问题,我在网络上进行搜索,参考了下面网页的步骤,详细过程如图2.2、图2.3。

http://www.dickson.me.uk/2012/09/17/installing-wireshark-on-ubuntu-12-04-lts/

把下图的YOUR_USER_NAME 改为 ***(用户账号)。

实验 Attacks on TCP/IP Protocols

图2.2

实验 Attacks on TCP/IP Protocols

图2.3

重启系统之后,再打开wireshark,发现可以找到网卡。

继续安装vsftpd和openbsd-inetd。

根据实验指导书中的步骤,首先开启vsftpd,出现问题

vsftpd:unrecongnized service

Vsftpd服务没有找到,说明系统中并没有安装相应的软件包。因此,我使用如下命令来安装vsftpd服务。

sudo apt-get install vsftpd

安装到最后出现提示“vsftpd start/running, process 3283”,说明安装完成后服务已经自动启动,运行端口号3283。

继续安装openbsd-inetd,出现了安装vsftpd出现的同样的问题。解决方法与上面相同,安装openbsd-inetd服务

sudo apt-get install openbsd-inetd

安装到最后出现提示,网络超级服务没有打开。

Setting up openbsd-inetd (0.20091229-1ubuntu1) ...
* Stopping internet superserver inetd [OK]
* Not starting internet superserver : no services enabled

抱着侥幸的心理再次尝试开启openbsd-inetd服务,发现仍然找不到服务。网上查阅相关资料后得知,还需要安装一个telnetd软件包。

sudo apt-get install telnetd

安装完成之后还需要一些操作来打开这个服务。

sudo gedit /etc/inetd.conf
//添加
//telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd sudo /etc/init.d/openbsd-inetd restart
//出现
//* Restarting internet superserver inetd netstat -a | grep telnet
//出现
//tcp 0 0 *:telnet *:* LISTEN

到此为止,所有需要的实验环境配置已经完成,可以开始实验。

3 实验原理

实验是七选五,因此我选择了下面五个任务。

-------

转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html

-------

3.1 ARP欺骗

ARP缓存是ARP协议的重要的一部分。作为一个ARP协议执行结果,一旦一个在MAC地址和IP地址之间的映射被决定,这个映射就被缓存。因此,如果影射已经存在在缓存中,就没有必要再重复ARP协议。然而,因为ARP协议是无状态的,缓存可以被轻易的通过恶意的ARP信息修改。这样的一种攻击叫做ARP欺骗。

在这样一个攻击中,攻击者使用欺骗ARP信息来哄骗受害者接受一个无效的MAC-IP映射,并且在缓存中保存这个映射。取决于攻击者的目的不同,这里可能出现各种类型的后果。例如,攻击者将一个不存在的MAC地址关联受害者的默认网关的IP地址,通过此来启动一个Dos攻击。

3.2 ICMP重定向攻击

ICMP重定向被路由器用来向更新主机的路由信息,最开始只有最少的路由信息。当一台主机接收到一个ICMP重定向信息,他将会根据接收到的信息来修改路由表。因为缺少确认,如果攻击者希望受害者设置它的路由信息为一个特别形式,他们可以发送欺骗ICMP重定向信息给受害者,并且欺骗受害者修改它的路由表。

3.3 SYN洪流攻击

SYN洪流攻击是Dos攻击的一种形式,攻击者发送许多SYN请求给受害者的TCP端口,但是攻击者没有完成三次握手的意向。攻击者或者使用虚假的IP地址,或者不继续过程。在这个攻击中,攻击者可以使受害者的用于半开连接的队列溢出,例如,一个完成SYN,SYN-ACK但没有收到最后的ACK回复的连接。当这个队列满了的时候,受害者不能够在进行更多的连接。

SYN 缓存策略:SYN缓存是是对抗SYN洪流攻击的一种防御机制。如果机器检测到它正在被SYN洪流攻击,这种机制将会kick in。

3.4 在telnet和ssh连接上的TCP RST攻击

TCP RST攻击可以终止一个在两个受害者之间已经建立的TCP连接。例如,如果这里有一个在A和B之间已经建立的telnet连接,攻击者可以伪造一个A发向B的RST包,打破这个存在的连接。

3.5 ICMP盲目连接重置和源端关闭攻击

ICMP信息同样可以被用于达成连接重置攻击。为了达到这个目的,攻击者发送一条显示“硬错误”的ICMP的错误信息给TCP连接两端的任意一方。连接将会被立即中断,因为在RFC1122中主机在接收到这样一个TCMP错误包时,应当立即中断相关的连接。RFC1122定义“硬错误”为一个目的不可达且协议无效、端口无效、标志位缺失和DF位设置的ICMP错误信息

ICMP源端关闭信息被拥塞路由器用于告知TCP发送者减缓发送包的速度。攻击者可以制定这样的信息来实施对TCP发送者的拒绝服务攻击。

4 实验内容

4.1 ARP欺骗

ARP。当发送方B需要向接收方C发送一个数据时,B会从自己的ARP表中通过C的IP地址来查找相应的C的MAC地址。如果C的MAC地址不在B的ARP表中,B就向全网发广播包,要求C主机返回它的MAC地址。当B接收到C返回的MAC地址时,B就将更新它的ARP表。同时,C主机也将B主机和它对应的MAC地址记录到C的ARP表中。ARP表的更新采用牛奶原则,也就是说,ARP表将无条件接受最后一次收到的ARP包作为ARP更新的数据。鉴于此,攻击者A可以利用一些工具伪造一个ARP包,将C的IP对应的MAC地址修改为自己的MAC地址,并将这个数据包发送给B。B在更新了ARP表之后,新的发往C的数据包就会被发送到A。其流程示意如表4.1.1。

表4.1.1 ARP包的信息

源IP

源MAC

目的IP

目的MAC

正常情况

B主机广播包,请求C的MAC信息

*.*.65.133

*:*:*:*:01:aa

*.*.65.255

ff:ff:ff:ff:ff:ff

C向B返回自己的MAC信息

*.*.65.134

*:*:*:*:fc:0e

*.*.65.133

*:*:*:*:01:aa

A作为攻击机,对B和C进行ARP欺骗

B主机广播包,请求C的MAC信息

*.*.65.133

*:*:*:*:01:aa

*.*.65.255

ff:ff:ff:ff:ff:ff

C向B返回自己的MAC信息

*.*.65.134

*:*:*:*:fc:0e

*.*.65.133

*:*:*:*:01:aa

A向B返回ARP欺骗信息

*.*.65.134

*:*:*:*:11:11

*.*.65.133

*:*:*:*:01:aa

A向C返回ARP欺骗信息

*.*.65.133

*:*:*:*:11:11

*.*.65.134

*:*:*:*:fc:0e

注意,在欺骗过程中,ARP欺骗信息的包要多次重复发送,因为要保证ARP欺骗信息在正确的ARP信息之后被发送到被攻击机。

详细的实验过程如下:

查询netwox说明后得知,33号工具用于伪造ARP包。使用命令查看该工具的详细使用方法。

netwox  --help2
//之后的不同号的工具都可以用这个命令来查看使用方法及参数信息

在进行攻击之前,先在三台主机上互相ping。然后使用arp –a命令查看ARP表,图4.1.1是A的ARP表,图4.1.2是B的ARP表,图4.1.3是C的ARP表。

实验 Attacks on TCP/IP Protocols

图4.1.1 攻击机A的ARP表

实验 Attacks on TCP/IP Protocols

图4.1.2 被攻击机B的ARP表

实验 Attacks on TCP/IP Protocols

图4.1.3 被攻击机C的ARP表

之后,在三台主机全部开启的情况下,攻击机A发动攻击如图4.1.4。

实验 Attacks on TCP/IP Protocols

图4.1.4

之后在B主机上查看ARP表,发现C主机对应的MAC地址已经被更改。如图4.1.5。

实验 Attacks on TCP/IP Protocols

图4.1.5

之后,使用同样的方法,给C主机发送ARP欺骗包。

这样,B发送给C的数据将会被链路层转发到A,而C发送给B的数据也将会被链路层转发到A。但是这种情况下,A如果想插入到BC的通信间,必须要再次将收到的包进行转发,并伪装源地址。

而且,A如果想持续这种攻击,就必须保证ARP欺骗包的发送频率大于正确的ARP包的发送频率,否则被攻击机的ARP表将会被更新,且在下一个ARP欺骗信息到来之前一直保持正确的MAC--IP映射关系,在这期间,A将不能收到想得到的包。

4.2 ICMP重定向攻击

在这个任务及第五个任务中,我在虚拟机上搭建了如下网络拓扑结构,如图4.2.1。

实验 Attacks on TCP/IP Protocols

图4.2.1

在三台机器上搭建的路由指令

  A的路由配置指令

sudo ifconfig eth0 *.*.220.128 netmask 225.225.225.0

sudo ifconfig eth1 *.*.205.129 netmask 255.255.255.0

sudo route add -net *.*.220.0/ gw *.*.220.128

sudo route add -net *.*.205.0/ gw *.*.205.129

sudo sysctl -w net.ipv4,ip_forward=

  B的路由配置指令

sudo ifconfig eth0 *.*.205.128 netmask 255.255.255.0

sudo route add default gw *.*.220.128

sudo sysctl -w net.ipv4.ip_forward=

  C的路由配置指令

sudo ifconfig eth0 *.*.205.128 netmask 255.255.255.0

sudo route add default gw *.*.205.129

sudo sysctl -w net.ipv4.ip_forward=

  B的网关是*.*.220.128,C的网关是*.*.205.129。通过traceroute指令可以跟踪包经过的主机和路由器,看到详细的转发过程,这能够更好的看出网关的作用。

在我设计的ICMP重定向攻击中,我想让主机B无法联网,即B连接任何主机时,都将失败。

因此,我需要将B的网关地址改为*.*.220.0/24网段中一个未被使用的IP地址,这样,B向网络中发送的所有包,都将被发送到这个“黑洞”中,得不到回复,相当于不能连接网络。这个IP地址我选择了*.*.220.130。同时,为了不让B发现此次攻击是A发起的,要将源地址改为*.*.220.131。

使用netwox86号工具可以完成这个攻击。攻击机A指令

sudo netwox  -f "host *.*.220.129" -g *.*.220.130 -c  -i *.*.220.131

-f “host 被攻击机的IP” –g 希望对方网关修改后的IP –c 类型 –i 源IP

这个指令只有在按下ctrl+c时才会结束,否则一直发送ICMP包。

此时,在被攻击机B中使用WIRESHRK监听eth0,发现不断收到ICMP包,如图4.2.2。

实验 Attacks on TCP/IP Protocols

图4.2.2

从上图可以看出发送包的类型是ICMP,源IP地址是*.*.220.131,目标IP地址是*.*.220.129,网关地址是*.*.220.130。

4.3 SYN洪泛攻击

如果一个TCP连接没有完成三次握手,它将被放入半开连接队列,而半开连接队列有最大长度,如果连接数量达到最大容量时,新的连接就不能够被建立。SYN洪泛攻击就是通过未完成的TCP请求来试图充满半开连接队列,使得正常的连接不能够被建立,达到攻击的效果。

在这个实验中,使用telnet服务作为攻击目标,在23号端口发起SYN洪泛攻击。

首先,尝试在主机B和C之间建立telnet连接,说明网络联通。主机B远程登录主机C的账户,如图4.3.1。

实验 Attacks on TCP/IP Protocols

图4.3.1

在主机C上,通过命令netstat –na | grep tcp 命令查看当前的TCP相关端口的状态,发现23号端口处于联通状态,如图4.3.2标黄部分。

实验 Attacks on TCP/IP Protocols

图4.3.2

在主机C上查看C的半开连接队列的最大长度为128,缓冲保护开启。如图4.3.3。

实验 Attacks on TCP/IP Protocols

图4.3.3

在主机B中使用exit命令断开与C的telnet连接。之后在主机A中使用netwox76号工具发动针对主机C23号端口的SYN攻击。

sudo netwox  -i "*.*.47.130" -p ""

注意,这个命令会一直执行直到按ctrl+C停止。

回到主机B中,尝试与主机C进行telnet远程连接,如图4.3.4。

实验 Attacks on TCP/IP Protocols

图4.3.4

从上图及实验过程可以看出,虽然连接的速度很慢,但是是可以连接上的。我在主机B上开启了两个终端,同时试图进行telnet连接。

到主机C中查看端口连接情况,如图4.3.5和图4.3.6。发现,队列中充斥着大量半开连接,目的端口号都是C机的23号端口,但是源主机IP和端口却不一致,而且端口号都是不常用端口,可以判断出,这极有可能是一次SYN攻击。

实验 Attacks on TCP/IP Protocols

图4.3.5

实验 Attacks on TCP/IP Protocols

图4.3.6

从第二张图可以看出,大部分的连接都是SYN半开连接,但是在最后有一个B主机的成功完成的telnet连接,图中黄色部分。

然后,在主机C中关闭缓冲保护,如图4.3.7。

实验 Attacks on TCP/IP Protocols

图4.3.7

在主机A上重复SYN洪泛攻击。在主机B上尝试连接主机C。如图4.3.8。

实验 Attacks on TCP/IP Protocols

图4.3.8

发现一直停留在尝试连接这一步,说明此时已经不能够访问主机C的23号端口了。

在主机C中查看端口连接情况,如图4.3.9。

实验 Attacks on TCP/IP Protocols

图4.3.9

发现全部是未知主机和不常用端口建立的SYN半开连接,没有B主机的任何连接存在。

4.4在telnet和ssh连接上的TCP RST攻击

首先完成主机B与主机C的telnet连接,如图4.4.1。

实验 Attacks on TCP/IP Protocols

图4.4.1

在C上查看端口连接情况,如图4.4.2,已经完成主机B与主机C23端口的连接。

实验 Attacks on TCP/IP Protocols

图4.4.2

这时,在主机A中通过netwox78号工具发起针对B主机的RST攻击。

sudo netwox  -i "*.*.47.129"

回到B主机中,发现没有什么变化,但是当回车之后,出现连接已经被其他主机断开,并退回到主机B的账户下(我的主机B和主机C中的账户都是chengli*,因此在图片中分不大清)。如图4.4.3。

实验 Attacks on TCP/IP Protocols

图4.4.3

在主机C中查看此时的连接情况,如图4.4.4。可以看出BC主机的23端口的连接已经被断开,处于监听状态。

实验 Attacks on TCP/IP Protocols

图4.4.4

注意,此时主机A的攻击并没有停止。

回到主机B中,再次尝试连接主机C,发现最开始是连接上了,但是还没来得及显示后续内容,连接就被中断。如图4.4.5。

实验 Attacks on TCP/IP Protocols

图4.4.5

4.5 ICMP盲目连接重置和源端关闭攻击

实验中使用的是任务4.2中的拓扑结构及IP地址。

首先在B和C见建立telnet连接

A是攻击机,A试图伪造一个ICMP错误信息的包,发送给B或C(实验中发送给了B),来终止BC见的连接。

sudo netwox  -f "host *.*.220.129 and tcp port 23" -i *.*.205.128

接下来,在C主机中查看端口连接信息,如图4.5.1,发现连接并没有终止。

实验 Attacks on TCP/IP Protocols

图4.5.1

在B机中查看wireshark抓取的eth0的流量,如图4.5.2,发现ICMP错误信息包B收到了。

实验 Attacks on TCP/IP Protocols

图4.5.2

出现这种情况的原因可能是在高版本的ubuntu中已经制订了一些策略来防止这些攻击。

-------

转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html

-------

5 实验思考问题

5.1 ISN 初始序列号

当TCP连接正在建立时,服务器用一个唯一的32位初始序列号的应答报文来确认用户请求,TCP协议规范要求美妙更换序列号25万次,但大多数实际系统更换频率远小于此,而且下一次更换的数字往往是可预测的[1]。这个增加值在许多版本比较旧的操作系统中都是一个常量,在FreeBSD4.3中是125000次每秒[2],PacketShaper的序列号每秒增加128000,每次连接增加64000[3]。还能够找到很多相似的例子。

所以初始序列号的可预测性是其增加值固定、更新频率固定所导致的。

现在有很多ISN的生成算法,试图通过增加ISN的随机性来解决这个问题。RFC1948中提出了一个较好的初始化序列号ISN随机生成算法:ISN = M + F(localhost, localport, remotehost, remoteport)。M是一个计时器,这个计时器每隔4毫秒加1。F是一个Hash算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。

但是,严格符合RFC1948的ISN生成方法有一个潜在的危机:一个攻击者如果以前合法拥有过一个IP地址,他通过对ISN进行大量的采样,可以估计到随后的ISN的变化规律。在以后,尽管这个IP地址已经不属于此攻击者,但他仍然可以通过猜测ISN来进行IP欺骗。ISN自身的值是按照一个常数值稳定增加的,所以F()需要保持相对的稳定性。而根据Bellovin 所提出的,这是一个系统特定的值,这些值并不会经常变。

如果Hash函数在实现上存在漏洞,攻击者就可以通过大量的采样,来分析,其中,源IP地址,源端口,目的IP地址,目的端口都是不变的,这减少了攻击者分析的难度。

Linux TCP的ISN生成器避免了这一点。它每5分钟计算一次值,把泄漏的风险降到了最低。

有一个方法可以做得更好,取M = M + R(t),ISN = M + F(sip, sport, dip, dport, )。其中,R(t) 是一个关于时间的随机函数。很有必要这样做,因为它使攻击者猜测ISN的难度更大了(弱点在理论上还是存在的)。

构造TCP ISN生成器的一些更直接的方法是:简单地选取一些随机数作为ISN。这就是给定一个32位的空间,指定ISN = R(t)。(假设R()是完全的非伪随机数生成函数)。固然,对于完全随机的ISN值,攻击者猜测到的可能性是1/232,随之带来的一个问题是ISN空间里面的值的互相重复。这违反了许多RFC(RFC 793, RFC 1185, RFC 1323, RFC1948等)的假设----ISN单调增加。这将对TCP协议的稳定性和可靠性带来不可预计的问题。

其它一些由Niels Provos(来自OpenBSD 组织)结合完全随机方法和RFC 1948解决方案:ISN = ((PRNG(t)) << 16) + R(t)。其中,PRNG(t) 是一组随机指定的连续的16位数字  0x00000000 -- 0xffff0000,R(t) 是16位随机数生成器(它的高位msb设成0)0x00000000 -- 0x0000ffff。上面的公式被用于设计OpenBsd的ISN生成器,相关的源代码可以从下面的网址获得http://www.openbsd.org/cgi-bin/cvsweb/src/sys/netinet/tcp_subr.c。

Provos的实现方法有效地生成了一组在给定时间内的不会重复的ISN的值,每两个ISN值都至少相差32K,这不但避免了随机方法造成的ISN的值的冲突,而且避免了因为哈希函数计算带来的性能上的下降,但是,它太依赖于系统时钟,一旦系统时钟状态给攻击者知道了,就存在着系统的全局ISN状态泄密的危机。[4]

5.2 TCP窗口长度

为了限制任一时刻可发送的数据量,并为接收端提供流量控制,TCP 对等方使用窗口实现这些目的。该窗口是接收端允许发送端发送的字节流的数据范围。发送端只能发送位于窗口内的字节流中的字节。该窗口随着发送端的出站字节流和接收端的入站字节流而滑动。为了表示接收窗口的大小,TCP 报头包含了一个 16 位的“窗口”字段。接收窗口是用于控制可从发送端传送给接收端的未确认数据数量的窗口。

为了提供可适应高速传输路径的更大窗口尺寸,RFC 1323定义了允许接收端通告大于 65,535 字节的窗口大小的窗口缩放。“TCP 窗口缩放”选项包括一个窗口缩放因子,该因子与 TCP 报头中的 16 位窗口字段结合时,可以将接收窗口大小最大增加到 1GB。

5.3 源端口号

在网上,这方面的资料不是很多。从我阅读的资料的信息来看,源端口可预测与不可预测是这样的:

A试图通过X连接到B。则当连接到B时,A必须使用可预测可知的端口来确保A继续按照X能预测的方式来分配端口。AX之间建立两个连接,如果X收到的A的端口号是连续的,或者有一定的规律,则源端口是可预测的。否则,不可预测。同样X要用同样的方法对B进行检测。如果尝试了两种端口预测方法后,X不能可靠地预测A分配的端口,这时X必须假定A是随机的分配端口。之后就可以用协议进行AXB的连接了。这一点在NAT上被使用。[5]

6 实验总结

这个实验让我学会了netwox工具的使用方法,加深了对Dos等类型的攻击的理解,对linux系统中的一些防御这类攻击的策略有了一定的认识。

除此之外,我对ubuntu的网络路由配置,进行学习,,并选择搭建了一个合适的网络拓扑结构。

这次实验的大部分任务都完成的比较顺利,但是在几个攻击上始终没有出现理想的效果。开始时以为是自己的指令有问题,或者是环境哪里没配置对。后来通过反复的学习、比较,查找相关资料,发现是ubuntu已经有预防这类攻击的策略,因此我能够收到包,但是相关内容并没有被改变。

和上一个实验一样,我会把报告修改之后放在博客中,因为我觉得里面的一些小问题我还是不太明白,需要保留下来,以后研究学习一下。


[1] 吕艳丽,李肖坚.初始序列号生成算法的安全性研究.计算机研究与发展,2005,42(11);1940-1945

[2] 黄兆勤. 关于TCP/IP序列号生成方法的研究.http://blog.sina.com.cn/s/blog_4b5039210100gku7.html.

[3] 连天科技.Packeteer
PacketShaper TCP协议栈可预测初始序列号漏洞.http://www.ltsec.com/show.aspx?id=745&cid=37.

[4] 渗透与攻击.http://www.cnblogs.com/justwannaloveyou/archive/2010/12/03/1895097.html.

[5] 参考学习文章:P2P 之 TCP穿透NAT的原理,P2P穿透UDP/TCP原理

-------

转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html

-------