?? 常見ip碎片攻擊詳解.txt
字號:
發信人: dormouse (只識彎弓射大雕), 信區: Hacker
標 題: [轉載]常見ip碎片攻擊詳解
發信站: 哈工大紫丁香 (2002年01月26日09:05:31 星期六), 站內信件
發信人: ncutaki (小馬@準備閉關中), 信區: Hacker
標 題: [轉載]常見ip碎片攻擊詳解
發信站: BBS 水木清華站 (Fri Jan 25 12:45:38 2002)
轉載綠盟
常見IP碎片攻擊詳解
發布日期: 2002-1-22
內容:
------------------------------------------------------------------------
----
----
原創:Sinbad(辛巴達)
來源:http://sinbad.dhs.org
本文簡單介紹了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不允許我們做壞事。:(
該值乘以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安全策略,設置“碎片檢查”。
7. 更多資料
-=-=-=-=-=-=-=-=-=-=-=
[1] TCP/IP Illustracted Volume 1 : The Protocols
[2] Microsoft Security Bulletin MS00-029:
http://www.microsoft.com/technet/security/bulletin/ms00-029.asp
[3] BugTraq Mailing List, "Analysis of jolt2.c(MS00-029)":
[3] BugTraq Mailing List, "Analysis of jolt2.c(MS00-029)":
http://www.securityfocus.com/archive/1/62011
[4] http://www.attrition.org/security/denial/w/teardrop.dos.html
[5] http://packetstormsecurity.org/0005-exploits/jolt2.c
[6] http://packetstormsecurity.org/Exploit_Code_Archive/teardrop.c
--
是不是選擇了不同的方向,
都會游向同樣的宿命
※ 來源:·BBS 水木清華站 smth.org·[FROM: 202.204.26.104]
--
▏ ×▏
▏ ▏
▏ ♂ 你知不知道,思念一個人的滋味 ▏
▏ ▁▁▁▁▁ ▏
▏ ▏確 定 ▏ ▏
▏ ▔▔▔▔▔ ▏
※ 來源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 172.16.2.56]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -