ICMP漏洞分析

/ns/wz/net/data/20010403080421.htm

ICMP在IP中的结构是这样的.

VERSION 4

IHL INTERNET HEADER LENGTH IN 32-BITS

TYPE OF SERVICE 0

TOTAL LENGTH LENGTH OF INTERNET HEADER AND DATA IN 字节单位

IDENTIFICATION, FLAGS

分割和重组IP的标记.

TIME TO LIVE

TTL

PROTOCOL 这一点很重要,表示这次IP包内的是ICMP信息.

ICMP=1

SOURCE ADDRESS

发送这个包的原主机IP地址或路由器地址.(在发送ICMP包是可以是任何路由器的地址)

DESTINATION ADDRESS

准备接受这个icmP包的IP地址.

_____________________________________________

目的主机不可到达的ICMP包结构.

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

unused

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+





0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

类型 代码 校验和

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

保留字

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IP头和64位原始IP数据 既是原来发送普通IP包有错的数据

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



在IP段里,目的IP是发送错误包的IP地址.



在ICMP 段里



类型是 3



代码有.



0= 网络不可到达.

1= 主机不可到达.

2= 协议不可到达.

3= 端口不可到达.

4= 包需要重组.

5= 原路由失败.



校验和

校验和是0,

Internet Header + 64 bits of Data Datagram

协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64

位高层协议的数据.


描述....

如果根据路由的路由表,在一个数据包里的目的网络是不可到达的,例如:

目的网络是无限远,那么,路由就发送一个目的不可到达的消息给这个包的发送者.

在一些路由里,有能力判断目的主机不可能到达的,就回发送主机不可到达.


如果在目的主机里,IP
模块不能传递数据给上层的端口或协议,(因为端口没有激活,或所指的高层协议根本不存在),那么
目的主机会发送目的不可到达的信息回去.

另外一种情况是,当数据报必须分割以通过一个网管时,而偏偏在IP
包里指定了不要分割.此时,网关回发送目的不可到达信息.


代码 0.1. 4, 5的ICMP 一般由路由发送.而 代码 2 3
则来自目的主机.


(cceye 评: 在这个包里,因为0,1, 4 ,5
代码可能来字任何的路由,所以不需要伪造IP
就可以发送ICMP包,此时假冒自己是路由器.
有一点困难是目的不可到达的ICMP包要求附带有原数据的前64位.不过可以假设,
例如:

HOST A -------HOST B

而你是HOST C , 可以想象A
要是访问外界有一些基本的要求,从这里下手,
可以

猜测到他的原始数据.

其一是 DNS , 假如DNS是HOST D , 而我们知道A
必须要访问DNS 才能得以访问其他主机. 而且A
常常访问一个K域,所以只要不断的向A
发送主机不可到达的ICMP信息,并带上那个查询DNS的
K 域名的信息就极有可能成功.
在局域网里可以假冒IP,这时可以假冒受害主机IP地址,并猜测其他主机可能会访问该主机的哪个
高层协议,这时可以发送协议或端口不可到达给所有的主机,
如果技术上能够达到扫描所有的局域网上的包的话,
则只要发现有访问受害主机的包,就紧跟着发送ICMP
端口不可到达.使其他主机不能访问主机)
____________________________________________________________

Time Exceeded Message


0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

unused

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

超时信息.

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

类型 代码 校验和

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

保留字

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IP头和64位原始IP数据 既是原来发送普通IP包有错的数据

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


在IP段里,目的IP是发送错误包的IP地址.

在ICMP 段里

类型为 11


代码

0= TTL生命期结束.

1= 分割重组时间超时.

校验和

校验和是0,

Internet Header + 64 bits of Data Datagram


协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64

位高层协议的数据.



描述.

当一个路由处理一个IP 包时,发现其TTL已经为0 ,
则路由有责任把这个数据销毁,不再转发.并会通知原主机.

当一个主机重组一个分割过的IP时,在系统内定的时间内没有接受到所有的分组而不能完成任务
时.会销毁这个分组并告之原主机.

如果分组被设为0 , (就是没有分组,
那么没有必要设定超时限制)

