基于緩沖區溢出漏洞的攻防方案設計_第1頁
基于緩沖區溢出漏洞的攻防方案設計_第2頁
基于緩沖區溢出漏洞的攻防方案設計_第3頁
基于緩沖區溢出漏洞的攻防方案設計_第4頁
基于緩沖區溢出漏洞的攻防方案設計_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于緩沖區溢出漏洞的攻防方案設計基于緩沖區溢出漏洞的攻防方案設計信息安全 071 班 范靜霞 指導老師:何巖內容摘要:內容摘要:。關鍵詞:關鍵詞:目目 錄錄第 1 章 引言1第 2 章 系統漏洞22.1 漏洞的概念22.2 漏洞的分類2系統配置不當2口令失竊3嗅探未加密通訊數據3設計存在缺陷3軟件編寫存在 bug4第 3 章 本地緩沖區溢出的原理及實現53.1 緩沖區概念53.2 緩沖區溢出攻擊原理63.3 緩沖區溢出實現方式7利用跳轉指令實現溢出7定位參數地址實現溢出9溢出實現用戶權限提升16第 4 章 基于緩沖區溢出的防御方法194.1 關閉不需要的特權程序194.2 關閉或修改系統的某些

2、版本信息204.3 使堆棧向高地址方向增長214.4 及時給程序漏洞打補丁214.5 提供高級的用戶幫助21第 5 章 總結23參考文獻24第第 1 1 章章 引言引言目前中國互聯網已經進入寬帶時期,網絡用戶和網絡資源持續增長。但是,互聯網的開放性、商業化和應用系統的復雜性帶來的安全風險也隨之增加,各種安全漏洞的大量存在并不斷攀升仍是網絡安全的最大隱患,即使計算機系統裝上了防火墻和防病毒軟件,但遺憾的是系統本身的漏洞難以避免。近年由CERT/CC 發布的系統安全忠告中關于緩沖區溢出(又稱堆棧溢出) 漏洞占 56.76%以上。緩沖區溢出可以讓普通用戶通過運行一個“錯誤”的程序,來使系統運行只有在

3、超級管理員環境下才能運行的程序。一旦系統存在著緩沖區溢出漏洞,系統就有可能被黑客完全控制。所以,緩沖區溢出漏洞是致命的。緩沖區溢出攻擊之所以成為一種常見的攻擊手段,其原因在于緩沖區溢出漏洞太普通了,并且易于實現。而且,緩沖區溢出所以成為遠程攻擊的主要手段,其原因在于緩沖區溢出漏洞給予了攻擊者所想要的一切:植入并且執行攻擊代碼。被植入的攻擊代碼以一定的權限運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。本文簡單介紹了緩沖區溢出的基本原理及本文講述了漏洞的基本概念,并列述了漏洞的分類。漏洞的種類繁多,主要就緩沖區漏洞的軟件編寫存在 bug、系統配置不當、口令失竊、明文通訊信息被監聽以及初始

4、設計存在缺陷等方面作了簡單的介紹。在簡單論述漏洞的同時,本文主要以緩沖區溢出作為主要論點。下面介紹了緩沖區的概念及緩沖區溢出的基本原理,并介紹了緩沖區溢出漏洞的三大實現方式:利用跳指令實現溢出、定位參數地址實現溢出、溢出實現用戶權限提升。并從預防、發現、抵御緩沖區溢出攻擊以及攻擊后的程序恢復等方面對目前有代表性的防御、檢測方法和攻擊恢復技術進行了歸納、分析和比較,指出這些方法和技術的弊端以及可能采取的規避手段。提出了在攻擊技術不斷發展的情況下,徹底、有效地解決緩沖區溢出所面臨的問題。第第 2 2 章章 系統漏洞系統漏洞2.12.1 漏洞的概念漏洞的概念漏洞也叫脆弱性,是在硬件、軟件、協議的具體

5、實現或系統安全策略上存在的缺陷。從而可以使攻擊者能夠在未授權的情況下訪問或破壞系統。這些缺陷被非法用戶利用,可以突破系統的審計和訪問控制等安全機制,對系統及其承載數據的完整性、保密性和可用性造成威脅。漏洞會影響到很大范圍的軟硬件設備,包括系統本身及其支撐軟件、網絡客戶和服務器軟件、網絡路由器和安全防火墻等,即在不同的軟硬件設備中都可能存在不同的安全漏洞問題。漏洞無處不在,入侵者只要找到復雜的計算機網絡中的一個漏洞,就能輕而易舉地闖入系統。所以,了解這些漏洞都有可能在哪里,對于修補它們至關重要。通常,漏洞主要表現在軟件編寫存在 bug、系統配置不當、口令失竊、明文通訊信息被監聽以及初始設計存在缺

