NET平台下的IP欺骗和SYN Flood攻击

 

这是应用别人的文章:

摘要:  关键词:  .NET、洪水攻击、IP欺骗

Abstract: A method of IP Spoof and SYN Flood Attack based on Micosoft .NET is discussed in this article. TCP SYN Flood Attack and IP Spoof program using C# is designed for testing. The testing result is show that IP Spoof and SYN Flood Attack is serious problem based on Micosoft .NET. 

Keywords: .NETSYN Flood AttackIP Spoof

随着网络技术的发展,原始套接字在网络安全编程中应用变得更加广泛。.NET作为新的平台,用类库封装了原始套接字,同时支持Ipv6,同时也给黑客提供了新的工具。本文讨论了微软.NET平台的IP欺骗与SYNFlood攻击问题,并用C#设计实现TCP洪水攻击和IP欺骗进行实验测试,测试结果表明微软.NET平台的IP欺骗与SYNFlood攻击问题是严重的。

一、 原始套接字

Windows Sockets技术是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口,经过不断完善现已成为Windows网络编程的事实上的标准。Windows Sockets规范定义并记录了如何使用APIINTERNET协议族连接,实现相互之间的通讯。

在网络编程中可以使用套接字来进行网络通信而不需要知道底层发生的细节。但有时候需要自己生成一些定制的数据包或者功能,并希望绕开socket提供的功能。原始套接字(raw socket)满足了这样的要求。原始套接字能够根据编程需要生成自己的数据报文,包括报头和数据报本身的内容。通过原始套接字,可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。

1.       原始套接字的创建:

调用System.Net.Socket名称空间提供的SOCKET函数,在协议的类型参数中,指明为原始套接字

conn = new Socket(AddressFamily.InterNetwork, SocketType.Raw,ProtocolType.IP);

第一个参数就是INTERNET,第二个参数说明建立的是一个raw socket,它提供了IP层的链接,可以收发ICMPIGMP信息。第三个参数指明所要接收的协议包为IP包。

2.       原始套接字的属性设置:

调用System.Net.Socket名称空间提供的SetSocketOption函数,设置属性连接运行在IP层,发送和接受数据包。

conn.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.HeaderIncluded,1000);

第一个参数说明Socket运行在IP层,第二个参数说明Socket提供了IP头数据,第三个参数指定了包含选项值的LingerOption实例。

3.       原始套接字的链接:

调用System..Net.Socket命名空间提供的函数ConnectIPAddressIPEndPoint链接到指定的服务器。

private  static IPAddress  hostadd=IPAddress.Parse("210.40.7.155");//服务器IP地址

dateTimeHost = new IPEndPoint(hostadd, 8080);//端口号

conn.Connect(dateTimeHost);

4.       原始套接字的发送:

调用System..Net.Socket命名空间提供的函数Send,发送缓冲区中的数据数据信息

conn.Send(tmpBuf,tmpBuf.Length,0);

第一个参数指定发送的缓冲区名称,第二个参数提供该缓冲区大小,第三个参数指定消息发送的标志。

二、 NET架构下的System.Net.Sockets名称空间

.NET架构下,名称空间就是类的封装,每一个类都被封装到名称空间中。在.NET库当中,System是位于顶层的名称空间,别的名称空间都存在这个名称空间之下。所有对象的基类都是System名称空间内的Object类派生的。System.Net名称空间为当今网络中使用的许多协议提供了简化的编程接口。Socket类是System.Net.Sockets名称空间的一个重要类,用于实现Berkeley sockets接口。Socket类建立了INTERNET传输服务的一个受控版本,为需要对网络访问加以进一步控制的开发者实现Windows套接字接口。当一个Socket建立之后,它通过Connect方法建立和该终端的连接。数据通过SendSendTo方法发送,使用完毕之后,调用Shutdown方法使Socket失效,或者用Close方法关闭。SocketOption类为Socket定义了套接字选项(均为整数)。SocketShutdown类定义了由Shutdown方法使用的常量(均为整数)。ProtocolType类指定了Socket 类支持的协议。AddressFamily类指定了Socket类实例可以使用的地址族。SocketType类指定了Socket类实例代表的套接字类型。它们均包含在Object子层次中。

