网络攻击的一种,以太网的MTU一般为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷部分预留是1500-1472字节,如果数据部分大于1472字节,就会出现分片现象,当数据报被分片后,每个片的总长度值要改为该片的长度值,网络攻击者利用这一现象,到达目的主机后在IP层重组,对计算机信息进行窃取。

怎么解决ARP攻击、DDoS攻击、IP分片攻击?

只要你局域网内的计算机保护得比较好的话,一般都不会发生的。先说下ARP攻击举例吧(原理网上很多,可以自己搜索下),一般情况下发起ARP攻击者会冒充网关(也就是你们数据的出口)制造并发送无数条arp回应包,告诉其他主机你到网关的MAC地址就是我这个攻击者的MAC地址(因为局域网内是首先靠MAC寻址的),这时其他主机发起数据连接时,就会将数据的目标MAC地址填入攻击者的MAC地址,而不是正常网关的MAC地址,这样其他主机的数据流量都会发送的攻击者主机上。攻击者就可以监控到你的数据流,也能控制你的数据流是否转发到网关上去。arp攻击防护的话,现在的杀毒软件都arp保护模块,其原理也就是在你的网卡上面把的网关的IP地址与网关正确MAC地址绑定,你自己也可以手工添加在MDOS下arp -s 目标IP 目标MAC。如果你的交换机是智能交换机的话,交换机上就可以开启ARP保护功能。总的来说,arp攻击是能很好的防御的!现在说DDOS攻击,通俗一点,就是对你的服务器或者路由器,你自己用的电脑发送大量的TCP,UDP,ICMP包(在这些里面数据包里头又可以衍生出多种攻击模式),堵塞你的网卡,使你的电脑,服务器,无法响应正常的数据包。举例来说吧:在发起TCP连接时,正常连接时,客户机会发起TCP连接请求(SYN),目标主机会回复并确认客户机的连接请求(ACK),并同时发送请求包(SYN+ACK),客户机收到后会回复确认,这样TCP连接就建立起来。攻击者就会应用这一点,向目标主机发起大量的虚假源地址的TCP连接请求包(SYN),然后目标主机就会对这些虚假源地址回复确认并同时发送请求包。但此时由于源地址是虚假的,目标主机根本就无法收到确认包。因为TCP连接有个超时过程,在没收到确认包时会不断的重发回复确认包,直接超时!这样攻击数据包一多,我们的目标主机就根本没有资源回复正常的数据包,并且大量消耗其CPU使用资源。这也就是传统所说的TCP半开连接攻击!除了这个外还有TCP全连接攻击,就是启用大量的主机与目标机器产生TCP全连接,造成目标主机TCP连接队列溢出,然后崩溃!DDOS攻击很多种,这只是一部分,一般防御手法就是隐藏起你需要保护的服务器或者主机,比如防火墙,有防火墙的隔离的情况下,TCP连接时,发起者均不会直接与我们要保护的主机发生关系。他先与防火墙建立起连接,然后防火墙在与我们要保护的主机建立连接。而且防火墙本身会监测DDOS攻击,会自动废除这些连接。IP分片攻击,先说正常的IP分片,目前我们网络中数据包有一个大小的限制,也就是MTU值,MTU最大也就1500,当我们发送出去的数据包超过此数值,则会对此数据进行分片,记录好分片的位置(也就是偏移量)然后在传输出去,达到目的主机之后通过“分片之间偏移量”重新组合成一个完成的数据包。IP分片攻击就是利用这点,在你发起大量的IP分片时,而这些分片之间是毫无关系,或者分片的偏移量是经过调整的。这样我们的主机会消耗大量的CPU来重组这些分片,重组完成之后发现是错误的数据包而又丢弃!如果这种数据包一多,系统就无法处理,导致死机!我们防护一般是也是通过防火墙,防火墙上可以限制IP分片每秒的流量,或者是完成deny掉。当然在windows系统上打上最新的补丁,自定义IP安全策略,设置“碎片检查”。

网络攻击器的原理是什么?是怎么向固定的ip地址发起进攻的?