6、陷等方面。2.22.2 漏洞的分類漏洞的分類系統配置不當系統配置不當(1)默認配置的不足:許多系統安裝后都有默認的安全配置信息,通常被稱為 easytouse。但遺憾的是,easytouse 還意味著 easytobreakin。所以,一定對默認配置進行揚棄的工作。(2)管理員懶散:懶散的表現之一就是系統安裝后保持管理員口令的空值,而且隨后不進行修改。要知道,入侵者首先要做的事情就是搜索網絡上是否有這樣的管理員為空口令的機器。(3)臨時端口:有時候為了測試,管理員會在機器上打開一個臨時端口,但測試完后卻忘記了禁止,這樣就會給入侵者有洞可尋、有漏可鉆。通常的解決策略是:除非一個端口是必須使用的,

7、否則禁止它。一般情況下,安全審計數據包可用于發現這樣的端口并通知管理者。(4)信任關系:網絡間的系統經常建立信任關系以方便資源共享,但這也給入侵者有可趁之機、間接攻擊的可能,例如,只要攻破信任群中的一個機器,就有可能進一步攻擊其他的機器。所以,要對信任關系嚴格審核、確保真正的安全聯盟。口令失竊口令失竊(1)弱不禁破的口令:就是說雖然設置了口令,但是非常簡單,入侵者可以輕而易舉的攻破。(2)字典攻擊:就是指入侵者使用一個程序,該程序借助一個包含用戶名和口令的字典數據庫,不斷地嘗試登錄系統,直到成功進入。毋庸置疑,這種方式的關鍵在于有一個好的字典。(3)暴力攻擊:與字典攻擊類似,但這個字典卻是動態

8、的,就是說,字典包含了所有可能的字符組合。例如,一個包含大小寫的 4 字符口令大約有 50 萬個組合,1 個包含大小寫且標點符號的 7 字符口令大約有 10 萬億組合。對于后者,一般的計算機要花費大約幾個月的時間才能試驗一遍。.3 嗅探未加密通訊數據嗅探未加密通訊數據(1)共享介質:傳統的以太網結構很便于入侵者在網絡上放置一個嗅探器就可以查看該網段上的通訊數據,但是如果采用交換型以太網結構,嗅探行為將變得非常困難。(2)服務器嗅探:交換型網絡也有一個明顯的不足,入侵者可以在服務器上特別是充當路由功能的服務器上安裝一個嗅探器軟件,然后就可以通過它收集到的信息闖進客戶端機器以及信任

9、的機器。例如,雖然不知道用戶的口令,但當用戶使用 Telnet 軟件登錄時就可以嗅探到他輸入的口令了。(3)遠程嗅探:許多設備都具有 RMON,遠程監控功能以便管理者使用公共體字符串進行遠程調試。隨著寬帶的不斷普及,入侵者對這個后門越來越感興趣了。.4 設計存在缺陷設計存在缺陷(1)TCP/IP 協議的缺陷:TCP/IP 協議現在已經廣為應用、但是它設計時卻是在入侵者猖狂肆虐的今天之很早以前設計出來的。因此,存在許多不足造成安全漏洞在所難免,例如 smurf 攻擊、ICMPUnreachable 數據包斷開、IP 地址欺騙以及 SYNflood。然而,最大的問題在于 IP 協議

10、是非常容易“輕信”的,就是說入侵者可以隨意地偽造及修改 IP 數據包而不被發現。現在 Ipsec 協議已經開發出來以克服這個不足,但還沒有得到廣泛的應用。.5 軟件編寫存在軟件編寫存在 bugbug無論是服務器程序、客戶端軟件還是操作系統,只要是用代碼編寫的,都會存在不同程度的 Bug。Bug 主要分為以下幾類:(1)緩沖區溢出:指入侵者在程序的有關輸入項目中了輸入了超過規定長度的字符串,超過的部分通常就是入侵者想要執行的攻擊代碼,而程序編寫者又沒有進行輸入長度的檢查,最終導致多出的攻擊代碼占據了輸入緩沖區后的內存而執行。(2)意料外的聯合使用問題:一個程序經常由功能不同的多層

11、代碼組成,甚至會涉及到最底層的操作系統級別。入侵者通常會利用這個特點為不同的層輸入不同的內容,以達到竊取信息的目的。(3)不對輸入內容進行預期檢查:有些編程人員工作不負責任,對輸入內容不進行預期的匹配檢查,使入侵者輸送炸彈的工作變得非常簡單。(4)Raceconditions:多任務多線程的程序越來越多,在提高運行效率的同時,也要注意 Raceconditions 的問題。比如說:程序 A 和程序 B 都按照“讀/改/寫”的順序操作一個文件,當 A 進行完讀和改的工作時,B 啟動立即執行完“讀/改/寫”的全部工作,這時 A 繼續執行寫工作,結果是 A 的操作沒有了表現。入侵者就可能利用這個處理

