从TCP协议的原理来谈谈rst复位攻击
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手如何把全双工的连接关闭掉、滑动窗体是怎么数据传输的、TCP的flag标志位里RST在哪些情况下出现。以下我会画一些尽量简化的图来表达清楚上述几点。之后再了解下RST攻击是怎么回事。
1、TCP是什么?
TCP是在IP网络层之上的传输层协议。用于提供port到port面向连接的可靠的字节流传输。
我来用土语解释下上面的几个keyword:
port到port:IP层仅仅管数据包从一个IP到还有一个IP的传输,IP层之上的TCP层加上端口后,就是面向进程了。每一个port都能够相应到用户进程。
可靠:TCP会负责维护实际上子虚乌有的连接概念,包含收包后的确认包、丢包后的重发等来保证可靠性。因为带宽和不同机器处理能力的不同,TCP要能控制流量。
字节流:TCP会把应用进程传来的字节流数据分割成很多个数据包,在网络上发送。IP包是会失去顺序或者产生反复的,TCP协议要能还原到字节流本来面目。

从上面我用PowerPoint画的TCP协议图能够看到,标志位共同拥有六个。当中RST位就在TCP异常时出现,也是我这篇文章重点关注的地方。
2、通过三次握手建立连接
以下我通过A向B建立TCP连接来说明三次握手怎么完毕的。

为了可以说清楚以下的RST攻击。须要结合上图说说:SYN标志位、序号、滑动窗体大小。
建立连接的请求中,标志位SYN都要置为1,在这样的请求中会告知MSS段大小,就是本机希望接收TCP包的最大大小。
发送的数据TCP包都有一个序号。它是这么得来的:最初发送SYN时。有一个初始序号,依据RFC的定义,各个操作系统的实现都是与系统时间相关的。之后,序号的值会不断的添加。比方原来的序号是100,假设这个TCP包的数据有10个字节。那么下次的TCP包序号会变成110。
滑动窗体用于加速传输。比方发了一个seq=100的包。理应收到这个包的确认ack=101后再继续发下一个包。但有了滑动窗体。仅仅要新包的seq与没有得到确认的最小seq之差小于滑动窗体大小。就能够继续发。
3、滑动窗体
滑动窗体毫无疑问是用来加速传输数据的。TCP要保证“可靠”,就须要对一个数据包进行ack确认表示接收端收到。有了滑动窗体,接收端就能够等收到很多包后仅仅发一个ack包。确认之前已经收到过的多个数据包。
有了滑动窗体。发送端在发送完一个数据包后不用等待它的ack。在滑动窗体大小内能够继续发送其它数据包。
举个样例来看吧。

大家看上图,标志位为.表示全部的flag都为0。标志位P表示flag为PSH的TCP包。用于高速数据传输。
前三个包是三次握手,client表示自己的滑动窗体大小是65535(我的XP机器),server端表示滑动窗体是5840(屏幕宽了,没截出来)。
从第四个包開始,client向server发送PSH包,数据长度是520字节。server发了ack确认包。
注意此时win窗体大小发生了改变哈。以此类推。
倒数第二、三包,server在滑动窗体内连续向client发包,client发送的ack 124同一时候确认了之前的两个包。
这就是滑动窗体的功能了。
假设谈到TCP攻击就须要注意,TCP的各种实现中,在滑动窗体之外的seq会被扔掉!以下会讲这个问题。
4、四次握手的正常TCP连接关闭
先画张简单的正常关闭连接状态变迁图。