代码1 会来自一个主机, 代码0 会来自一个路由.



(CCEYE 分析: 这个的困难和上一个一样,
是要知道原主机所发的数据.
引起主机的反应不一样, 因为路由表的原因,
在小网和网络支段伪造IP 很不容易.((可以假冒,
但是通不过静态配置的路由器)) 这里只能冒充路由,返回这个ICMP包会时原主机不断试图加大
TTL
而不断重发相同的包. 关键取决与你的主机与
他的目的主机谁的先一步到,会使受害主机不能访问外界网络)



______________________________________________________-









Parameter Problem Message



0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Pointer unused

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+





参数错误信息.



0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Pointer unused

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+











在IP段里,目的IP是发送错误包的IP地址.



在ICMP 段里



类型为 12



代码

0 = 指针表明了错误.

校验和



为 0



指针

如果代码为0 , 标明发生错误的字节.



Internet Header + 64 bits of Data Datagram



协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64

位高层协议的数据.



描述,

如果主机或路由在传输一个数据报时发现了一个错误,
那么该主机必须销毁此包并给原主机一个ICMP信息.

代码 0 可以由 主机 或 路由 发出.



(CCEYE 评: 同上一个的方法获得一样的效果,但需要计算更多.)



___________________________________________________________-









Source Quench Message



0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

unused

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



原数据丢失 信息.









0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

unused

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+













在IP段里,目的IP是发送错误包的IP地址.



在ICMP 段里



类型为 4



代码

0

校验和



为 0





Internet Header + 64 bits of Data Datagram



协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64

位高层协议的数据.



描述:

当一个路由或主机的内部队列已经被等待处理的数据报添满而不能处理时,
会自动销毁新进来的数据报,并告诉原主机数据发送太快,



------------------------------------



(cceye:这个ICMP
包会使原主机发送包的速度越来越慢.方法同上)





______________________________________











Redirect Message



0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Gateway Internet Address

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+



重定向信息.





0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Gateway Internet Address

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Internet Header + 64 bits of Original Data Datagram

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+













在IP段里,目的IP是发送错误包的IP地址.



在ICMP 段里



类型为 5



代码

0 = 重定向网络.

1 = 冲定向主机

2 = 重定向服务类型和网络

3 = 重定向服务类型和主机



校验和



为 0



Gateway Internet Address



原数据包的目的主机要经过的路由地址.





Internet Header + 64 bits of Data Datagram







Internet Header + 64 bits of Data Datagram



协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64

位高层协议的数据.



描述:



一个路由发送一个重定向消息给一个主机在如下的环境下.

一个路由, G1
从一个属于他的网络中的主机得到一个数据报.G1
检查他的路由表并得到下一个路由的地址,G2
是连接着目的网络的路由, 如果G1在此时发现G2是直接连接着同属于这个数据包的原主机的网络
的话.
G1将发送一个重定向信息给原主机.告诉他连向那个网络的路由有一个更好的.路由同时把数据报
传送到目的网络.

对于在IP选项中有原路由路径的数据报,路由将不发重定向ICMP即使有更好的路由.



代码 0.1, 2, 3 都来自同路由器

.

(CCEYE:评.
使用该选项使目的主机完全与外界失去联系);



___________________________________________________________







Echo or Echo Reply Message



0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type Code Checksum

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Identifier Sequence Number

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Data ...

+-+-+-+-+-





回声回应信息.





IP地址,目的主机的IP地址,为了回应一个回声,简单的把目的地址和原地址调换,

把类型改为0 , 并重新校验即可.



类型

8 发送回声请求.

0 回应回声.



代码

0



校验和.





Identifier

如果代码为0 ,一个标视符会加如来回应. 可以为0.



Sequence Number



如果代码为0 , 一个序列号会帮助对应回声响应.可以为0.



描述:

在回声请求里带的数据必须要被回应带回来.

标志符和序列号用来帮助回声请求者来检测回声请求.回应者必须返回同样的值.



代码 0 可以由一个主机或路由发送.







_______________________________________________-





ICMP

还有广播路由的功能.

可以肯定,一个专线主机不会和DNS服务器连接在一个网络中.