12、順序上的漏洞改寫某些重要文件從而達到闖入系統的目的,所以,編程人員要注意文件操作的順序以及鎖定等問題。第第 3 3 章章 本地緩沖區溢出的原理及實現本地緩沖區溢出的原理及實現3.13.1 緩沖區概念緩沖區概念緩沖區,又稱中立區、中立地帶等,指的是兩地的交界處因為戰爭或其他因素,而劃定出的帶狀地區,此帶狀地區并不完全屬于兩方之中的一方,通常由兩方共管或是由第三方協助管理。緩沖區是地理空間目標的一種影響范圍或服務范圍,具體指在點、線、面實體的周圍,自動建立的一定寬度的多邊形。緩沖區溢出的根本原因在于語言本身的一些特性。從數據結構的角度來說,最根本的原因是由于指針、數組的存在,導致了一系列存儲操作上

13、的問題。而直接的原因則是“沒有對數組的越界加以監視和限制” 。程序編寫者的經驗不足或粗心大意使得緩沖區溢出幾乎無處不在,導致程序不夠健壯,為緩沖區溢出攻擊留下了隱患。緩沖區溢出攻擊利用了程序設計語言的安全缺陷,及程序員編寫代碼時的疏漏,將特定的內容寫到緩沖區以外的特定內存空間,以達到控制或破壞系統的目的。同時也得滿足以下幾個條件:(1)緩沖區溢出,首先要有一個緩沖區,當然不是所有的緩沖區都可以,要求是一塊有固定大小的緩沖區,而且還要向這塊緩沖區中拷貝數據。(2)在程序中存在不規范,不安全的代碼,這是發生緩沖區溢出攻擊最主要的前提條件。黑客就是最先利用這些不安全,不規范的代碼,來首先取得系統的控

14、制權的,然后才利用系統的控制權,進一步實施攻擊,產生更大的危害。(3)程序運行中棧的安排結構,有利于黑客展開緩沖區溢出攻擊,這是因為在程序運行時通常棧是向下增長的,即后進棧的數據的地址小于先進棧的數據的地址。這樣當發生函數調用時,首先壓棧的是該函數的參數,然后是函數的返回地址,接下來是基指針,然后在進入函數體以后還會保存一些寄存器的值,再把這些寄存器的值壓入棧頂,最后才是函數體中聲明的各個局部變量(即前文所說的緩沖區),也有可能包含一些函數指針。因此得出結論:在函數運行中緩沖區的地址低于寄存器的地址,低于基指針的地址,低于返回地址的地址,低于該函數的參數的地址。所以要是向緩沖區中拷貝超過其容量

15、大小的數據,那么多出來的數據就會覆蓋寄存器的值,覆蓋基指針的值,覆蓋返回地址的值覆蓋參數的值,也完全可以覆蓋上層函數中的緩沖區等等,只要拷貝的數據足夠長。而且棧所在的地址范圍又低于代碼所在的地址范圍,這樣也完全可能覆蓋程序中的代碼。(4)既使上訴條件都滿足,也不一定會發生緩沖區溢出攻擊,只能說程序中存在緩沖區溢出漏洞,這是因為不是所有的漏洞都能被黑客利用。有些只是程序中存在的缺陷,黑客并沒有辦法或者說暫時沒有辦法通過該漏洞取得系統的控制權限,來完成其進一步攻擊的目的。3.23.2 緩沖區溢出攻擊原理緩沖區溢出攻擊原理當正常的使用者操作程序的時候,所進行的操作一般不會超出程序的運行范圍,數據被添

16、加到分配給該緩沖區的內存塊之外,會發生緩沖區溢出,這時候就會出現數據泄漏或侵占了其它的數據空間。緩沖區溢出的攻擊原理就是越過緩沖區長度界限向程序中輸入超出其常規長度的內容,造成緩沖區的溢出從而破壞程序的堆棧,使程序運行出現特殊的問題轉而執行其它指令。一般來說,單單的緩沖區溢出,并不會產生安全問題,如果將溢出送到能夠以 root 權限或其它超級權限運行命令的區域去執行某些代碼或者運行一個 shell 的時候,該程序就是以超級用戶的權限控制了計算機。例如,有一段程序段如圖 3.1(a)所示,運行時當進入一個過程,就有一個活動記錄累筑于棧頂。sub 的活動記錄如圖 3.1(b)所示,包含連接數據、形

