利用處理常式錯誤攻擊(上)
建立時間:2000-06-03
文章屬性:轉載
文章提交:xundi (xundi_at_xfocus.org)
在本章,將要介紹一些利用TCP/IP協議的處理常式中錯誤進行攻擊的原理、方法以及一些防範對策。
這些攻擊包括當前流行的Teardrop和Land攻擊。
利用協議實現的攻擊方法,都是故意錯誤地設定資料包頭的一些重要欄位,例如,IP包頭部的Total
Length、Fragment offset、IHL和Source address等欄位。使用Raw Socket將這些錯誤的IP資料包
發送出去。在接受資料端,接收程式通常都存在一些問題,因而在將接受到的資料包組裝成一個完整
的資料包的過程中,就會使系統當機、掛起或系統崩潰。
在最後,是一個服務程式錯誤而導致攻擊的例子:OOB。
在本章,我們將結合一些程式來討論這種攻擊能夠實施的原理的同時,讀者也可以使用這些程式來檢
查自己系統針對這類攻擊的安全程度,並採取相應的措施。
1 攻擊的現象及其後果
使用了Windows 95和Windows 98 NT的人們都經曆過系統陷入混亂,對任何輸入都沒有響應的情況。
這時候,螢幕出現藍屏,遲遲無法重新重新整理。按下Ctrl+Alt+Del時,看到系統CPU利用率達到100%,
同時顯示一個應用程式無響應。這是程式出錯或者使用了盜版軟體的緣故。
通過網路,也可以使正在使用的電腦出現這種無響應、死機的現象。事實上,大量的程式往往經
不住人們惡意的攻擊。
人們已經使用了許多方法來專門對付上網的Windows 95和Windows NT。目前,能夠對Windows 95和
Windows NT進行攻擊的方法很多,當前流行的有:tearDrop(也稱為“淚滴”)、OOB、Land和Ping of Death
等。其中,關於Ping of Death在緩衝區溢位一章中對這種攻擊做了介紹,並給出了一些對策。
一般的攻擊過程是這樣的:當入侵者發現了一台Windows 95或者Windows NT(這隻需用連接埠掃描工具掃一
下就可以辨認出來),便用一個OOB或者TearDrop攻擊,再次用ping命令時,目標主機就沒有響應了。事
實上,這些攻擊並不是局限於Windows NT和Windows 95平台,一些攻擊,如Land已被發現對Linux、Cisco
路由器以及其他大量的UNIX作業系統都具有相當的攻擊能力。
能夠實施這種攻擊的原因是在Windows 95和Windows NT中存在錯誤,這是一種處理TCP/IP協議或者服務程
序的錯誤。人們利用這些錯誤。通過給連接埠送一些故意弄錯的資料包,在這個資料包的位移欄位和長度字
段,寫入一個過大或過小的值。Windows 95和Windows NT都不能處理這個情況,然後Windows 95就先變成
藍屏,Windows NT是非死機不可。據稱TearDrop可以使被攻擊的主機立刻當機。
這些攻擊的危險性在於可以通過網路發起攻擊,當攻擊者發現了一台上網的Windows 95、Windows NT或者
Linux作業系統主機時,只需啟動這一程式,輸入入口參數假冒IP、連接埠號碼,被攻擊主機的IP地址和連接埠號碼,
便可以發起攻擊了。通常是Linux一遭到攻擊就當機,而Windows在受到十幾次攻擊之後也會死機。這時候,
用ping命令,被攻擊的主機就再也沒有回應了。
服務程式存在錯誤的情況是很多的,例如,Windows NT中的RPC服務存在漏洞。某個使用者可以遠程登入到
Windows NT 3。5x或者伺服器的連接埠135,並任意輸入10個字元,然後斷行符號,切斷串連。這便可以使目標
主機的CPU利用率達到100%。雖然一個簡單的重啟動就消除了這個問題,但畢竟這是很討厭的,是系統安
全的重要隱患並嚴重地影響系統效能。
對於OOB攻擊,人們已經提出一些對策,如在Windows NT 4.0 中,呆以對發到連接埠若懸河39的包進行過濾
等,都需要對系統的網路設定進行一番配置,來分別處理拔號上網和使用LAN的情況。
目前網上已經出現補丁程式,用來對付這些攻擊方法的攻擊。在 Windows 95和Windows NT上的安裝非常
簡單,只需運行一下安裝包即可。
在沒有找到補丁程式之前,也可能性安裝一個PC防火牆。該工具非常有效,例如,當禁止從主機的所有端
口發出資料包,同時禁止資料包發向本主機的所有連接埠時,實際上已將本主機應用程式層的服務功能和訪問功
能切斷。此時,雖然可以ping通一台有帳戶和口令的UNIX主機,但卻地法登上(telnet)該主機或從該主
機用ftp取迴文件。
可以用該工具來過濾發向本主機一些連接埠(例如139)的資料包。
2 淚滴(TearDrop)攻擊工具
這個攻擊工具起名為淚滴,它確實可以讓人們恨得咬牙切齒。
當辛苦的勞動成果突然因為一次莫名其妙的當機而化為烏有。也許,這次當機便是一個人隨意地向你的計
算機動了一次小小的攻擊所致。
這個攻擊利用的是系統在實現時的一個錯誤,我們以Linux上的一個實現為例,也就是說,某些Linux操作
系統也是脆弱的,我們也可以用這種方法攻擊Linux作業系統。
Linux作業系統在它的IP資料包重裝模組有一個嚴重的錯誤,更確切一點地說,是在ip-glue()函數中。
當Linux收到一個個IP包,送到IP層進行組裝,以形成發送端原來的IP包時,它將進入了一個迴圈中,將
接收隊列中的一個個資料包中的有效資料,拷貝到一個新分配的緩衝區中。
這段代碼如下:
fp = qp->fragments;
while (fp ! =NULL)
{
if (count +fp ->len >skb ->len)]
{
error-to-big;
}
memcpy (ptr + fp ->offaet ), fp-> ptr, fp->len);
count +=fp ->len;
fp =fp->next;
}
在程式中,檢查了每段資料是否過長,因為如果資料部分過長,將會向核心拷貝過多的資料,引起核心
發生某種危險。然而在程式中並沒有檢查包中有效資料的長度是否過分小,例如,當表示包中資料長度
的變數變成了一個負數時(例如 fp->len<0),對這種情況,並沒有進行檢查,結果是系統將過多的資料
拷貝到核心中去。
以下,讓我們看看Linux是如何將收到的IP資料加入到組裝隊列中去的。
計算這一fragmrnt的終結位置:
/*
l Determine the position of this fragmrment.
l /
end =offset +ntohs(iph ->tot-len) –ihl;
在正常情況下一切也正常。但是,當我們精心準備這樣的資料包,讓前後包中的“fragment offset”字
段交疊在一起,會發生什麼呢?
看看程式對“fragment offset”做了那些處理:
if (prev != NULL&& offset
{
I =prev->end –offset;
Offset +=I : /*ptr into datagram */
Ptr += I /* ptr into fragment data */
}
如果我們發現當前包的段位移在前一包資料內部,也就是說根據位移欄位的值,前後兩資料包的資料部
分有重疊。組裝程式試圖正確對齊它們的邊界。程式碼如上所示。這一步是對的。除非當前包中的有
效資料碰巧沒有足夠的資料來滿足對齊的要求。在這種情況下,“offset”域中的值將會比“ end”域
中的值大。這兩個數值被交給“ip-frag-create()”模組,在這個模組中,將會計算當前包的長度。
/* Fill in the structure. */
fp->offset =offset;
fp->end =end;
fp->len =end –offset;
在這種極少見的情況下,計算出來的fp-len竟變成了一個負數,於是memcpy()最終將會把大量的資料拷貝
到核心中,因為memcpy()中的記數器是一個反碼,是一個非常大的數值。根據使用的記憶體管理機制的不同,
將會引起系統重啟動或停機。
這種情況完全可以通過編程來實現,例如可以發送兩個特殊的資料包,第一個包中的“offset”域置為0,
包中有效資料(IP資料)長度為N,MF位置1。第二個包中MF位置0,“offset”為一個小於N的數,包中的
IP資料也少於N。
當將收到的兩個資料包組裝時,先將第一個資料包拷貝到一個緩衝區中去,然後拷貝第二個資料包。因為
next->offset
cur ->offset =next ->offset +(pre->end-next->offest);
cur ->end =next ->offest +(next->iph ->tot-len)-ihl);
cur ->len =cur->end-cur->offest;
當ntohs(next->iph->tot-len)-ihl<(pre->end-next->offset)時,錯誤就發生了。這時候,cur->len為
負數。
在正常情況下,無法預言這種情況是否會發生,發生的頻率如何。但是在人為的情況下,尤其是在一處故
意的情況下,那就一定會發生的。
人們可以自己編寫發送raw資料包的程式。在資料包中,從IP包頭開始,都可以填入自己想要的任意數值。
而我們使用軟體並不能處理這類非常複雜的情況。事實上,即使對軟體曾經進行了詳細的測試,也很難說
會發現這種錯誤。
當前的許多Linux的實現中都有這個錯誤,向Linux發送很少幾個這樣的資料包,便可以引起Linux當機,
因為通常這種IP包重組和緩衝區開在系統核心態,緩衝區溢位將使系統崩潰。同樣地,向Windows 95、
Windows NT發送10-15個這樣的包,也會引起死機。
現在在網上已經出現了大量類似這樣的程式,這些攻擊的方法依然是對一些欄位使用錯誤的值,但和
“淚滴”相反,將段位移欄位寫入一個大於頭的長度的數值或者偽造UDP的長度,直到偽造為真實長度的
兩倍。或者將原來專門攻擊53連接埠的程式改造為可以攻擊一系列連接埠。