常见网络攻击原理
1.1 TCP SYN拒绝服务攻击
一般情况下,一个TCP连接的建立需要经过三次握手的过程,即:
1、 建立发起者向目标计算机发送一个TCP SYN报文;
2、 目标计算机收到这个SYN报文后,在内存中创建TCP连接控制块(TCB),然后向发起者回送一个TCP ACK报文,等待发起者的回应;
3、 发起者收到TCP ACK报文后,再回应一个ACK报文,这样TCP连接就建立起来了。
利用这个过程,一些恶意的攻击者可以进行所谓的TCP SYN拒绝服务攻击:
1、 攻击者向目标计算机发送一个TCP SYN报文;
2、 目标计算机收到这个报文后,建立TCP连接控制结构(TCB),并回应一个ACK,等待发起者的回应;
3、 而发起者则不向目标计算机回应ACK报文,这样导致目标计算机一致处于等待状态。
可以看出,目标计算机如果接收到大量的TCP SYN报文,而没有收到发起者的第三次ACK回应,会一直等待,处于这样尴尬状态的半连接如果很多,则会把目标计算机的资源(TCB控制结构,TCB,一般情况下是有限的)耗尽,而不能响应正常的TCP连接请求。
1.2 ICMP洪水
正常情况下,为了对网络进行诊断,一些诊断程序,比如PING等,会发出ICMP响应请求报文(ICMP ECHO),接收计算机接收到ICMP ECHO后,会回应一个ICMP ECHO Reply报文。而这个过程是需要CPU处理的,有的情况下还可能消耗掉大量的资源,比如处理分片的时候。这样如果攻击者向目标计算机发送大量的ICMP ECHO报文(产生ICMP洪水),则目标计算机会忙于处理这些ECHO报文,而无法继续处理其它的网络数据报文,这也是一种拒绝服务攻击(DOS)。
1.3 UDP洪水
原理与ICMP洪水类似,攻击者通过发送大量的UDP报文给目标计算机,导致目标计算机忙于处理这些UDP报文而无法继续处理正常的报文。
1.4 端口扫描
根据TCP协议规范,当一台计算机收到一个TCP连接建立请求报文(TCP SYN)的时候,做这样的处理:
1、 如果请求的TCP端口是开放的,则回应一个TCP ACK报文,并建立TCP连接控制结构(TCB);
2、 如果请求的TCP端口没有开放,则回应一个TCP RST(TCP头部中的RST标志设为1)报文,告诉发起计算机,该端口没有开放。
相应地,如果IP协议栈收到一个UDP报文,做如下处理:
1、 如果该报文的目标端口开放,则把该UDP报文送上层协议(UDP)处理,不回应任何报文(上层协议根据处理结果而回应的报文例外);
2、 如果该报文的目标端口没有开放,则向发起者回应一个ICMP不可达报文,告诉发起者计算机该UDP报文的端口不可达。
利用这个原理,攻击者计算机便可以通过发送合适的报文,判断目标计算机哪些TCP或UDP端口是开放的,过程如下:
1、 发出端口号从0开始依次递增的TCP SYN或UDP报文(端口号是一个16比特的数字,这样最大为65535,数量很有限);
2、 如果收到了针对这个TCP报文的RST报文,或针对这个UDP报文的ICMP不可达报文,则说明这个端口没有开放;
3、 相反,如果收到了针对这个TCP SYN报文的ACK报文,或者没有接收到任何针对该UDP报文的ICMP报文,则说明该TCP端口是开放的,UDP端口可能开放(因为有的实现中可能不回应ICMP不可达报文,即使该UDP端口没有开放)。
这样继续下去,便可以很容易的判断出目标计算机开放了哪些TCP或UDP端口,然后针对端口的具体数字,进行下一步攻击,这就是所谓的端口扫描攻击。
1.5 分片IP报文攻击
为了传送一个大的IP报文,IP协议栈需要根据链路接口的MTU对该IP报文进行分片,通过填充适当的IP头中的分片指示字段,接收计算机可以很容易的把这些IP分片报文组装起来。
目标计算机在处理这些分片报文的时候,会把先到的分片报文缓存起来,然后一直等待后续的分片报文,这个过程会消耗掉一部分内存,以及一些IP协议栈的数据结构。如果攻击者给目标计算机只发送一片分片报文,而不发送所有的分片报文,这样攻击者计算机便会一直等待(直到一个内部计时器到时),如果攻击者发送了大量的分片报文,就会消耗掉目标计算机的资源,而导致不能相应正常的IP报文,这也是一种DOS攻击。
1.6 SYN比特和FIN比特同时设置
在TCP报文的报头中,有几个标志字段:
1、 SYN:连接建立标志,TCP SYN报文就是把这个标志设置为1,来请求建立连接;
2、 ACK:回应标志,在一个TCP连接中,除了第一个报文(TCP SYN)外,所有报文都设置该字段,作为对上一个报文的相应;
3、 FIN:结束标志,当一台计算机接收到一个设置了FIN标志的TCP报文后,会拆除这个TCP连接;
4、 RST:复位标志,当IP协议栈接收到一个目标端口不存在的TCP报文的时候,会回应一个RST标志设置的报文;
5、 PSH:通知协议栈尽快把TCP数据提交给上层程序处理。
正常情况下,SYN标志(连接请求标志)和FIN标志(连接拆除标志)是不能同时出现在一个TCP报文中的。而且RFC也没有规定IP协议栈如何处理这样的畸形报文,因此,各个操作系统的协议栈在收到这样的报文后的处理方式也不同,攻击者就可以利用这个特征,通过发送SYN和FIN同时设置的报文,来判断操作系统的类型,然后针对该操作系统,进行进一步的攻击。
1.7 没有设置任何标志的TCP报文攻击
正常情况下,任何TCP报文都会设置SYN,FIN,ACK,RST,PSH五个标志中的至少一个标志,第一个TCP报文(TCP连接请求报文)设置SYN标志,后续报文都设置ACK标志。有的协议栈基于这样的假设,没有针对不设置任何标志的TCP报文的处理过程,因此,这样的协议栈如果收到了这样的报文,可能会崩溃。攻击者利用了这个特点,对目标计算机进行攻击。
1.8 设置了FIN标志却没有设置ACK标志的TCP报文攻击
正常情况下,ACK标志在除了第一个报文(SYN报文)外,所有的报文都设置,包括TCP连接拆除报文(FIN标志设置的报文)。但有的攻击者却可能向目标计算机发送设置了FIN标志却没有设置ACK标志的TCP报文,这样可能导致目标计算机崩溃。
1.9 死亡之PING
TCP/IP规范要求IP报文的长度在一定范围内(比如,0-64K),但有的攻击计算机可能向目标计算机发出大于64K长度的PING报文,导致目标计算机IP协议栈崩溃。
1.10 地址猜测攻击
跟端口扫描攻击类似,攻击者通过发送目标地址变化的大量的ICMP ECHO报文,来判断目标计算机是否存在。如果收到了对应的ECMP ECHO REPLY报文,则说明目标计算机是存在的,便可以针对该计算机进行下一步的攻击。
1.11 泪滴攻击
对于一些大的IP包,需要对其进行分片传送,这是为了迎合链路层的MTU(最大传输单元)的要求。比如,一个4500字节的IP包,在MTU为1500的链路上传输的时候,就需要分成三个IP包。
在IP报头中有一个偏移字段和一个分片标志(MF),如果MF标志设置为1,则表面这个IP包是一个大IP包的片断,其中偏移字段指出了这个片断在整个IP包中的位置。例如,对一个4500字节的IP包进行分片(MTU为1500),则三个片断中偏移字段的值依次为:0,1500,3000。这样接收端就可以根据这些信息成功的组装该IP包。
如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为0,1300,3000。这就是所谓的泪滴攻击。
1.12 带源路由选项的IP报文
为了实现一些附加功能,IP协议规范在IP报头中增加了选项字段,这个字段可以有选择的携带一些数据,以指明中间设备(路由器)或最终目标计算机对这些IP报文进行额外的处理。
源路由选项便是其中一个,从名字中就可以看出,源路由选项的目的,是指导中间设备(路由器)如何转发该数据报文的,即明确指明了报文的传输路径。比如,让一个IP报文明确的经过三台路由器R1,R2,R3,则可以在源路由选项中明确指明这三个路由器的接口地址,这样不论三台路由器上的路由表如何,这个IP报文就会依次经过R1,R2,R3。而且这些带源路由选项的IP报文在传输的过程中,其源地址不断改变,目标地址也不断改变,因此,通过合适的设置源路由选项,攻击者便可以伪造一些合法的IP地址,而蒙混进入网络。
1.13 带记录路由选项的IP报文
记录路由选项也是一个IP选项,携带了该选项的IP报文,每经过一台路由器,该路由器便把自己的接口地址填在选项字段里面。这样这些报文在到达目的地的时候,选项数据里面便记录了该报文经过的整个路径。
通过这样的报文可以很容易的判断该报文经过的路径,从而使攻击者可以很容易的寻找其中的攻击弱点。
1.14 未知协议字段的IP报文
在IP报文头中,有一个协议字段,这个字段指明了该IP报文承载了何种协议 ,比如,如果该字段值为1,则表明该IP报文承载了ICMP报文,如果为6,则是TCP,等等。目前情况下,已经分配的该字段的值都是小于100的,因此,一个带大于100的协议字段的IP报文,可能就是不合法的,这样的报文可能对一些计算机操作系统的协议栈进行破坏。
1.15 IP地址欺骗
一般情况下,路由器在转发报文的时候,只根据报文的目的地址查路由表,而不管报文的源地址是什么,因此,这样就 可能面临一种危险:如果一个攻击者向一台目标计算机发出一个报文,而把报文的源地址填写为第三方的一个IP地址,这样这个报文在到达目标计算机后,目标计算机便可能向毫无知觉的第三方计算机回应。这便是所谓的IP地址欺骗攻击。
比较著名的SQL Server蠕虫病毒,就是采用了这种原理。该病毒(可以理解为一个攻击者)向一台运行SQL Server解析服务的服务器发送一个解析服务的UDP报文,该报文的源地址填写为另外一台运行SQL Server解析程序(SQL Server 2000以后版本)的服务器,这样由于SQL Server 解析服务的一个漏洞,就可能使得该UDP报文在这两台服务器之间往复,最终导致服务器或网络瘫痪。
1.16 WinNuke攻击
NetBIOS作为一种基本的网络资源访问接口,广泛的应用于文件共享,打印共享,进程间通信(IPC),以及不同操作系统之间的数据交换。一般情况下,NetBIOS是运行在LLC2链路协议之上的,是一种基于组播的网络访问接口。为了在TCP/IP协议栈上实现NetBIOS,RFC规定了一系列交互标准,以及几个常用的TCP/UDP端口:
139:NetBIOS会话服务的TCP端口;
137:NetBIOS名字服务的UDP端口;
136:NetBIOS数据报服务的UDP端口。
WINDOWS操作系统的早期版本(WIN95/98/NT)的网络服务(文件共享等)都是建立在NetBIOS之上的,因此,这些操作系统都开放了139端口(最新版本的WINDOWS 2000/XP/2003等,为了兼容,也实现了NetBIOS over TCP/IP功能,开放了139端口)。
WinNuke攻击就是利用了WINDOWS操作系统的一个漏洞,向这个139端口发送一些携带TCP带外(OOB)数据报文,但这些攻击报文与正常携带OOB数据报文不同的是,其指针字段与数据的实际位置不符,即存在重合,这样WINDOWS操作系统在处理这些数据的时候,就会崩溃。
1.17 Land攻击
LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文(连接建立请求报文)而完成对目标计算机的攻击。与正常的TCP SYN报文不同的是,LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标计算机的IP地址。这样目标计算机接收到这个SYN报文后,就会向该报文的源地址发送一个ACK报文,并建立一个TCP连接控制结构(TCB),而该报文的源地址就是自己,因此,这个ACK报文就发给了自己。这样如果攻击者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,最终不能正常服务。这也是一种DOS攻击。

什么是碎片攻击呢?谢谢