17、式單元、局部變量、局部數組的內情向量和臨時工作單元等。其中連接數據有兩個:一個是老 SP 值,即前一活動記錄的地址,另一為返回地址。圖 3.1 緩沖區漏洞的例子argv1是通過命令行傳遞給 main 的參數,由于 strcpy()函數不進行越界檢查,argv1中的內容將完整地復制到 buf 中,如果 arg1中的內容長度超出了 buf 的范圍,多余的內容將被寫出 buf 的后續地址中,而在函數堆棧中,局部變量之后存放的有 SP 幀指針和函數返回地址。因此黑客可以通過填寫argv 的內容,在 strcpy 出現緩沖區溢出時讓程序轉去執行相應的攻擊代碼,完成對系統的攻擊。如圖 3.1(c)所示,老

18、 SP 值被修改指向緩沖區的地址返回地址被修改指向惡意代碼的入口地址。當 sub 返回時,程序將轉去執行惡意代碼,從而達到攻擊目的。因此,為防止緩沖區溢出攻擊,開發軟件時應該盡量使用帶邊界檢查的函數,或主動進行邊界檢查。3.33.3 緩沖區溢出實現方式緩沖區溢出實現方式利用跳轉指令實現溢出利用跳轉指令實現溢出在調用函數時,以下內容會依次壓棧:該函數的參數(按從右向左的順序壓棧),函數的返回地址,為該函數調用分配局部棧空間之前的 EBP 寄存器的值。這些東西調試程序的時候看一看對應的匯編代碼、對應地址處的內存內容和相關寄存器的值就會一清二楚。函數調用完成后會執行 ret 指令,ret 指令執行完

19、后 esp 寄存器中會指向棧的原始區(執行函數調用之前的那個棧的棧頂),所以把 shellcode 放在棧的原始區,把返回地址修改后指令 jmpesp 的地址就可以,這條 jmpesp 指令的地址是通過在操作系統的幾個核心 DLL 中查找的。整個實驗過程就是寫代碼時調用一個函數,然后在調用函數的過程中實現棧溢出。圖 3.2 溢出前后堆棧分布狀態對照圖 3.2,在程序正常執行時,memcpy 函數被執行完畢后,指令指針會返回至 ret 地址處,繼續執行 memcpy 函數調用處的后續指令;同時,執行完ret 指令后 ESP 指針也會指向堆棧原始區(調用 memcpy 函數前一時刻的堆棧分布) 。

20、因此,我們可以將溢出代碼 shellcode 存在堆棧原始區,而剩下的工作就是在 memcpy 執行返回時讓 EIP 指針指向原始區(也就是 ESP 指針指向的地址)即可。如何通過 ret 返回地址確定此時的堆棧 ESP 指針指向呢?在這里采用的方法是通過跳轉指令“jmpesp”(無條件跳轉至 esp 指向處執行)。通過在用戶地址空間中查找到包含有“jmpesp”指令的存儲地址,用該地址覆蓋 ret 返回地址就可以了。在具體實現時,我們通過三個步驟完成緩沖區溢出:(1)編寫前導碼。所謂前導碼就是用于覆蓋局部變量到 ret 返回地址之間的堆棧空間(不包括ret 返回地址空間)的指令碼。前導碼僅是

21、用于填充堆棧,所以其內容不受限制。我們需要在實際的調試中來確定前導碼的大小。(2)查找 jmpesp 指令地址。用”jmpesp”指令的地址覆蓋 ret,就可以在 memcpy 執行返回后,讓 CPU執行跳轉指令,所以首要解決的是在用戶空間中找到含有“jmpesp”指令的地址。通過 VC+6.0 的反匯編功能得到“jmpesp”指令的機器碼為 0 xFFE4。利用FindJmpesp 工具進行指令查找,確定一個含有“jmpesp”指令的內存地址。(3)shellcode 功能體。shellcode 功能體實現了溢出后主要的執行功能,如創建超級用戶,提升用戶權限等。在這里我們通過自定義指令來實現

22、彈出用戶對話框。攻擊者可以利用緩沖區溢出漏洞,通過溢出來獲取程序的控制權。若此程序具有足夠的權限,則攻擊者就因此獲得了系統的控制權。要實施一次有效的緩沖區溢出攻擊,攻擊者必須完成如下任務:(a)在程序的地址空間里植入適當的代碼(稱為 shellcode)用于完成獲取系統控制權等非法任務。(b)通過修改寄存器或內存,讓程序執行流跳轉到攻擊者植入的shellcode 地址空間執行。下面以棧溢出為例,簡要介紹一下這兩個任務的實現方法:(a)shellcode 植入:當緩沖區溢出發生在程序的 IO 操作附近時,攻擊者可以直接利用程序的輸入,向程序中植入 shellcode。(b)程序執行流程的跳轉:s