三、   IP欺骗和SYNFlood基本原理

1.  IP伪装的响应:

每个IP数据包都有一个源地址,攻击者可以伪造源地址,使攻击者的操作隐藏在其他网络行为当中,同时隐藏了攻击者的身份。这样使得目标主机的系统管理员为寻找这些伪造的IP地址而忙碌。攻击者伪装IP就是为了避免检测。目标系统的所有响应都将发至被伪装的IP地址。而响应取决于伪装数据包所用协议,目标系统能够得到所请求的服务,攻击者与目标主机之间的过滤设施,伪装的IP地址是否确实存在,目标主机与伪装IP地址之间的过滤设施等因素。对于TCP数据包,伪装请求的响应形式是有限的。当我们发送了一个设置SYN标志的伪造的TCP数据包到目标主机,如果发送到了目标主机的一个已经关闭的端口,那样目标主机将会向伪装的IP地址发送一个RST-ACK数据包。如果该地址存在,那么它会丢掉这个数据包;如果不存在,中间路由器则响应为一个ICMP目标无法到达消息,目标主机将忽略ICMP错误消息,并重发SYN-ACK数据包,直到TCP超时为止,目标系统再向伪装地址发送RET。当我们发送伪造数据包到目标主机一个打开的端口,那么则会向伪造的IP地址发送一个SYN—ACK数据包。如果地址存在,伪造的IP地址将对这个意外的SYN-ACK做出响应,并向目标主机发回一个RST数据包;如果所伪装的IP地址并不存在,中间路由器向目标主机发送一个ICMP目标无法到达数据包,目标将忽略ICMP错误消息,并重发SYN-ACK数据包,直到TCP超时为止,目标系统再向伪装地址发送RET。从以上过程可以看出,由于目标主机总想完成TCP三次握手,一个简单的伪装SYN数据包就可以生成7SYN-ACK数据包,每个SYN-ACK数据包还会生成一个ICMP主机无法到达数据包。最后还要生成一个RST数据包,同样也产生一个ICMP错误数据包。这样仅由一个伪装的源数据包就可以触发16个响应数据包,消耗了大量的网络带宽。

如果遭到攻击的主机接收到一个未知的ACK数据包,那么就向伪装的IP地址发送一个RST-ACK数据包。如果该伪装IP本来就存在,那么被伪装的主机就将把这个RST-ACK数据包丢掉;如果该伪装IP地址不存在,那么中间路由器就会向被攻击主机发送一个ICMP目标无法到达的消息。如果伪装的ACK数据包要发送到一个不存在的被攻击主机上,那么某个中间路由器就会向相应伪装IP地址对应的主机发送一个ICMP目标无法到达的消息,如果伪装的IP存在,那么被伪装的主机就将这个ICMP丢掉;如果伪装的IP不存在,中间路由器丢掉ICMP错误消息,但不会生成它自己的ICMP目标不可到达消息。

2.  SYNFlood攻击的基本原理:

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。TCP是基于连接的,为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的过程是:第一步,客户主机向服务器发送一个包含SYN标志的TCP报文初始化连接,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号,客户时间戳的值等信息;第二步,服务器在收到客户端的SYN报文后,设置ACK位,同时TCP序号被加一,这说明服务器接受了客户的连接请求,服务器将返回一个SYN+ACK的报文给客户端,表示客户端的请求被接受,ACK即确认(Acknowledgement)。第三步,客户端也设置ACK位,返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。而洪水攻击就是利用了这三次握手的信息交互特性。在TCP连接的三次握手中,假设一个客户端向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出应答SYN+ACK报文后将是无法收到客户端的ACK回应报文的,这样第三次握手将无法完成,在设计TCP时,由于考虑到数据包有可能在传输过程中丢失或传错方向,服务器端一般会重试,再次发送SYN+ACK回应报文给客户端,并等待一段时间,同时把其内存用在等待来自源地址的ACK上,这段等待时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的内存资源,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。如果服务器的TCP/IP栈不够充足,最后的结果往往是堆栈溢出崩溃,服务器端也将忙于处理攻击者伪造的TCP半连接请求而无暇顾及客户的正常连接请求,此时从正常客户的角度看来,服务器失去响应而瘫痪,这种情况被称为服务器端受到了SYN Flood攻击

