原理:一碗水,望一個(gè)杯子里灌,杯子裝不下了,我們會說,水溢出了。因此溢出在現(xiàn)實(shí)中可以描述為,當(dāng)液體被倒入容器中,而超過了容器的限制時(shí),就會造成溢出。黑客技術(shù)所描述的溢出,含義基本是一樣的。當(dāng)某個(gè)數(shù)據(jù),超過了處理程序限制的范圍時(shí),該數(shù)據(jù)就會造成程序的執(zhí)行溢出(overflow)。
通常一些系統(tǒng)在未對接收數(shù)據(jù)進(jìn)行嚴(yán)格判斷的情況下,都有可能造成溢出,對于一些無心的操作者,溢出最多會造成該處理進(jìn)程報(bào)錯(cuò)或者異常終止,并不是很嚴(yán)重的事情,有人奇怪,異常終止還不嚴(yán)重嗎?實(shí)際是這樣的,這里我們面對的多人共享服務(wù)的應(yīng)用,通常一個(gè)服務(wù)進(jìn)程在接收一個(gè)用戶請求時(shí),會創(chuàng)建一個(gè)子進(jìn)程去進(jìn)行應(yīng)答和服務(wù),如果這個(gè)子進(jìn)程接收了一些無特別含義的超過限制的數(shù)據(jù),通常會終止,而服務(wù)的父進(jìn)程和其他子進(jìn)程并不受影響,因此對系統(tǒng)的危害實(shí)際上并不大。但是如果這個(gè)數(shù)據(jù)包是被精心構(gòu)造的(參見上文,特殊字符構(gòu)造法),那么在溢出點(diǎn)后面的就可能是精心策劃的代碼,從而進(jìn)行服務(wù)端的代碼執(zhí)行,進(jìn)而有可能控制系統(tǒng)。
溢出攻擊法的危險(xiǎn)在于,大部分系統(tǒng)設(shè)計(jì)者在設(shè)計(jì)初都無法完全預(yù)料和防范溢出攻擊的各種可能性,因此事實(shí)上任何具有一定復(fù)雜性的服務(wù)系統(tǒng)幾乎都肯定有遭受溢出攻擊的危險(xiǎn),只是有的已經(jīng)被發(fā)現(xiàn),有的尚未被發(fā)現(xiàn)而已。從Wu-ftp,Sendmail,IIS,qmail,到Apache,幾乎全部世界上最通用的網(wǎng)絡(luò)服務(wù)系統(tǒng),都曾出現(xiàn)過能夠?qū)е乱绯龉舻?a class=Channel_KeyLink href="http://www./">漏洞。而且每個(gè)漏洞都是極端高危險(xiǎn)的(可被攻擊者獲得對服務(wù)系統(tǒng)的控制),這種危險(xiǎn)是如何實(shí)現(xiàn)的呢?
一個(gè)程序被執(zhí)行,代碼段(這里的代碼段通常不是程序員編寫的源代碼,而是經(jīng)過編譯和處理后的匯編指令)會放到內(nèi)存里,代碼段所處理的數(shù)據(jù)也會放在內(nèi)存里,通常數(shù)據(jù)段會在代碼段前面,這里明確一點(diǎn),電腦并不認(rèn)識誰是代碼,誰是數(shù)據(jù),在它眼里,只有0和1,也就是高電平和低電平。通常數(shù)據(jù)和代碼都會相安無事,但是如果數(shù)據(jù)超過了數(shù)據(jù)段的限制,占用了代碼段的位置,那就不一樣了,如果是數(shù)據(jù)提交者無意造成的,通常是造成代碼無法執(zhí)行,該子進(jìn)程的崩潰。但是如果是精心構(gòu)造的,那么就有可能改寫代碼段的執(zhí)行命令(通過匯編),從而讓代碼段(請記住這個(gè)代碼段是在服務(wù)器的內(nèi)存上)執(zhí)行攻擊者所期望執(zhí)行的操作,這樣,入侵者就可以在隨心所欲的讓服務(wù)器執(zhí)行自己要執(zhí)行的操作,也就是控制服務(wù)器的整個(gè)系統(tǒng)(而不是單純的應(yīng)用服務(wù))!
攻擊方式:
1.測試溢出點(diǎn)
假設(shè)我們針對一個(gè)服務(wù)系統(tǒng)進(jìn)行數(shù)據(jù)包的構(gòu)造和發(fā)送,通常,服務(wù)系統(tǒng)溢出的錯(cuò)誤顯示和錄入錯(cuò)誤的顯示是顯著不同的,錄入錯(cuò)誤的提示是服務(wù)系統(tǒng)程序所產(chǎn)生的相關(guān)信息,而溢出的提示是操作系統(tǒng)所產(chǎn)生的相關(guān)信息,根據(jù)錯(cuò)誤信息的差異,有經(jīng)驗(yàn)的黑客可以很快判斷該應(yīng)用系統(tǒng)是否存在溢出點(diǎn),這個(gè)過程通常是一個(gè)程序循環(huán)執(zhí)行,用各種長度或格式的報(bào)文進(jìn)行測試,并比較系統(tǒng)返回的信息,通過逐步細(xì)化范圍,有經(jīng)驗(yàn)的黑客可以測算中具體溢出點(diǎn)(也就是可以放置攻擊代碼的臨界點(diǎn),如果放置錯(cuò)了哪怕一個(gè)位置,都不可能被系統(tǒng)執(zhí)行,這種放在內(nèi)存里的匯編和用開發(fā)工具寫原程序?qū)Ω袷降囊?,位置的要求都是極高的)
2.構(gòu)造攻擊代碼
這要看攻擊者的目的和企圖了,沒有定論,但是有幾點(diǎn)要強(qiáng)調(diào)的,第一是代碼格式和規(guī)范必須與受攻擊系統(tǒng)的相關(guān)匯編指令完全一致,第二是代碼結(jié)束要干凈,比如中斷進(jìn)程,如果結(jié)束不干凈,又和人家原來系統(tǒng)的代碼攪在一起,執(zhí)行過程就可能會偏離攻擊者的意圖。
3.進(jìn)行控制和入侵
如果相關(guān)攻擊代碼加載了后門,開辟了專門的shell, 那么這名攻擊者就可以方便的進(jìn)出該系統(tǒng),實(shí)現(xiàn)更方便的控制。
防護(hù)方式:
對于系統(tǒng)的設(shè)計(jì)者,必須對太多地方考慮周詳才可能避免這種方式的入侵,實(shí)際上所謂超過限制,有時(shí)候不一定是超過長度,一個(gè)長度標(biāo)記位的改寫就可能逃避長度檢查,達(dá)到溢出攻擊效果。
對于系統(tǒng)維護(hù)者,那沒有辦法,只能天天多看相關(guān)安全網(wǎng)站的最新問題,一旦確認(rèn)和自己系統(tǒng)所處的服務(wù)環(huán)境有關(guān),就一定要立即去相關(guān)站點(diǎn)下載補(bǔ)丁,進(jìn)行防護(hù),不過還有一些其他辦法可以盡量減少攻擊者的攻擊:
第一,除非一定需要,盡量少開服務(wù)。少開服務(wù)的意思就是讓攻擊者缺少與系統(tǒng)進(jìn)行溝通和數(shù)據(jù)交互的通道,減少被攻擊的可能。
第二,如果是專有的服務(wù),使用IP屏蔽技術(shù)。如果某些服務(wù)(如telnet,ftp),僅面向有限人群,而這些人群的IP地址相對集中,可以使用IP屏蔽方式讓其他IP用戶無法訪問,這樣其他IP地址的用戶就無法和該系統(tǒng)進(jìn)行數(shù)據(jù)交互了。
第三,如果是面向有限人群服務(wù),可以使用改變服務(wù)端口的方式,比如你的FTP服務(wù)僅限于一些比較熟悉的朋友,如果他們上網(wǎng)環(huán)境無法固定(無法提供IP屏蔽),可以將相關(guān)服務(wù)端口改變并通知他們,這樣可以使大部分網(wǎng)絡(luò)上的掃描器無法發(fā)現(xiàn)的該服務(wù)的存在,也就使那些比較懶(沒有太多時(shí)間做全端口掃描)的黑客放棄對你站點(diǎn)的糾纏。
第四,如果有特殊興趣,可以使用端口偽裝技術(shù),讓黑客進(jìn)入你的圈套,被假象迷惑,從而保護(hù)你真實(shí)的服務(wù)。這樣你還可以偷偷對黑客的入侵和攻擊行為進(jìn)行跟蹤和分析。
經(jīng)典案例:
如果有人說,我控制了全球50%的web服務(wù)器,你一定以為他瘋了,而apache Chunk分段溢出漏洞的發(fā)布,真的讓使句話成為了事實(shí)!
Apache一直是自由主義者,共享主義者的一面大期,很少有商業(yè)公司,能夠在microsoft的奮力追趕下,不會失去市場優(yōu)勢的,不管是Apple(他們的視窗操作系統(tǒng),windows的前身),NetScape(被IE兩三年內(nèi)輕松擊敗),
Borland(borland C++被后來居上的Visual C++輕松擊敗), 碩果僅存的Oracle還被老巨無霸IBM干到了老二的位置上,而一個(gè)非商業(yè)組織的Apache Web Server能夠立壓微軟大力推廣的IIS多年,一直保持應(yīng)用服務(wù)器全球使用率50%以上的比例,甚至于不少人在windows主機(jī)上用apache做web服務(wù)器(他們通常都是被IIS漏洞搞的心力憔悴了),這不能不算一個(gè)奇跡了,在IIS千瘡百孔的時(shí)代,雖然apache也有一些諸如phf.cgi,nph-test.cgi等有名的漏洞,但是還都停留在附屬配套軟件身上,本身一直還都沒出過太出格的問題,也深受全球用戶的好評,但是這次,micro$oft的fans們終于可以長出一口氣了,"看看,敢情apache也有這毛病不是"。
bug起源是這樣的,本身apache對chunk數(shù)據(jù)分段的支持是有長度驗(yàn)證的,但是由于對無符號數(shù)意識不夠,導(dǎo)致攻擊者精心構(gòu)造的分段數(shù)據(jù)包可以在逃避驗(yàn)證后,造成內(nèi)存分配的溢出!從而執(zhí)行攻擊者精心構(gòu)造的代碼。涉及范疇包括了絕大部分的apache版本,也就是相當(dāng)于全世界50%以上的Web Server都有這個(gè)問題!
與此類似的還有以前Sendmail各個(gè)版本屢補(bǔ)不凈的溢出問題(弄的我現(xiàn)在看到senmail的就怕怕),幾個(gè)全球流行的ftp軟件屢補(bǔ)不凈的溢出漏洞。甚至一些路由設(shè)備,乃至防火墻,也常常暴露出同樣問題,真是一言難盡。
總結(jié):
溢出攻擊法的特點(diǎn)是,只要用足夠的技術(shù),對系統(tǒng)有足夠的認(rèn)識和分析,就能夠通過溢出攻擊獲得對系統(tǒng)的控制,從而達(dá)到攻擊的最高目標(biāo),而這個(gè)過程中,不需要依賴于密碼的破解,嗅探,偵聽等手段,也不需要任何非技術(shù)的手段和騙局,事實(shí)上,如果能夠成功實(shí)施溢出攻擊,即便是面對一個(gè)已知的漏洞,在沒有特別傻瓜化的工具情況下,也需要非常高的系統(tǒng)認(rèn)識能力和低層編程素質(zhì),一些精深的老黑客樂于此道而不思其余,是很有道理的。
溢出攻擊法所以前文章所言,仍然屬于特殊字符構(gòu)造范疇,所不同的是,其攻擊的思想已經(jīng)不在簡單是面向應(yīng)用程序本身的程序設(shè)計(jì)問題,而是更多進(jìn)入了系統(tǒng)級的考慮,包括內(nèi)存段的分配,不同系統(tǒng)下匯編的規(guī)范,協(xié)議層的報(bào)文規(guī)范,這些都是其他特殊字符構(gòu)造法所沒有涉及的。精通溢出攻擊并能通過該領(lǐng)域進(jìn)行問題研究者,是最容易讓全世界網(wǎng)管都嚇一跳的人