23、hellcode 植入后,緩沖區溢出便會發生,以上面的棧溢出為例,如圖 3.3,函數調用的返回地址被覆蓋為 AAAAA,這樣當此函數執行完畢返回時,程序執行流會跳轉到 0 xAAAAA(即 shellcode)處繼續執行。圖 3.3 堆棧溢出定位參數地址實現溢出定位參數地址實現溢出首先看下面的代碼片段。Void overflow(const char* ptr, int len) Char buff400; Memcpy(buff,ptr,len);其中第二參數 len 的值為第一參數 ptr 指向的字符串長度。在函數參數 ptr 不為空的情況下,當 len 小于 400 時,該段代碼能夠正常

24、運行。overflow 函數被調用執行時內存堆棧分布如圖 3.4 左側所示:首先是overflow 調用執行后的下一條指令地址入棧(ret 返回地址),overflow 調用前堆棧基址指針入棧(原 ebp),接下來堆棧基址指針指向當前棧頂(ebp 指向),最后 esp 棧頂指針減去若干字節(大于 400)完成緩沖區劃分。而 ebp 指針減去 400就應是局部變量 buff 指針指向。圖 3.4 緩沖區溢出前后堆棧的分布當 len 大于 400 時,該段代碼就會產生溢出,如圖 3.4 右側所示,溢出的數據會覆蓋原 ebp 地址和 ret 返回地址,使其遭到破壞。設想:(1)用 shellcode

25、 指令首地址覆蓋 ret 返回地址,當 buff 緩沖區存放shellcode 時,shellcode 指令首地址即為 buff 緩沖區地址。(2)保持原 ebp 基址不被溢出數據覆蓋掉,即用 overflow 調用前的 ebp基址覆蓋原 ebp 基址。(3)在 shellcode 相關指令被執行完成后,后續代碼應繼續被執行,利用跳轉指令可以執行 overflow 后續代碼。所以溢出后的程序執行流程就是:指令寄存器 EIP 指向 buff 基址執行shellcode 指令,待 shellcode 相關指令完成后通過 jmp 跳轉指令跳轉至 ret返回地址繼續執行。將 shellcode 指令按

26、功能分為三部分來進行考慮。第一部分是 shellcode頭,其主要功能是保護當前寄存器狀態,為執行 shellcode 功能體做準備;第二部分是 shellcode 功能體,由其完成一定的功能如彈出對話框、添加新用戶等;最后一部分就是 shellcode 尾,其功能是恢復寄存器狀態、跳轉至正常執行時下一條指令地址。另外 shellcode 的最后 4 字節應該是覆蓋 ret 返回地址的地址。(1)shellcode 頭。功能:在內存堆棧中劃分額外空間(shellcode 功能體使用),并保護當前寄存器狀態。實現代碼:_asmsub esp, 1024hpushad(2)shellcode 功能

27、體。功能:完成具體執行功能。實現代碼:具體參見實現步驟。利用 ShellExecuteAAPI 函數運行控制臺程序 net 實現添加系統用戶是一個不錯的選擇,net 添加用戶及提升用戶權限命令如下:新建用戶:netuserusernamepassword/add用戶所屬組:netlocalgroupadministratorsusername/add調用執行:ShellExecuteA(0,“open”,“net”,net 執行參數,SWHIDE)其中 username 是新建用戶名稱,password 是用戶口令,/addShellExecute 的功能是運行一個外部程序(或者是打開一個已注

28、冊的文件、打開一個目錄、打印一個文件等等),并對外部程序有一定的控制。如果指定的文件是可執行文件,函數將以 open 的方式打開這個文件。(3)shellcode 尾。功能:恢復寄存器狀態;shellcode 功能體執行完成后,跳轉到指定代碼地址繼續執行;使用新地址覆蓋原 ebp 地址及 ret 返回地址。實現代碼:_asm popad add esp, 102Ch mov edx, OxXXXXXXXX jmp edx通過 popad 指令將恢復所有普通寄存器先前狀態。恢復棧頂指針。通過 jmp 指令無條件跳轉至 0 xXXXXXXXX 處執行指令。具體實現過程如下:(1)使用 VC 編寫項

29、目文件:CreateShellCode、OverFlowClient 和OverFlowServer。(2)生成 shellcode 功能體(a)首先設置 OverFlowClient 項目為啟動項。(b)雙擊打開 OverFlowClient.cpp 源文件,在該源文件中需要填寫的代碼有:kernel32.dll 基址(第 21 行) ,LoadlibraryA 函數的絕對內存地址(第23 行)和 shellExecuteA 函數(隸屬于 Shell32.dll 動態庫)的絕對內存地址。(c)編譯并生成 OverFlowClient.exe,執行 OverFlowClient.exe,確定系