常见IP碎片攻击详解
本文简单介绍了IP分片原理,并结合Snort抓包结果详细分析常见IP碎片
攻击的原理和特征,最后对阻止IP碎片攻击给出一些建议。希望对加深理解IP协议和一
些DoS攻击手段有所帮助。
1. 为什么存在IP碎片
-=-=-=-=-=-=-=-=-=-=-=
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不
同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看
这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据
包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传
输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,
数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字
节,就会出现分片现象。
IP首部包含了分片和重组所需的信息:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |R|DF|MF| Fragment Offset
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|<-------------16-------------->|<--3-->|<---------13---------->|
Identification:发送端发送的IP数据包标识字段都是一个唯一值,该值
在分片时被复制到每个片中。
R:保留未用。
DF:Don‘t Fragment,“不分片”位,如果将这一比特置1 ,IP层将不对
数据报进行分片。
MF:More Fragment,“更多的片”,除了最后一片外,其他每个组成数
据报的片都要把该比特置1。
Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是
该值乘以8。
另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
每一IP分片都各自路由,到达目的主机后在IP层重组,请放心,首部中的
数据能够正确完成分片的重组。你不禁要问,既然分片可以被重组,那么所谓的碎片攻
击是如何产生的呢?
2. IP碎片攻击
-=-=-=-=-=-=-=-=-=-=-=
IP首部有两个字节表示整个IP数据包的长度,所以IP数据包最长只能为
0xFFFF,就是65535字节。如果有意发送总长度超过65535的IP碎片,一些老的系统内核
在处理的时候就会出现问题,导致崩溃或者拒绝服务。另外,如果分片之间偏移量经过
精心构造,一些系统就无法处理,导致死机。所以说,漏洞的起因是出在重组算法上。
下面我们逐个分析一些著名的碎片攻击程序,来了解如何人为制造IP碎片来攻击系统。
3. ping o‘ death
-=-=-=-=-=-=-=-=-=-=-=
ping o‘ death是利用ICMP协议的一种碎片攻击。攻击者发送一个长度超
过65535的Echo Request数据包,目标主机在重组分片的时候会造成事先分配的65535字
节缓冲区溢出,系统通常会崩溃或挂起。ping不就是发送ICMP Echo Request数据包的
吗?让我们尝试攻击一下吧!不管IP和ICMP首部长度了,数据长度反正是多多益善,就
65535吧,发送一个包:
# ping -c 1 -s 65535 192.168.0.1
Error: packet size 65535 is too large. Maximum is 65507
不走运,看来Linux自带的ping不允许我们做坏事。:(
65507是它计算好的:65535-20-8=65507。Win2K下的ping更抠门,数据只
允许65500大小。所以你必须找另外的程序来发包,但是目前新版本的操作系统已经搞
定这个缺陷了,所以你还是继续往下阅读本文吧。
顺便提一下,记得99年有“爱国主义黑客”(“红客”的前辈)发动全国
网民在某一时刻开始ping某美国站点,试图ping死远程服务器。这其实是一种ping
flood攻击,用大量的Echo Request包减慢主机的响应速度和阻塞目标网络,原理和
ping o‘ death是不一样的,这点要分清楚。
4. jolt2
-=-=-=-=-=-=-=-=-=-=-=
jolt2.c是在一个死循环中不停的发送一个ICMP/UDP的IP碎片,可以使
Windows系统的机器死锁。我测试了没打SP的Windows 2000,CPU利用率会立即上升到
100%,鼠标无法移动。
我们用Snort分别抓取采用ICMP和UDP协议发送的数据包。
发送的ICMP包:
01/07-15:33:26.974096 192.168.0.9 -> 192.168.0.1
ICMP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
Frag Offset: 0x1FFE Frag Size: 0x9
08 00 00 00 00 00 00 00 00 .........
发送的UDP包:
01/10-14:21:00.298282 192.168.0.9 -> 192.168.0.1
UDP TTL:255 TOS:0x0 ID:1109 IpLen:20 DgmLen:29
Frag Offset: 0x1FFE Frag Size: 0x9
04 D3 04 D2 00 09 00 00 61 ........a
从上面的结果可以看出:
* 分片标志位MF=0,说明是最后一个分片。
* 偏移量为0x1FFE,计算重组后的长度为 (0x1FFE * 8) + 29 = 65549 >
65535,溢出。
* IP包的ID为1109,可以作为IDS检测的一个特征。
* ICMP包:
类型为8、代码为0,是Echo Request;
校验和为0x0000,程序没有计算校验,所以确切的说这个ICMP包是非法
的。
* UDP包:
目的端口由用户在命令参数中指定;
源端口是目的端口和1235进行OR的结果;
校验和为0x0000,和ICMP的一样,没有计算,非法的UDP。
净荷部分只有一个字符‘a‘。
jolt2.c应该可以伪造源IP地址,但是源程序中并没有把用户试图伪装的
IP地址赋值给src_addr,不知道作者是不是故意的。
jolt2的影响相当大,通过不停的发送这个偏移量很大的数据包,不仅死
锁未打补丁的Windows系统,同时也大大增加了网络流量。曾经有人利用jolt2模拟网络
流量,测试IDS在高负载流量下的攻击检测效率,就是利用这个特性。
5. teardrop
-=-=-=-=-=-=-=-=-=-=-=
teardrop也比较简单,默认发送两个UDP数据包,就能使某些Linux内核崩
溃。Snort抓取的结果如下:
第一个:
01/08-11:42:21.985853 192.168.0.9 -> 192.168.0.1
UDP TTL:64 TOS:0x0 ID:242 IpLen:20 DgmLen:56 MF
Frag Offset: 0x0 Frag Size: 0x24
A0 A8 86 C7 00 24 00 00 00 00 00 00 00 00 00 00
.....$..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
................
00 00 00 00 ....
* MF=1,偏移量=0,分片IP包的第一个。
* 结构图:
|<-------20-------->|<------8------>|<---------------28---------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | UDP | Data
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
第二个:
01/08-11:42:21.985853 192.168.0.9 -> 192.168.0.1
UDP TTL:64 TOS:0x0 ID:242 IpLen:20 DgmLen:24
Frag Offset: 0x3 Frag Size: 0x4
A0 A8 86 C7 ....
* MF=0,偏移量=0x3,偏移字节数为 0x3 * 8 = 24,最后一个分片。
* 结构图:
|<-------20-------->|<--4-->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
如果修改源代码,第二片IP包的偏移量也可以为0x4,偏移字节数就是
0x4 * 8 = 32。
下面的结构图表示了接收端重组分片的过程,分别对应于偏移字节数为24
和32两种情况:
|<-------20-------->|<------8------>|<---------------28---------------->|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | UDP | Data
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +-+-+-+-+
|<------------- 24 ------------->| Data |
| +-+-+-+-+
|<--4-->|
|
|
+-+-+-+-+
|<-------------------
32 ------------------>| Data |
|
+-+-+-+-+
|<--4-->|
可以看出,第二片IP包的偏移量小于第一片结束的位移,而且算上第二片
IP包的Data,也未超过第一片的尾部,这就是重叠现象(overlap)。老的Linux内核
(1.x - 2.0.x)在处理这种重叠分片的时候存在问题,WinNT/95在接收到10至50个
teardrop分片时也会崩溃。你可以阅读teardrop.c的源代码来了解如何构造并发送这种
数据包。
6. 如何阻止IP碎片攻击
-=-=-=-=-=-=-=-=-=-=-=
* Windows系统请打上最新的Service Pack,目前的Linux内核已经不受影
响。
* 如果可能,在网络边界上禁止碎片包通过,或者用iptables限制每秒通
过碎片包的数目。
* 如果防火墙有重组碎片的功能,请确保自身的算法没有问题,否则被
DoS就会影响整个网络。
* Win2K系统中,自定义IP安全策略,设置“碎片检查”。

简述防火墙防护原理

防火墙基本原理
首先,我们需要了解一些基本的防火墙实现原理。防火墙目前主要分包过滤,和状态检测的包过滤,应用层代理防火墙。但是他们的基本实现都是类似的。
│-路由器--网卡│防火墙│网卡│-内部网络│
防火墙一般有两个以上的网络卡,一个连到外部(router),另一个是连到内部网络。当打开主机网络转发功能时,两个网卡间的网络通讯能直接通过。当有防火墙时,他好比插在网卡之间,对所有的网络通讯进行控制。
说到访问控制,这是防火墙的核心了:),防火墙主要通过一个访问控制表来判断的,他的形式一般是一连串的如下规则:
1 accept from+ 源地址,端口 to+ 目的地址,端口+ 采取的动作
2 deny .(deny就是拒绝。。)
3 nat .(nat是地址转换。后面说)
防火墙在网络层(包括以下的炼路层)接受到网络数据包后,就从上面的规则连表一条一条地匹配,如果符合就执行预先安排的动作了!如丢弃包。。
但是,不同的防火墙,在判断攻击行为时,有实现上的差别。下面结合实现原理说说可能的攻击。
二 攻击包过滤防火墙
包过滤防火墙是最简单的一种了,它在网络层截获网络数据包,根据防火墙的规则表,来检测攻击行为。他根据数据包的源IP地址;目的IP地址;TCP/UDP源端口;TCP/UDP目的端口来过滤!!很容易受到如下攻击:
1 ip 欺骗攻击:
这种攻击,主要是修改数据包的源,目的地址和端口,模仿一些合法的数据包来骗过防火墙的检测。如:外部攻击者,将他的数据报源地址改为内部网络地址,防火墙看到是合法地址就放行了:)。可是,如果防火墙能结合接口,地址来匹配,这种攻击就不能成功了:(
2 d.o.s拒绝服务攻击
简单的包过滤防火墙不能跟踪 tcp的状态,很容易受到拒绝服务攻击,一旦防火墙受到d.o.s攻击,他可能会忙于处理,而忘记了他自己的过滤功能。:)你就可以饶过了,不过这样攻击还很少的。!
3 分片攻击
这种攻击的原理是:在IP的分片包中,所有的分片包用一个分片偏移字段标志分片包的顺序,但是,只有第一个分片包含有TCP端口号的信息。当IP分片包通过分组过滤防火墙时,防火墙只根据第一个分片包的Tcp信息判断是否允许通过,而其他后续的分片不作防火墙检测,直接让它们通过。
这样,攻击者就可以通过先发送第一个合法的IP分片,骗过防火墙的检测,接着封装了恶意数据的后续分片包就可以直接穿透防火墙,直接到达内部网络主机,从而威胁网络和主机的安全。
4 木马攻击
对于包过滤防火墙最有效的攻击就是木马了,一但你在内部网络安装了木马,防火墙基本上是无能为力的。
原因是:包过滤防火墙一般只过滤低端口(1-1024),而高端口他不可能过滤的(因为,一些服务要用到高端口,因此防火墙不能关闭高端口的),所以很多的木马都在高端口打开等待,如冰河,subseven等。。。
但是木马攻击的前提是必须先上传,运行木马,对于简单的包过滤防火墙来说,是容易做的。这里不写这个了。大概就是利用内部网络主机开放的服务漏洞。
早期的防火墙都是这种简单的包过滤型的,到现在已很少了,不过也有。现在的包过滤采用的是状态检测技术,下面谈谈状态检测的包过滤防火墙。状态检测技术最早是checkpoint提出的,在国内的许多防火墙都声称实现了状态检测技术。
可是:)很多是没有实现的。到底什么是状态检测?
一句话,状态检测就是从tcp连接的建立到终止都跟踪检测的技术。
原先的包过滤,是拿一个一个单独的数据包来匹配规则的。可是我们知道,同一个tcp连接,他的数据包是前后关联的,先是syn包,-》数据包=》fin包。数据包的前后序列号是相关的。
如果割裂这些关系,单独的过滤数据包,很容易被精心够造的攻击数据包欺骗!!!如nmap的攻击扫描,就有利用syn包,fin包,reset包来探测防火墙后面的网络。!
相反,一个完全的状态检测防火墙,他在发起连接就判断,如果符合规则,就在内存登记了这个连接的状态信息(地址,port,选项。。),后续的属于同一个连接的数据包,就不需要在检测了。直接通过。而一些精心够造的攻击数据包由于没有在内存登记相应的状态信息,都被丢弃了。这样这些攻击数据包,就不能饶过防火墙了。
说状态检测必须提到动态规则技术。在状态检测里,采用动态规则技术,原先高端口的问题就可以解决了。实现原理是:平时,防火墙可以过滤内部网络的所有端口(1-65535),外部攻击者难于发现入侵的切入点,可是为了不影响正常的服务,防火墙一但检测到服务必须开放高端口时,如(ftp协议,irc等),防火墙在内存就可以动态地天加一条规则打开相关的高端口。等服务完成后,这条规则就又被防火墙删除。这样,既保障了安全,又不影响正常服务,速度也快。!
一般来说,完全实现了状态检测技术防火墙,智能性都比较高,一些扫描攻击还能自动的反应,因此,攻击者要很小心才不会被发现。