FIN标志位也看到了,它用来表示正常关闭连接。图的左边是主动关闭连接方,右边是被动关闭连接方,用netstat命令能够看到标出的连接状态。
FIN是正常关闭,它会依据缓冲区的顺序来发的,就是说缓冲区FIN之前的包都发出去后再发FIN包,这与RST不同。
5、RST标志位
RST表示复位。用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去(不像上面的FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。
TCP处理程序会在自己觉得的异常时刻发送RST包。比如,A向B发起连接,但B之上并未监听对应的port,这时B操作系统上的TCP处理程序会发RST包。
又比方,AB正常建立连接了,正在通讯时,A向B发送了FIN包要求关连接。B发送ACK后,网断了。A通过若干原因放弃了这个连接(比如进程重新启动)。
网通了后,B又開始发数据包。A收到后表示压力非常大。不知道这野连接哪来的,就发了个RST包强制把连接关了,B收到后会出现connect reset by peer错误。
6、RST攻击
A和serverB之间建立了TCP连接。此时C伪造了一个TCP包发给B,使B异常的断开了与A之间的TCP连接,就是RST攻击了。实际上从上面RST标志位的功能已经能够看出这样的攻击怎样达到效果了。
那么伪造什么样的TCP包能够达成目的呢?我们至顶向下的看。
假定C伪装成A发过去的包,这个包假设是RST包的话,毫无疑问,B将会丢弃与A的缓冲区上全部数据,强制关掉连接。
假设发过去的包是SYN包,那么,B会表示A已经发疯了(与OS的实现有关),正常连接时又来建新连接,B主动向A发个RST包。并在自己这端强制关掉连接。
这两种方式都可以达到复位攻击的效果。
似乎挺恐怖,然而关键是。怎样能伪造成A发给B的包呢?这里有两个关键因素。源port和序列号。
一个TCP连接都是四元组。由源IP、源port、目标IP、目标port唯一确定一个连接。所以。假设C要伪造A发给B的包。要在上面提到的IP头和TCP头。把源IP、源port、目标IP、目标port都填对。这里B作为server,IP和port是公开的,A是我们要下手的目标。IP当然知道,但A的源port就不清楚了,由于这可能是A随机生成的。
当然。假设可以对常见的OS如windows和linux找出生成source port规律的话,还是可以搞定的。
序列号问题是与滑动窗体相应的,伪造的TCP包里须要填序列号,假设序列号的值不在A之前向B发送时B的滑动窗体内,B是会主动丢弃的。所以我们要找到能落到当时的AB间滑动窗体的序列号。这个能够暴力解决,由于一个sequence长度是32位,取值范围0-4294967296。假设窗体大小像上图中我抓到的windows下的65535的话,仅仅须要相除,就知道最多仅仅须要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗体内。RST包是非常小的,IP头+TCP头也才40字节,算算我们的带宽就知道这实在仅仅须要几秒钟就能搞定。
那么。序列号不是问题。源port会麻烦点。假设各个操作系统不能全然随机的生成源port,或者黑客们能通过其它方式获取到source port,RST攻击易如反掌,后果非常严重。
从TCP协议的原理来谈谈rst复位攻击的更多相关文章
- TCP协议设计原理
TCP协议设计原理 最近去了解TCP协议,发现这是一个特别值得深思的协议.在本篇博客中,不会长篇大论的给大家介绍TCP协议特点.包头格式以及TCP的连接和断开等基本原理,而是会带大家深入理解为什么要这 ...
- 转 tcp协议里rst字段讲解
TCP协议的原理来谈谈rst复位攻击 http://russelltao.iteye.com/blog/1405349 几种TCP连接中出现RST的情况 https://blog.csdn.net/c ...
- [转载] TCP协议缺陷不完全记录
原文: http://www.blogjava.net/yongboy/archive/2015/05/07/424917.html tcp是一个非常复杂并且古老的协议, 之前教科书上将的很多东西应用 ...
- TCP协议详解(理论篇)
TCP协议详解(理论篇) 2012-08-20 0个评论 作者:陈立龙 收藏 我要投稿 TCP协议详解(理论篇) 1. 与UDP不同的是,TCP提供了一种面向连接 ...
- [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]
[网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...
- TCP/IP 标志位 SYN ACK RST UTG PSH FIN
三次握手:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个 SYN=1,ACK=1标志的数据包给发送端,告诉它,可以 ...
- TCP协议通讯工作原理
TCP协议通讯工作原理 一.TCP三次握手 传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议.面向连接是指一次正常的TCP传输需要通过在TCP ...
- TCP/IP协议工作原理简述
TCP/IP协议工作原理简述 // */ // ]]> TCP/IP协议工作原理简述 Table of Contents 1 概要 2 应用层 3 传输层 4 网络层 5 链路层 1 概要 ...
- TCP协议RST:RST介绍、什么时候发送RST包
TCP协议RST:RST介绍.什么时候发送RST包 RST标示复位.用来异常的关闭连接. 1. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST. 2. 而接收端收 ...
随机推荐
- Python面试题(练习二)
1.用Python实现一个二分查找的函数. data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def ...
- 老男孩全栈python学习进程表
老男孩Python高级全栈开发工程师-1 0001.开学典礼_ALEX简介 00:55:53 ☆ 0002.职业生涯_来培训的目的 01:12:29 ☆ 0003.课程目标 00:29: ...
- 零基础学习 Python 之数字与运算
写在之前 大家好,这里是零基础学习 Python 系列,在这里我将从最基本的 Python 写起,然后再慢慢涉及到高阶以及具体应用方面.我是完全自学的 Python,所以很是明白自学对于一个人的考验, ...
- learn资料
老陈的CSDN博客: http://blog.csdn.net/qq_35587839 1.memcache 和 memcached的区别:http://www.phpweblog.net/fuyon ...
- php-超全局变量
下表列出了您能够在 $_SERVER 中访问的最重要的元素: 元素/代码 描述 $_SERVER[' PHP_SELF '] 返回当前执行脚本的文件名. $_SERVER[' GATEWAY_INTE ...
- VK Cup 2016 - Qualification Round 1——B. Chat Order(试手stack+map)
B. Chat Order time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- ECharts学习总结(三)-----基本概念分析
最近一直在看ECharts相关的内容,进展却不怎么理想,特认真总结如下基础知识: 1) ECharts总体框架和其中各个部分:图类.组件.接口.基础库的具有应用方法和应该把握的细节,并通过实际的例子熟 ...
- [转] Makefile 基础 (9) —— Makefile 使用make更新函数库文件
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- SPOJ QTREE3 - Query on a tree again!
You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...
- 【NOIP2016练习】T2 跑跑步 (数论)
: 这场的难度是从高到低的 ..]of longint; n,m,i,ans:longint; function gcd(x,y:longint):longint; var r:longint; be ...