30、統是否新建了 jlcss 用戶,并隸屬 Administrators 組。(3)生成 shellcode 指令碼(a)設置 CreateShellCode 為啟動項。雙擊打開 CreateShellCode.cpp 源文件,CreateShellCode 的工作流程是:首先生成 shellcode 頭,并將相關指令碼寫入 shellcode.shc 文件中;接下來是生成 shellcode 功能體,功能體代碼來自 OverFlowClient.exe 中 shellcode函數執行體,將功能體代碼追加到 shellcode.shc 中;最后是生成 shellcode尾,同樣將其指令碼追加到 s

31、hellcode.shc 中。(b)這里需要填寫的宏數值有:SHELLCODEBODYSTART(OverFlowClient.exe 中 ShellCode 主體起始偏移地址) ;SHELLCODEBODYLEN(OverFlowClient.exe 中 ShellCode 主體代碼長度) ;CORRECTRETURNADDR(OverFlowServer 中 overflow 調用完成后程序正常執行返回地址,即 OverFlow 正常調用完成后的下一條指令地址) ;在 OverFlowServer 中函數 OverFlow 調用執行前,ebp 基地指針地址;OverFlow 溢出返回地址,

32、即函數溢出后 shellcode 得以執行的首地址。獲取 SHELLCODEBODYSTART、SHELLCODEBODYLEN 值調試 OverFlowClient.exe(將該項目設置為啟動項)確定 ShellCode 函數入口偏移地址及函數體大小,調試過程參見圖 3.3 所示。圖 3.5 shellcode 函數開始、結束偏移地址根據調試結果填寫 CreateShellCode.cpp 源文件中 SHELLCODEBODYSTART宏和 SHELLCODEBODYLEN 宏的值。其它數值需要通過調試 OverFlowServer 來獲取,而 OverFlowServer 的執行又依賴于

33、shellcode.shc 文件,所以暫且編譯生成 CreateShellCode.exe文件,執行該文件生成臨時 shellcode.shc 文件。(4)調用 OverFlowServer通過上述步驟,已經獲得了 ShellCode 執行體指令碼,還需要獲取溢出后程序正常返回地址、OverFlow 函數調用前 ebp 基礎指針地址和 shellcode 執行的緩沖區首地址。(a)OverFlow 正常調用返回時的下一條指令地址。設置 OverFlowServerfiles 為啟動項,雙擊打開 OverFlowServer.cpp 文件。程序首先打開存放 shellcode 指令碼的文件(默認

34、名稱為 shellcode.shc),讀取 shellcode.shc 的全部內容至接收緩沖區中。接下來就是利用 memcpy 函數實現接收緩沖區的拷貝,目標地址是 OverFlow 函數內的局部緩沖區,該緩沖區默認大小為 450 字節,需要根據實際調試結果重新確定其大小。最后在 OverFlow調用完成后程序繼續執行(溢出執行后程序依然能夠正常繼續運行)。調整 TempBuffer 緩沖區大小,使其大于臨時 shellcode 指令碼長度,這樣做的目的是讓程序正常執行(不發生溢出) ,以便我們能夠獲取 OverFlow 函數執行調用后的正確返回地址。調試獲取 OverFlow 函數正常調用執

35、行后的下一條指令地址。調試過程如圖 3.6 所示。圖 3.6 函數溢出后返回地址填寫該指針地址到 CreateShellCode.cpp 文件中。(b)OverFlow 函數調用前 ebp 基地址指針。單步調試程序定位到 OverFlow 函數入口處,獲取此時的 EBP 指針地址,如圖 3.7 所示。圖 3.7 verFlow 調用執行前 EBP 指針地址填寫 EBP 指針地址到 CreateShellCode.cpp 文件中。(c)最后確定 shellcode 的最后 4 字節,從原理中可知需用這 4 字節數覆蓋調用返回地址,使得 shellcode 得以執行。從 OverFlowServe

36、r 程序又可知shellcode 最后被加載到 TempBuffer 緩沖區,所以只要用 TempBuffer 緩沖區首地址覆蓋調用返回地址,在程序溢出后 shellcode 便會執行了。調用OverFlowServer.exe 確定 OverFlow 調用執行過程中 TempBuffer 緩沖區的首地址。調試過程如圖 3.8 所示。圖 3.8 局部變量內存地址將 TempBuffer 緩沖區首地址填寫到 CreateShellCode.cpp 文件中。(5)調試確定 TempBuffer 緩沖區大小調試 OverFlowServer.exe 得到 OverFlow 調用返回時的地址,將返回地