网络层IP数据包的分片与重组时,片偏移长度的限制问题?

TCP/IP协议中分包与重组原理介绍
分片是分组交换的思想体现,也是IP协议解决的两个主要问题之一。在IP协议中的分片算法主要解决不同物理网络最大传输单元(MTU) 的不同造成的传输问题。但是分组在传输过程中不断地分片和重组会带来很大的工作量还会增加一些不安全的因素。我们将在这篇小论文中讨论IP分片的原因、原理、实现以及引起的安全问题。
一、什么是IP分片
IP分片是网络上传输IP报文的一种技术手段。IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。这一过程称为分片(fragmentation)。
二、为什么要进行IP分片
每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU(Maximum Transmission Unit).IP协议在传输数据包时,若IP数据报加上数据帧头部后长度大于MTU,则将数据报文分为若干分片进行传输,并在目标系统中进行重组。比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的数据帧大小超过1500字节,即IP数据报长度大于1472(1500-20-8=1472,普通数据报)字节,则需要分片之后进行传输。
三、IP分片原理及分析
分片和重新组装的过程对传输层是透明的,其原因是当IP数据报进行分片之后,只有当它到达目的站时,才可进行重新组装,且它是由目的端的IP层来完成的。分片之后的数据报根据需要也可以再次进行分片。
IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。在IP头里面,16位识别号唯一记录了一个IP包的ID,具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表中间的3位标志则标志着该分片后面是否还有新的分片。这三个标志就组成了IP分片的所有信息(将在后面介绍),接受方就可以利用这些信息对IP数据进行重新组织。
1、标志字段的作用
标志字段在分片数据报中起了很大作用,在数据报分片时把它的值复制到每片中的标志字段的其中一个比特称作“不分片”位,用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。如果将标志字段的比特置1,则IP将不对数据报进行分片,若在某个中间路由器上需要对其分片,则仅仅把数据报丢弃并发送一个ICMP不可达差错报文给源主机。如果不是特殊需要,则不应该置1;最右比特置1表示该报文不是最后一个IP分片。故意发送部分IP分片而不是全部,则会导致目标主机总是等待分片消耗并占用系统资源。某些分片风暴攻击就是这种原理。这里以以太网为例,由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,抛去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这就是前面所说的MTU的值。这个也是网络层协议非常关心的地方,因为网络层的IP协议会根据这个值来决定是否把上层传达下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。
下面是标志位在IP首部中的格式以及各个标志的意义:
Identification
R
DF
MF
Fragment Offset
R:保留未用;DF:Don’t Fragment,“不分片”位,如果将这一比特置1,IP 层将不对数据报进行分片;MF:More Fragment,“更多的片”,除了最后一片外,其它每个组成数据报的片都要把比特置1;Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。
2、MTU原理
当两台远程PC需要通信的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同)通过这段水管最大水量就要由中间最细的水管决定。
对于网络层的上层协议而言(这里以TCP/IP协议族为例)它们对“水管”粗细不在意,它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大 小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层) 的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一个标签:DF(Don‘t Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路MTU都是1500或者大于1500(仅X.25网络的576和点对点网络的296小于1500)。
对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达并不关心,所以一般UDP应用对分片没有特殊要求。
对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。
3、MSS的原理
MSS(Maxmum Sigmentation Size)就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20字节和TCP数据段的包头20字节)所以往往MSS为1460。通讯双方会根据双方提供的MSS值的最小值确定为这次连接的最大MSS值。
当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。
尽管IP分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。因为IP层本身没有超时重传的机制——由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有。一些UDP应用程序本身也执行超时和重传)。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这个原因,经常需要避免分片。
四、IP分片算法的原理
分片重组是IP层一个最重要的工作,其处理的主要思想:当数据包从一个网络A进入另一个网络B时,若原网络的数据包大于另一个网络或者接口的MTU长度,则需要进行分片(若设置DF为1,则丢弃,并回送ICMP不可达差错报文)。因而在IP数据包的报头有若干标识域注明分片包的共同标识号、分片的偏移量、是否最后一片及是否允许分片。传输途中的网关利用这些标识域进可能的再行分片,目有主机把收到的分片进行重组以恢重数据。因此,分片包在经过网络监测设备、安全设备、系统管理设备时,为了获取信息、处理数据,都必须完成数据包的分片或重组。
五、IP分片的安全问题
IP分片是在网络上传输IP报文时常采用的一种技术,但是其中存在一些安全隐患。Ping of Death, teardrop等攻击可能导致某些系统在重组IP分片的过程中宕机或者重新启动。一些IP分片攻击除了用于进行拒绝服务攻击之外,还常用于躲避防火墙或者网络入侵检测系统的一种手段。部分路由器或者基于网络的入侵检测系统(NIDS),由于IP分片重组能力的欠缺,导致无法进行正常的过滤或者检测。
介绍一下Tiny fragment 攻击:
所谓Tiny fragment攻击是指通过恶意操作,发送极小的分片来绕过包过滤系统或者入侵检测系统的一种攻击手段。攻击者通过恶意操作,可将TCP报头(通常为20字节)分布在2个分片中,这样一来,目的端口号可以包含在第二个分片中。对于包过滤设备或者入侵检测系统来说,首先通过判断目的端口号来采取允许/禁止措施。但是由于通过恶意分片使目的端口号位于第二个分片中,因此包过滤设备通过判断第一个分片,决定后续的分片是否允许通过。但是这些分片在目标主机上进行重组之后将形成各种攻击。通过这种方法可以迂回一些入侵检测系统及一些安全过滤系统。目前一些智能的包过滤设备直接丢掉报头中未包含端口信息的分片