四、 网络数据包的生成与发送

   要了解网络数据包的生成首先就要了解网络IPTCP包的结构。根据包结构构造一个IP包,填充自己需要的IP地址,端口地址,校验和等信息。

1. TCP报文结构:   

通常TCP首部长为20个字节,分别表示源端口地址,目的端口地址,

首部长,校验和等信息,根据报文结构定义结构体如下:

    public struct tcp_header

         {

              public static ushort SourPort;    //源端口号  

              public static ushort DestPort;    //目的端口号

              public static uint SeqNo;      //序号

              public static uint AckNo;      //确认序号

              public static byte HLen;        //首部长度(保留位)

              public static byte Flag;        //标识(保留位)

              public static uint Window;      //窗口大小

              public static ushort ChkSum;      //校验和

              public static ushort UrgPtr;  //紧急指针

            }

通过以正确的数据填充这个结构并将tcp_header.Flag赋值为2(二进制

00000010)制造一个SYNTCP报文,通过大量发送这个报文来实现SYN

Flood的效果。但是为了进行IP欺骗从而隐藏自己,也为了躲避服务器的

检查,还需要直接对IP首部进行操作。

 2.  IP报文结构:    

普通的IP首部长为20个字节,分别表示IP的协议,分组头长度,服

务类型,分组头校验,源地址,目的地址等信息。根据这个结构创建数据结构如下:

      public        struct ip_header

           {

              public static byte ver_ihl;          // 4 位版本号 +4位首部长

              public static byte tos;              //8位服务类型

              public static ushort tlen;            //16位总长度

              public static ushort identification;  //16位标识

              public static ushort flags_fo;        // 3位标志 + 13位片偏移

              public static byte ttl;              //8位生存时间

              public static byte  proto;            //8位协议

              public static ushort crc;             //16位首部检验和

              public static uint ip_src;               //32位源IP地址

              public static uint  ip_dst;               //32位目标IP地址

           }

    由于我们的IP源地址是伪造的,所以不能让系统计算IP校验和,我

们得自己填充IP首部并自己计算校验和,首先、将IP首部的校验和字段设为0;其次、计算整个IP首部(包括选项)的二进制反码的和,填充到

ip_header.crc。由于在TCP首部中不包含源地址与目标地址等信息,为了

保证TCP校验的有效性,在进行TCP校验和的计算时,需要增加一个TCP

伪首部的校验和。结构定义如下:

public struct psd_header

{

        public static uint saddr;          //源地址

        public static uint daddr;          //目的地址

        public static byte mbz;           //0

        public static byte ptcl;                   //协议类型

        public static uint tcpl;                 //TCP长度

 }

接着计算TCP首部的校验和(包括TCP伪首部),填充到tcp_header.ChkSum;到此IP包的结构体填充完成(其余各项根据需求填充),接下来就可以发送了。

3. 数据包的发送:

通过对结构体的自定义填充,建立一个完整的IP报文,将其送到缓冲区,调用Send函数不间断发送,实现洪水攻击。

conn.Send(tmpBuf,tmpBuf.Length,0);

五、 实验结果及分析

最后,用C#设计洪水攻击程序(见附录),并对指定IP主机进行攻击,利用Ethereal网络监控软件分析如下:

1)大量的TCP包被成功发出,同时本机CPU和内存资源消耗巨大,任务管理器显示CPU使用率100%

2Ethereal软件显示IP欺骗成功,大量TCP包被监控到。

3)被攻击主机利用Ethereal软件发现大量TCP包,CPU和内存资源消耗增大。

4)被攻击主机向伪装IP地址发出大量的RST-ACK数据包。

5)伪装IP地址主机发现大量的RST-ACK数据包。

结果表明微软.NET平台的IP欺骗与SYNFlood攻击问题是严重的。

你可能感兴趣的:(NET)