计划:

1, 假冒路由, 告诉主机DNS服务器不可到达.

需要, 一个路由, 一个DNS 服务器.两个网段.



受害主机 A ----路由 -------DNS 服务器






_________-发动攻击的主机.



目的,看A 接受到我的错误ICMP后,还对DNS是否有反应




结果:受害主机与DNS服务器之间的联系效率降低
3/4 .



2, 假冒路由, 告诉主机TTL超时.



需要, 一个路由, 一个DNS 服务器.两个网段.



受害主机 A ----路由 -------DNS 服务器






_________-发动攻击的主机.





目的,看A 接受到我的错误ICMP后,还对DNS是否有反应.






 






3, 假冒路由告诉主机原数据丢失.





需要, 一个路由, 一个DNS 服务器.两个网段.



受害主机 A ----路由 -------DNS 服务器






_________-发动攻击的主机.







目的,看A 接受到我的错误ICMP后,还对DNS是否有反应.



4 , 假冒路由,告诉主机有更好的路由.







需要, 一个路由, 一个DNS 服务器.两个网段.



受害主机 A ----路由 -------DNS 服务器






_________-发动攻击的主机.



看主机在接受到ICMP错误信息后,还能不能访问DNS.





结果:奇怪的是路由器陷入几乎死机的状态. (32M
133MHZ redhat6.1 的路由器).看来恶意数据报被路由销毁了,但是由于算法,或机器的原因而导
致太慢.

______________________



以上是假冒路由,

以下是假冒主机在局域网内部.



计划

1 , 假冒主机依次告诉所有主机端口不可到达.

需要,

一个受害主机, 运行代理服务器.一个局域网

受害主机



___________________



A B C D 攻击主机





看局域网内部的主机是否还能访问受害主机.





2 , 假冒主机,依次告诉所有主机分组超时.

需要,

一个受害主机, 运行代理服务器.一个局域网

受害主机








___________________



A B C D 攻击主机







看局域网内部的主机是否还能访问受害主机.



_________________



实验记录:

WIN95 97 98 NT的IP 序列号从0 开始, 到65535
再次从头开始 , 间隔256.

LINUX 的IP 序列号是以1 为间隔.



每个TCP的连接在无法接到回应的情况下,会连续产生4次试图连接.



现在实验看这里的4个连接的TCP内的序列号是否一样.
结果: TCP 一样.Ip 序列号不一样.

如一样,则说明IP在没有告诉上层的情况下自动从发.

如不一样说明IP 在接到ICMP报告之后会要求上层从发.

估计是一样.

另外,还要看IP在从发时是在接到ICMP后,还是在之前.结果:似乎是IP与ICMP并不太友好.因为没
有进一步的编写协议分析仪,所以无从可知,而该死的期中考试又来了.各位,原代码在此.原程序在

是计划3,或计划1,记不清了.(抱歉,要知道我连自己家的电话都要朋友提醒.不然老打错成女朋友
的:)




基本上原代码是由 MSDN 内的PING.C 范例程序和IPMAN.C
拼凑而成的.这里感谢MICRO 和 HiHint




虽然两位都未见面,心仪已久:0




代码思想是这样的:




向目的主机发送一个ECHO 类型的ICMP包.




抓到返回的包,得到她的IP序列号,以此号为开始,每加256
发送一个ICMP的报错通知,具体发送什么类型的可以在函数




void fill_icmp_datab()内修改,




原代码是目的网络不可到达,可以使路由器达到---(what
shall i say?)高潮?.




编译需要VC++5.0 以上. 注意编译时要加入
WSOCK32.LIB




运行需要WIN98 ( NOT NOT NOT WIN95 ,97 , nt4.0)




运行参数:




1 , 目的攻击IP




2, 假设目的IP要访问的IP




3, 假设目的主机要访问的端口.(这里假设是UDP
的 53 )




 
原代码. 已经作好的可执行程序.
都在http://cceye.iscool.net

改好了别忘了寄来一份.cceye@371.net

或在
bbs 上留下网址
参考
RFC 950 IMCP


-------转自packet storm