tcp分片和ip分片的区别

我们在计算机网络上所看到的分片一般是指ip分片,ip分片是指在网络传输过程中若遇到链路MTU比自己报文小的情况则进行分片。

MTU是链路层中的网络对数据帧的一个限制,以以太网为例,MTU为1500个字节。一个IP数据报在以太网中传输,如果它的长度大于该MTU值,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

标志(flags)占用3位(即16 - 18),这三位分别是:R,DF,MF三位,第一位是保留位,没有被使用,目前只有后两个比特有意义。
R:标志字段中的第一位是一个保留位,现在还没有使用,可能将来会用到这位
D:标志字段中间的一位是 DF (Don’t fragment),表示传输的数据不允许分片。一般DF = 1的话,表示数据一次性传输过去,不允许分片。
M:标志字段的最低位是 MF (More fragment)。代表数据是否分片,如果MF位值为1,表示后面还有数据,还没有传输完毕,相当于数据分片,分批次传输,如果MF = 0表示最后一个分片或者只有一个分片。
这三位同一时刻也是只能有一个位的值能设置为1

占用13位:每次分片传输的数据之间的偏移距离,也就是某分片的数据在原数据中的相对位置,一般偏移以8字节为单位。比如:在网络层传输的ip数据报总长度最大不能超过65535字节,如果超过了,要么对ip数据报进行分片传输,否则将丢弃。
互联网协议使网络互相通信。设计要迎合不同物理性质的网络; 它是独立于链路层使用的基础传输技术。具有不同硬件的网络通常会发生变化,不仅在传输速度,而且在最大传输单元(MTU)。当一个网络要的数据报发送到具有较小MTU的一个网络,它可能片段的数据报。
当路由器收到一个数据包时,它会检查目的地址,并确定出接口使用,并且该接口的MTU。如果分组的大小是比MTU大,并且在该分组的头中的不分段(DF)位被设置为0,则路由器可对其进行分片。
分片机制有一定的缺陷:分片越多,分片丢失的机率就越大,对于一个数据报,一旦一个分片丢失,那么整个数据报就要重传;每一个数据报都要复制报头(只复制ip包头),这在一定程度上增加了带宽消耗。

组装时,需要重新设置首部的某些字段
修改分片标志和片偏移量字段
首部其他字段复制原来数据报首部的相应字段。

在IP头里面有16bit的识别号唯一记录了一个IP包的ID,以确定这几个分片是否属于同一个包,具有同一个ID的IP分片将会从新组装。13bit的片偏移记录了一个IP分片相对于整个包的位置。3bit的标志位记录了该分片后面是否还有新的分片。这三个分片组成了IP分片的所有的信息。