37、址與 shellcode.shc 中的十六數相比較,有三種比較結果:(a)返回地址是 shellcode 最后 4 字節數據。函數返回時執行shellcode。(b)返回地址沒有在 shellcode.sh 中,緩沖區空間過大,溢出未發生。可以縮小緩沖區空間或在最后 8 個字節前用 0 x90(空指令)補充。(c)返回地址在 shellcode.sh 中(不是最后 4 字節數據),緩沖區空間過小。放大緩沖區空間。當改變 TempBuffer 緩沖區大小時,其首地址可能會發生變動,調試確定TempBuffer 首地址,重新填寫 CreateShellCode.cpp,并重新生成shellcode

38、.shc。經過多次調試后確定緩沖區大小,當滿足第一種比較結果時,緩沖區溢出就可以執行下去。運行程序,查看系統用戶 jlcss(若 jlcss 用戶已存在,請先將其刪除再運行程序)及其所屬用戶組。溢出實現用戶權限提升溢出實現用戶權限提升Windows 每年都會有無數的漏洞被曝光,其中影響最大危害最深的就是溢出漏洞。而溢出漏洞又分為兩類,一類是遠程溢出漏洞,一類是本地溢出漏洞,前者經常被黑客利用來入侵網絡上的主機,后者通常被用來進行本地的賬戶權限提升。Windows 的本地權限溢出漏洞有很多,如最新的MicrosoftWindows 鍵盤事件權限提升漏洞。該漏洞通過向以更高權限運行的桌面應用程序(

39、如explorer.exe)發送惡意的鍵盤事件,以此得到一個擁有最高權限的 shell,在這個 shell 中可以執行任意命令,例如建立刪除賬戶,訪問修改文件等,當然也包括將用戶級別的賬戶提升為系統權限。1、設置溢出文件所屬用戶(1)復制文件 attack 和 overflow 到 guest 用戶主目錄/home/guest 中。(2)切換工作目錄至/home/guest/,修改 attack 文件屬性及用戶權限,要求文件隸屬 guest 用戶,隸屬 guest 組,具體命令:chownguestattack、chgrpguestattack。(3)設置 overflow 文件 suid 屬

40、性,具體命令:chmoda+soverflow。2、切換用戶登錄注銷當前用戶(root),以 guest 用戶身份登錄系統。3、提升權限(1)輸入命令:whoami,當前登錄的用戶是 guest。(2)輸入命令:cat/etc/shadow,嘗試查看陰影文件,此時系統提示沒有這個文件或目錄。上述情況證實用戶有對陰影文件的訪問權,其它任何用戶均無此權限。(3)輸入命令:passwdroot,嘗試修改 root 用戶登錄口令,此時系統提示 Only root can specify a user name。(4)執行 attack 應用程序。(5)當運行 attack 后出現“sh-3.1#”提示

41、符時,表明緩沖區溢出成功。此時我們就擁有了超級用戶(root)的權限,擁有對陰影文件的訪問權限,隨后我們可以用口令破解程序(如 john)對該陰影文件進行口令破解。(6)在溢出成功后對 root 口令進行修改,輸入命令:passwdroot 修改root 用戶口令。4、 root 用戶重新登錄注銷結束當前會話,以 root 身份重新登錄系統。(1)獲取 explorer.exe 進程的 PID 值由于漏洞利用程序 keybd.exe 的溢出原理,需要用到 explorer.exe 進程的PID 值。我們的第一步工作就是得到 explorer.exe 進程所相對應的 PID 值。右鍵點擊工具欄,

42、選擇任務管理器,在進程標簽中可以看到當前系統中運行的所有進程,查看進程的 PID 值。(2)用keybd.exe進行溢出點擊開始運行,輸入CMD運行命令提示符,在命令提示符中運行keybd。exe,其溢出格式如下keybd。exeexplorer。exe 進程的 PID 值,根據上文中得出的 PID 值,我們輸入keybd。exe1300即可。如果溢出成功,會出現一個新的命令提示符窗口。(3)得到系統權限溢出成功后,使用 NC 來獲取一個擁有系統權限的 shell。在命令提示符中運行 NC,輸入命令nc-vvlocalhost65535,回車后就會得到一個擁有系統權限的 shell,在這個 s

43、hell 中可以執行任意命令,我們的目標是將當前使用的用戶權限賬戶提升為管理員權限。第第 4 4 章章 基于緩沖區溢出的防御方法基于緩沖區溢出的防御方法防范緩沖區溢出,要從主觀和客觀兩方面進行入手,主觀方面,要提高程序員的編程水平;客觀方面,從底層系統入手,啟用自動保護程序,盡量避免緩沖區溢出問題的發生,也可以從系統和軟件兩方面入手;遺憾的是,迄今所見的所有方法都具有弱點,因此它們不是萬能藥,但是它們會提供一些幫助。下面對于緩沖區溢出的特點,探討一下防范策略。在編寫程序的時候程序員有責任和義務養成安全編程的思想,應該熟悉那些可能會產生緩沖區溢出漏洞的函數,清楚那些在編程中要小心使用的函數。在軟