1.如果在源主机的以太网上进行数据包装,且tcp/udp向ip传送的数据包大于MTU1500字节,将在ip层进行分片。
2.在数据在数据链路(路由器)中传输的时候,每个路由器的MTU不一定相同,如果其中一个MTU只为800,则会触发ip分片,将1500字节的数据包拆成两个符合长度的数据包(但不一定会分片,由ip首部的两个标志位MF:More Fragment 和DF:Don't Fragment决定)如果是DF被设置,将会触发ICMP协议,将当前数据包丢弃,并把当前路由的MTU回传给源主机。

MSS(Maximum Segment Size,最大报文长度)是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。而Internet上标准的MTU(最小的MTU,链路层网络为x2.5时)为576,那么如果不设置,则MSS的默认值就为536个字节。很多时候,MSS的值最好取512的倍数。TCP报文段的分段与重组是在运输层完成的。
TCP在建立连接时进行三次握手,前两个握手包中双方互相声明自己的MSS,客户端声明MSS=8960,服务器端声明了MSS=1460。三次握手之后,客户端的MTU值比服务器端大,如果发送一个9000字节的包过去可能被分片或丢弃。因此客户端会把自己的MSS也降到1460字节。
TCP分段的原因是MSS,IP分片的原因是MTU, 由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。 因此TCP报文段很少会发生IP分片的情况。
再来看UDP数据报, 由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。 同样,ICMP(在网络层中)同样会出现IP分片情况。

TCP在三次握手建立连接过程中,会在SYN报文中使用MSS(Maximum Segment Size)选项功能,协商交互双方能够接收的最大段长MSS值。
MSS是传输层TCP协议范畴内的概念,顾名思义,其标识TCP能够承载的最大的应用数据段长度,因此,MSS=MTU-20字节TCP报头-20字节IP报头,那么在以太网环境下,MSS值一般就是1500-20-20=1460字节。
客户端与服务器端分别根据自己发包接口的MTU值计算出相应MSS值,并通过SYN报文告知对方。

IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS
IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组
对于以太网,MSS为1460字节,而MUT往往会大于MSS
故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分段,到了IP层就不用分片。而我们常提到的IP分片是由于UDP传输协议造成的,因为UDP传输协议并未限定传输数据报的大小。

TCP的分片和IP分片的区别
TCP的分片和IP分片的区别
MTU和MSS详解

攻击IP是什么意思?

局域网内的一种攻击方式。一般可以导致网内其他机器出现“IP地址冲突”或不能上网的症状。
具体原理嘛,先说下ARP协议吧。因为局域网内需要通过mac地址(相当于机器的唯一识别号)通信,故需要将IP地址和mac地址对应起来。就像一个班里的同学要把电话号码和真人对应起来一样,完成这个对应过程的就是ARP协议。
至于ARP攻击嘛,就类似于我明明是老骥,但是我给所有同学发短信说“我是小明,这是我的新号码”。这样同学们给小明发的短信以后就全部回到我这儿来,小明就没办法“上网”了,我就完成了一次欺骗。ARP欺骗就是坏蛋在局域网内的欺骗,让其他PC和路由器将IP对应到错误的mac

常见的网络攻击方法和防御技术

网络攻击类型
侦查攻击:
搜集网络存在的弱点,以进一步攻击网络。分为扫描攻击和网络监听。
扫描攻击:端口扫描,主机扫描,漏洞扫描。
网络监听:主要指只通过软件将使用者计算机网卡的模式置为混杂模式,从而查看通过此网络的重要明文信息。
端口扫描:
根据 TCP 协议规范,当一台计算机收到一个TCP 连接建立请求报文(TCP SYN) 的时候,做这样的处理:
1、如果请求的TCP端口是开放的,则回应一个TCP ACK 报文, 并建立TCP连接控制结构(TCB);
2、如果请求的TCP端口没有开放,则回应一个TCP RST(TCP头部中的RST标志设为1)报文,告诉发起计算机,该端口没有开放。
相应地,如果IP协议栈收到一个UDP报文,做如下处理:
1、如果该报文的目标端口开放,则把该UDP 报文送上层协议(UDP ) 处理, 不回应任何报文(上层协议根据处理结果而回应的报文例外);
2、如果该报文的目标端口没有开放,则向发起者回应一个ICMP 不可达报文,告诉发起者计算机该UDP报文的端口不可达。
利用这个原理,攻击者计算机便可以通过发送合适的报文,判断目标计算机哪些TC 或UDP端口是开放的。
过程如下:
1、发出端口号从0开始依次递增的TCP SYN或UDP报文(端口号是一个16比特的数字,这样最大为65535,数量很有限);
2、如果收到了针对这个TCP 报文的RST 报文,或针对这个UDP 报文 的 ICMP 不可达报文,则说明这个端口没有开放;
3、相反,如果收到了针对这个TCP SYN报文的ACK报文,或者没有接收到任何针对该UDP报文的ICMP报文,则说明该TCP端口是开放的,UDP端口可能开放(因为有的实现中可能不回应ICMP不可达报文,即使该UDP 端口没有开放) 。
这样继续下去,便可以很容易的判断出目标计算机开放了哪些TCP或UDP端口,然后针对端口的具体数字,进行下一步攻击,这就是所谓的端口扫描攻击。
主机扫描即利用ICMP原理搜索网络上存活的主机。
网络踩点(Footprinting)
攻击者事先汇集目标的信息,通常采用whois、Finger等工具和DNS、LDAP等协议获取目标的一些信息,如域名、IP地址、网络拓扑结构、相关的用户信息等,这往往是黑客入侵之前所做的第一步工作。
扫描攻击
扫描攻击包括地址扫描和端口扫描等,通常采用ping命令和各种端口扫描工具,可以获得目标计算机的一些有用信息,例如机器上打开了哪些端口,这样就知道开设了哪些服务,从而为进一步的入侵打下基础。
协议指纹
黑客对目标主机发出探测包,由于不同操作系统厂商的IP协议栈实现之间存在许多细微的差别(也就是说各个厂家在编写自己的TCP/IP 协议栈时,通常对特定的RFC指南做出不同的解释),因此各个操作系统都有其独特的响应方法,黑客经常能确定出目标主机所运行的操作系统。
常常被利用的一些协议栈指纹包括:TTL值、TCP窗口大小、DF 标志、TOS、IP碎片处理、 ICMP处理、TCP选项处理等。
信息流监视
这是一个在共享型局域网环境中最常采用的方法。
由于在共享介质的网络上数据包会经过每个网络节点, 网卡在一般情况下只会接受发往本机地址或本机所在广播(或多播)地址的数据包,但如果将网卡设置为混杂模式(Promiscuous),网卡就会接受所有经过的数据包。
基于这样的原理,黑客使用一个叫sniffer的嗅探器装置,可以是软件,也可以是硬件)就可以对网络的信息流进行监视,从而获得他们感兴趣的内容,例如口令以及其他秘密的信息。
访问攻击
密码攻击:密码暴力猜测,特洛伊木马程序,数据包嗅探等方式。中间人攻击:截获数据,窃听数据内容,引入新的信息到会话,会话劫持(session hijacking)利用TCP协议本身的不足,在合法的通信连接建立后攻击者可以通过阻塞或摧毁通信的一方来接管已经过认证建立起来的连接,从而假冒被接管方与对方通信。
拒绝服务攻击
伪装大量合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务响应。
要避免系统遭受DoS 攻击,从前两点来看,网络管理员要积极谨慎地维护整个系统,确保无安全隐患和漏洞;
而针对第四点第五点的恶意攻击方式则需要安装防火墙等安 全设备过滤DoS攻击,同时强烈建议网络管理员定期查看安全设备的日志,及时发现对系统存在安全威胁的行为。
常见拒绝服务攻击行为特征与防御方法
拒绝服务攻击是最常见的一类网络攻击类型。
在这一攻击原理下,它又派生了许多种不同的攻击方式。
正确了解这些不同的拒绝攻击方式,就可以为正确、系统地为自己所在企业部署完善的安全防护系统。
入侵检测的最基本手段是采用模式匹配的方法来发现入侵攻击行为。
要有效的进行反攻击,首先必须了解入侵的原理和工作机理,只有这样才能做到知己知彼,从而有效的防止入侵攻击行为的发生。

下面我们针对几种典型的拒绝服务攻击原理进行简要分析,并提出相应的对策。
死亡之Ping( Ping of death)攻击
由于在早期的阶段,路由器对包的最大大小是有限制的,许多操作系统TCP/IP栈规定ICMP包的大小限制在64KB 以内。
在对ICMP数据包的标题头进行读取之后,是根据该标题头里包含的信息来为有效载荷生成缓冲区。
当大小超过64KB的ICMP包,就会出现内存分配错误,导致TCP/IP堆栈崩溃,从而使接受方计算机宕机。
这就是这种“死亡之Ping”攻击的原理所在。
根据这一攻击原理,黑客们只需不断地通过Ping命令向攻击目标发送超过64KB的数据包,就可使目标计算机的TCP/IP堆栈崩溃,致使接受方宕机。
防御方法:
现在所有的标准TCP/IP协议都已具有对付超过64KB大小数据包的处理能力,并且大多数防火墙能够通过对数据包中的信息和时间间隔分析,自动过滤这些攻击。
Windows 98 、Windows NT 4.0(SP3之后)、Windows 2000/XP/Server 2003 、Linux 、Solaris和Mac OS等系统都已具有抵抗一般“Ping of death ”拒绝服务攻击的能力。
此外,对防火墙进行配置,阻断ICMP 以及任何未知协议数据包,都可以防止此类攻击发生。
泪滴( teardrop)攻击
对于一些大的IP数据包,往往需要对其进行拆分传送,这是为了迎合链路层的MTU(最大传输单元)的要求。
比如,一个6000 字节的IP包,在MTU为2000的链路上传输的时候,就需要分成三个IP包。
在IP 报头中有一个偏移字段和一个拆分标志(MF)。
如果MF标志设置为1,则表面这个IP包是一个大IP包的片断,其中偏移字段指出了这个片断在整个 IP包中的位置。
例如,对一个6000字节的IP包进行拆分(MTU为2000),则三个片断中偏移字段的值依次为:0,2000,4000。
这样接收端在全部接收完IP数据包后,就可以根据这些信息重新组装没正确的值,这样接收端在收后这些分拆的数据包后就不能按数据包中的偏移字段值正确重合这些拆分的数据包,但接收端会不断偿试,这样就可能致使目标计算朵操作系统因资源耗尽而崩溃。
泪滴攻击利用修改在TCP/IP 堆栈实现中信任IP碎片中的包的标题头所包含的信息来实现自己的攻击。
IP分段含有指示该分段所包含的是原包的哪一段的信息,某些操作系统(如SP4 以前的 Windows NT 4.0 )的TCP/IP 在收到含有重叠偏移的伪造分段时将崩溃,不过新的操作系统已基本上能自己抵御这种攻击了。
防御方法:
尽可能采用最新的操作系统,或者在防火墙上设置分段重组功能,由防火墙先接收到同一原包中的所有拆分数据包,然后完成重组工作,而不是直接转发。
因为防火墙上可以设置当出现重叠字段时所采取的规则。
TCP SYN 洪水(TCP SYN Flood)攻击
TCP/IP栈只能等待有限数量ACK(应答)消息,因为每台计算机用于创建TCP/IP连接的内存缓冲区都是非常有限的。
如果这一缓冲区充满了等待响应的初始信息,则该计算机就会对接下来的连接停止响应,直到缓冲区里的连接超时。
TCP SYN 洪水攻击正是利用了这一系统漏洞来实施攻击的。
攻击者利用伪造的IP地址向目标发出多个连接(SYN)请求。
目标系统在接收到请求后发送确认信息,并等待回答。
由于黑客们发送请示的IP地址是伪造的,所以确认信息也不会到达任何计算机,当然也就不会有任何计算机为此确认信息作出应答了。
而在没有接收到应答之前,目标计算机系统是不会主动放弃的,继续会在缓冲区中保持相应连接信息,一直等待。
当达到一定数量的等待连接后,缓区部内存资源耗尽,从而开始拒绝接收任何其他连接请求,当然也包括本来属于正常应用的请求,这就是黑客们的最终目的。
防御方法:
在防火墙上过滤来自同一主机的后续连接。
不过“SYN洪水攻击”还是非常令人担忧的,由于此类攻击并不寻求响应,所以无法从一个简单高容量的传输中鉴别出来。
防火墙的具体抵御TCP SYN 洪水攻击的方法在防火墙的使用手册中有详细介绍。
Land 攻击
这类攻击中的数据包源地址和目标地址是相同的,当操作系统接收到这类数据包时,不知道该如何处理,或者循环发送和接收该数据包,以此来消耗大量的系统资源,从而有可能造成系统崩溃或死机等现象。
防御方法:
这类攻击的检测方法相对来说比较容易,因为它可以直接从判断网络数据包的源地址和目标地址是否相同得出是否属于攻击行为。
反攻击的方法当然是适当地配置防火墙设备或包过滤路由器的包过滤规则。
并对这种攻击进行审计,记录事件发生的时间,源主机和目标主机的MAC地址和IP地址,从而可以有效地分析并跟踪攻击者的来源。
Smurf 攻击
这是一种由有趣的卡通人物而得名的拒绝服务攻击。
Smurf攻击利用多数路由器中具有同时向许多计算机广播请求的功能。
攻击者伪造一个合法的IP地址,然后由网络上所有的路由器广播要求向受攻击计算机地址做出回答的请求。
由于这些数据包表面上看是来自已知地址的合法请求,因此网络中的所有系统向这个地址做出回答,最终结果可导致该网络的所有主机都对此ICMP应答请求作出答复,导致网络阻塞,这也就达到了黑客们追求的目的了。
这种Smurf攻击比起前面介绍的“Ping of Death ”洪水的流量高出一至两个数量级,更容易攻击成功。
还有些新型的Smurf攻击,将源地址改为第三方的受害者(不再采用伪装的IP地址),最终导致第三方雪崩。
防御方法:
关闭外部路由器或防火墙的广播地址特性,并在防火墙上设置规则,丢弃掉ICMP协议类型数据包。
Fraggle 攻击
Fraggle 攻击只是对Smurf 攻击作了简单的修改,使用的是UDP协议应答消息,而不再是ICMP协议了(因为黑客们清楚 UDP 协议更加不易被用户全部禁止)。
同时Fraggle攻击使用了特定的端口(通常为7号端口,但也有许多使用其他端口实施 Fraggle 攻击的),攻击与Smurf 攻击基本类似,不再赘述。
防御方法:
关闭外部路由器或防火墙的广播地址特性。在防火墙上过滤掉UDP报文,或者屏蔽掉一些常被黑客们用来进Fraggle攻击的端口。
电子邮件炸弹
电子邮件炸弹是最古老的匿名攻击之一,通过设置一台计算机不断地向同一地址发送大量电子邮件来达到攻击目的,此类攻击能够耗尽邮件接受者网络的带宽资源。
防御方法:
对邮件地址进行过滤规则配置,自动删除来自同一主机的过量或重复的消息。
虚拟终端(VTY)耗尽攻击
这是一种针对网络设备的攻击,比如路由器,交换机等。
这些网络设备为了便于远程管理,一般设置了一些TELNET用户界面,即用户可以通过TELNET到该设备上,对这些设备进行管理。
一般情况下,这些设备的TELNET用户界面个数是有限制的。比如,5个或10个等。
这样,如果一个攻击者同时同一台网络设备建立了5个或10个TELNET连接。
这些设备的远程管理界面便被占尽,这样合法用户如果再对这些设备进行远程管理,则会因为TELNET连接资源被占用而失败。
ICMP洪水
正常情况下,为了对网络进行诊断,一些诊断程序,比如PING等,会发出ICMP响应请求报文(ICMP ECHO),接收计算机接收到ICMP ECHO 后,会回应一个ICMP ECHO Reply 报文。
而这个过程是需要CPU 处理的,有的情况下还可能消耗掉大量的资源。
比如处理分片的时候。这样如果攻击者向目标计算机发送大量的ICMP ECHO报文(产生ICMP洪水),则目标计算机会忙于处理这些ECHO 报文,而无法继续处理其它的网络数据报文,这也是一种拒绝服务攻击(DOS)。
WinNuke 攻击
NetBIOS 作为一种基本的网络资源访问接口,广泛的应用于文件共享,打印共享, 进程间通信( IPC),以及不同操作系统之间的数据交换。
一般情况下,NetBIOS 是运行在 LLC2 链路协议之上的,是一种基于组播的网络访问接口。
为了在TCP/IP协议栈上实现NetBIOS ,RFC规定了一系列交互标准,以及几个常用的 TCP/UDP 端口:
139:NetBIOS 会话服务的TCP 端口;
137:NetBIOS 名字服务的UDP 端口;
136:NetBIOS 数据报服务的UDP 端口。
WINDOWS操作系统的早期版本(WIN95/98/NT )的网络服务(文件共享等)都是建立在NetBIOS之上的。
因此,这些操作系统都开放了139端口(最新版本的WINDOWS 2000/XP/2003 等,为了兼容,也实现了NetBIOS over TCP/IP功能,开放了139端口)。
WinNuke 攻击就是利用了WINDOWS操作系统的一个漏洞,向这个139端口发送一些携带TCP带外(OOB)数据报文。
但这些攻击报文与正常携带OOB数据报文不同的是,其指针字段与数据的实际位置不符,即存在重合,这样WINDOWS操作系统在处理这些数据的时候,就会崩溃。
分片 IP 报文攻击
为了传送一个大的IP报文,IP协议栈需要根据链路接口的MTU对该IP报文进行分片,通过填充适当的IP头中的分片指示字段,接收计算机可以很容易的把这些IP 分片报文组装起来。
目标计算机在处理这些分片报文的时候,会把先到的分片报文缓存起来,然后一直等待后续的分片报文。
这个过程会消耗掉一部分内存,以及一些IP协议栈的数据结构。
如果攻击者给目标计算机只发送一片分片报文,而不发送所有的分片报文,这样攻击者计算机便会一直等待(直到一个内部计时器到时)。
如果攻击者发送了大量的分片报文,就会消耗掉目标计 算机的资源,而导致不能相应正常的IP报文,这也是一种DOS攻击。
T
分段攻击。利用了重装配错误,通过将各个分段重叠来使目标系统崩溃或挂起。
欢迎关注的我的头条号,私信交流,学习更多的网络技术!

TCP/IP 协议难点之一—— IP分片

就个人而言,网络中,抛开网络安全加密这些,就只单单讨论协议本身,比较难的有三个地方:

其实协议本身根据《TCP/IP详解卷1》理解起来并不难,但是实现起来就很难:数据的操作,标志位的设置,网络状态的变换,中断多线程通讯等等;

在下图的七层网络协议参考模型中,IP层属于网络层,网络层最主要的作用就是:将指定IP的数据报传输到对应的主机。

下图是以太帧封装格式(RFC 894),RFC 894封装格式也是我们最常用的。

下面做个简单介绍:

下面再看看数据部分:IP数据报

图中从左到右为0~31位,共四个字节,从上到下依次增长,IP头部占20字节,剩下的为数据,如果传输层为TCP则还有20字节的TCP头部,如果是UDP则还有8字节(如果分片的话,中间的包没有UDP头部,即0字节)的UDP头部。剩下的才是真正的用户要传送的数据。可以看出传送同样多的数据,UDP协议要比TCP传送的数据多,但从这一点来说UDP速度也要比TCP快。

下面对一些字段做个简单介绍:

从上面的介绍我们知道,一个以太帧最大为1518字节
(14字节以太首部,20字节IP首部,UDP8/TCP20,因此IP包每次最大为1500==MTU。去掉协议头UDP有效数据1472字节,TCP为1460字节。还有最后的4字节CRC),但是一个IP数据报则可能会有8192字节,超过以太帧的最大限制,那么这时就需要IP分片,分批进行传输。

发送方会在IP层将要发送的数据分成多个数据包分批发送,而接收方则将数据按照顺序再从新组织起来,等接收到一个完整的数据报之后,然后再提交给上一层传输层。