44、件測試階段,測試人員要專門對程序中的每個緩沖區作邊界檢查和溢出檢測。但是,由于程序員的經驗不足和測試工作不夠全面,目前還不可能完全避免緩沖區溢出漏洞,因此這些漏洞在已經使用以及正在開發的軟件中還是有存在的可能性,還需要在使用軟件時,對它做實時的監測。當前,由于計算機廠商和系統開發商的努力,現在的計算機一般使用一種叫數據執行保護(DEP)的技術,如果數據出現在標記為不被執行的內存頁中,CPU 將不予執行。從而有效的防護溢出漏洞。WindowsXPSP2 及WindowsServer2003 現在已支持這些技術,目前市面上的大多數的 32 位 CPU 及全部的 64 位 CPU,都支持 NoExe

45、cute(NX)這類安全增強技術。另外在 VisualStudio2003 及以后微軟的 VC+開發平臺中,編譯器都加入了一個/GS 開關(即緩沖區安全檢查設置項) ,該開關的打開,優化了代碼的順序,能有效防止因內存溢出而覆蓋程序重要數據現象的發生。默認情況下該開關是打開的。4.14.1 關閉不需要的特權程序關閉不需要的特權程序由于緩沖區溢出只有在獲得更高的特權時才有意義,所以帶有特權的程序都經常是緩沖區溢出攻擊的目標。這時候,關閉一些不必要的特權程序就可以降低被攻擊的風險,當有緩沖區溢出漏洞的程序還沒有補丁時,就可以用這種方法。4.24.2 關閉或修改系統的某些版本信息關閉或修改系統的某些版

46、本信息攻擊者攻擊某一個系統,必須事先通過某些途徑(如通過 rpc 連接)對要攻擊的系統做必要的了解,如版本信息等,然后再利用系統的某些設置直接或間接地獲取控制權。因此,防范緩沖區溢出攻擊的另一個方面就是對系統設置實施有效的安全策略。這些策略種類很多,比較典型措施有:(1)在裝有 Telnet 服務的情況下,通過手工改寫“/etc/inetd.conf”文件中的 Telnet 設置,使得遠程登錄的用戶無法看到系統的提示信息。具體方法是將 Telnet 設置改寫為:telnetstreamtcpnowaitroot/usr/sbin/tcpd/in.telnetd-h 末尾加上“-h”參數可以讓守

47、護進程不顯示任何系統信息,只顯示登錄提示,這樣用戶在發出遠程登錄的時候,沒有任何可用的信息,他不知道什么版本,自然想得到某種版本的漏洞信息就比較困難了。(2)改寫“rc.local”文件。默認情況下,當登錄 Linux 系統時系統運行rc.local 文件,顯示該 Linux 發行版本的名字、版本號、內核版本和服務器名稱等信息,這使得大量系統信息被泄露。將“rc.local”文件中顯示這些信息的代碼注釋掉,可以使系統不顯示這些信息。另一種方法是將保存有系統信息的文件/etc/issue.Net 和 issue 刪除。這兩個文件分別用于在遠程登錄和本地登錄時向用戶提供相關信息。刪除這兩個文件的同

48、時,仍需要完成方法一中的注釋工作,否則,系統在啟動時將會自動重新生成這兩個文件。(3)禁止提供 finger 服務。在 Linux 系統中,使用 finger 命令可以顯示本地或遠程系統中目前已登錄用戶的詳細信息。禁止提供 finger 服務的有效方法是,通過修改該文件屬性、權限(改為 600)使得只有 root 用戶才可以執行該命令。(4)處理“inetd。conf”文件。Linux 系統通過 inetd(超級服務器)程序根據網絡請求裝入網絡程序。該程序通過“/etc/inetd。conf”文件獲得inetd 在監聽哪些網絡端口,為每個端口啟動哪些特定服務等信息。因此,該文件同樣會泄露大量的敏感信息。解決問題的方法是,通過將其權限改為 600只允許 root 用戶訪問,并通過改寫“/etc/inetd。conf”文件將不需要的服務程序禁止掉,最后修改該文件的屬性使其不能被修改。還有預防 ping 命令處理等系統策略。4.34.3 使堆棧向高地址方向增長使堆棧向高地址方向增長緩沖區溢出的一個重要要素是植入的代碼成功地被執行。最常見的是被植入的代碼放在堆棧區中。通過修改操作系統核心,在核心層引入保護機制,限制代碼在堆棧區的執行,這樣,緩沖區溢出攻擊就不可能成功。到目前為止,本文在討論利用函數返回地址控制程序轉移到攻擊代碼的攻擊方法時,有一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論