我们知道,协议本身并没有对数据在各个层中间怎么传递做出要求,比如嵌入式实现和BSD实现就不太一样,因为嵌入式内存比较少,数据在层与层之间传递时会尽量避免数据拷贝,而只是指针的操作。下面我们以嵌入式中用的比较多的LwIP举例

LwIP允许的最大IP由如下决定: IP_REASS_MAX_PBUFS 决定IP分片允许最大pbuf数量, IP_REASS_MAXAGE 分片的生存时间,超过则错误并将之前接收的IP分片丢弃。

如果数据大于 IP_REASS_MAX_PBUFS 则有两种选择,一,直接删除数据返回;二,是删除生存时间最长的IP分片PBUF,这个通过 IP_REASS_FREE_OLDEST 来使能。

当为UDP协议时,如果缓冲区描述符大小小于完整的IP数据包,IP分片数据包到来时,很快将描述符耗尽,后来的IP包由于无缓冲区描述符而丢弃,UDP没有重传机制,很可能永远不会接收到完整的IP分片包。从而大于 IP_REASS_MAXAGE 出现错误,因此缓冲区描述符也应增大以适应IP分片重装。

TCP发送数据时,将大于MSS的数据分段(segment不叫分片),MSS一般为1460.所以,TCP数据包不会在IP层分片。

IP头部有3位标志字段,标志是否为分片包。第一位无用,第二位0:允许分片,1:不允许。第三位0:最后一片,1:后面还有分片。13位offset表示偏移,用于IP重组时数据排序,13位因此支持最大IP数据包为8192字节。

标准的BSD协议实现如下图所示,采用两个结构体,IPQ为表头,将各个IP分片表头连接起来,并存储IP信息。Ipasfrag为具体的分片数据。

IP分片是IP碎片吗

一 前言 本文对linux的IP组装算法进行了分析,因为IP碎片经常用于DOS等攻击,在文章后面我结合了一些攻击方法进行了更进一步的说明。内核主要参考版本是2.2.16,另外简要的介绍了2.4.0-test3中的一些变化. 二 目录 1- 概述 2- 关键数据结构 3- 重要函数说明 4- 2.4系列的变化 5- 常见碎片攻击 1. 概述 在linux源代码中,ip分片重组的全部程序几乎都在都在\net\ipv4\ip_fragment.c文件中。其对外提供一个函数接口ip_defrag()。其函数原型如下: struct sk_buff *ip_defrag(struct sk_buff *skb) 众所周知,网络数据报在linux的网络堆栈中是以sk_buff的结构传送的,ip_defrag()的功能就是接受分片的数据包(sk_buff),并试图进行组合,当完整的包组合好时,将新的sk_buff返还,否则返回一个空指针。 此函数在其他文件中的调用如下: ip层接收主函数为ip_rcv()(\net\ipv4\ip_input.c),任何IP包都需经过此函数处理。如果此包是发往本机,则调用ip_local_deliver()函数(\net\ipv4\ip_input.c)进行处理,一般的系统碎片只有在到达最终目的的时候才进行重组(尽管在传输过程中可能被进一步分成更小的片)。在ip_local_deliver()中我们可发现如下代码: if (sysctl_ip_always_defrag == 0 && /*编译时未设置提前组装*/ (iph-〉frag_off & htons(IP_MF|IP_OFFSET))) { /*判断是否是分片包*/ skb = ip_defrag(skb); /*条件满足,进行组装*/ if (!skb) /*若组装好则进行下一步处理,出错 return 0; 或仍未组装完返回*/ iph = skb-〉nh.iph; /*重新定位ip头的指针*/ } iph-〉frag_off只有在设置MF(more fragment)或offset!=0才意味着是分片包,因此此处的检验理所当然,但为什么判断sysctl_ip_always_defrag == 0呢?在看ip_rcv()时我们应该已经注意到在刚进行了版本号,长度,校验和等判断后,有如下一段代码: if (sysctl_ip_always_defrag != 0 && iph-〉frag_off & htons(IP_MF|IP_OFFSET)) { skb = ip_defrag(skb); if (!skb) return 0; iph = skb-〉nh.iph; ip_send_check(iph); } 即如果sysctl_ip_always_defrag==1的话,ip_defrag()的调用位置将有变化,对任何进来的IP分片都要进行重组,可以想像,如果此机器作路由器的话,将对所有的分片组装好后,才会进行转发。此举一般是没有必要的。这个值可以通过sysctl命令动态设置,用sysctl -a可以看到在一般的系统中,此值被设为0: #sysctl -a ...... net.ipv4.ip_always_defrag = 0 ...... 2. 关键数据结构(2.2系列) 每一个分片用ipfrag结构表示: /* Describe an IP fragment. */ struct ipfrag { int offset; /* offset of fragment in IP datagram */ int end; /* last byte of data in datagram */ int len; /* length of this fragment */ struct sk_buff *skb; /* complete received fragment */ unsigned char *ptr; /* pointer into real fragment data */ struct ipfrag *next; /* linked list pointers */ struct ipfrag *prev; }; 这些分片形成一个双向链表(在linux内核中,若需要使用链表,除非有特殊需要,否则推荐双向链表,见document\CodingStyle),表示一个未组装完的分片队列(属于一个ip包)。 这个链表的头指针要放在ipq结构中: /* Describe an entry in the incomplete datagrams queue. */ struct ipq { struct iphdr *iph; /* pointer to IP header */ struct ipq *next; /* linked list pointers */ struct ipfrag *fragments; /* linked list of received fragments */ int len; /* total length of original datagram */ short ihlen; /* length of the IP header */ struct timer_list timer; /* when will this queue expire? */ struct ipq **pprev; struct device *dev; /* Device - for icmp replies */ }; 注意每个ipq保留了一个定时器(即struct timer_list timer;)。 ipq也会形成一个链表,它们是内核当前未组装完的所有IP包。为了便于查找,保留了一个 hash表: #define IPQ_HASHSZ 64 struct ipq *ipq_hash[IPQ_HASHSZ]; #define ipqhashfn(id, saddr, daddr, prot) \ ((((id) 〉〉 1) ^ (saddr) ^ (daddr) ^ (prot)) & (IPQ_HASHSZ - 1)) --------_____________ | 1 | | -------- ----------- ------------ ------------ Hash表 | 2 | | ipq1 |----〉| ipfrag1 |-----〉| ipfrag2 |------〉....... -------- ------------ ------------- ------------ ...... | -------- \/ | 63 | ------------ ------------- ----------- -------- | ipq2 |----〉| ipfrag1 |-----〉| ipfrag2 |------〉....... ------------ ------------- ----------- | \/ ------------ ------------- ----------- | ipq3 |----〉| ipfrag1 |-----〉| ipfrag2 |------〉....... ------------ ------------- ----------- | \/ ........ 每个IP包用如下四元组表示:(id,saddr,daddr,protocol),四个值都相同的碎片保留在一个IPQ中,即可组装成一个完整的IP包。 此结构在2.4内核中有了改动,具体将在下文中声明。 3. 重要函数说明(2.2系列) 3.1 ip_defrag() ip_defrag()是整个流程的入口,下面我们首先对ip_defrag()作一定的说明。 (1)为了防止因保留分片而造成内存消耗过大,linux设置了界限来防止这种情况,如果超过了内存使用的上限,则清空内存中最老的队列(ipq).所用内存的大小保存在变量ip_frag_mem中,当然,对它的读写都应是“原子”操作(atomic_sub,atomic_add,atomic_read,etc)。 其定义在文件ip_fragment.c前部: atomic_t ip_frag_mem = ATOMIC_INIT(0); /* Memory used for fragments */ if (atomic_read(&ip_frag_mem) 〉 sysctl_ipfrag_high_thresh) ip_evictor(); ip_evicator的具体操作将在下文中描述。 (2)以id, saddr, daddr, protocol为标志检索是否已经建立了相应的ipq,若发现,则返回ipq的指针,并重置定时器。 qp = ip_find(iph, skb-〉dst); (3)此时有一个if/else对,其作用是: 如果ipq已经存在,则证明已经有同一个包的其他分片到达。检查此片是不是第一个分片(因为分片到达顺序可能错乱),