999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

突破防護措施的shellcode技術研究

2007-12-31 00:00:00王永杰肖順平
計算機應用研究 2007年11期

摘要:緩沖區溢出漏洞是軟件系統中存在的最普遍的安全漏洞之一。各種防護措施大大增加了緩沖區溢出攻擊利用的難度,但是它們沒有從根本上解決問題,攻擊者利用各種手段仍可使攻擊成功。從攻擊者的角度出發,總結了近年來緩沖區溢出漏洞攻擊利用技術發展的情況,主要對溢出后突破防護措施的shellcode技術進行了詳細介紹和分析。

關鍵詞:緩沖區溢出; 凈荷; 多態外殼碼; 堆棧保護

中圖分類號:TP393.08文獻標志碼:A

文章編號:1001-3695(2007)11-0146-04

緩沖區溢出漏洞(buffer overflow flaw)是軟件系統中存在的最普遍的安全漏洞之一。自1998年開始,CERT/CC所發布的公告中,緩沖區溢出漏洞都要占漏洞總數的50%以上。更為嚴重的是,緩沖區溢出攻擊占了遠程網絡攻擊的絕大多數[1]。攻擊者若成功利用這類漏洞可以取得被攻擊程序的運行權限,從而有可能獲得系統的root權限或為進一步攻擊提供基本的訪問權限。

緩沖區溢出漏洞的大量存在、攻擊利用非常簡單、攻擊效果十分明顯對信息系統的安全構成了重大的威脅。安全研究人員對緩沖區溢出漏洞的檢測和防護進行了廣泛和深入地研究,安全廠商也生產了相應的產品。這些技術產品有效阻止了此類漏洞的攻擊利用或給攻擊利用增加了極大的難度。然而在過去的十多年里,在緩沖區溢出攻擊方面,攻擊者陸續發現了一些新的方法;在溢出后利用方面主要指shellcode,針對各種防護措施進行了不斷的改進。

1緩沖區溢出漏洞的攻擊技術發展

早在20世紀80年代初,國外就有人開始討論溢出攻擊。1988年的Morris蠕蟲就利用了UNIX系統上Fingerd守護進程的緩沖區溢出[2]。溢出漏洞是由于向固定長度緩沖區寫入數據時編程人員未對此進行邊界檢查或邊界檢查錯誤產生的。一旦發現漏洞,攻擊者會寫出相應的攻擊代碼(exploit)。攻擊代碼的工作主要是向緩沖區中輸入精心構造的代碼(shellcode),對一些重要的系統數據(如返回地址和堆管理數據結構)進行改寫,控制程序的流程跳轉到那段代碼上來執行,完成攻擊者預先設定的任務。因此從功能角度攻擊代碼可分為三個部分[3], 即攻擊向量(attack vector)、溢出方法(exploitation technique)、溢出負載(exploitation payload)。

通常意義的攻擊向量指的是攻擊者用來獲得對計算機或者網絡服務器非正常訪問的一種手段,從而可在目標主機中植入攻擊負載進行破壞活動。從這個意義上,可以把攻擊向量比做彈體,攻擊負載比做彈頭。彈體的目的是為了把彈頭運輸到指定地點,而真正起破壞作用的部分還在彈頭部分。攻擊向量通常包括漏洞、電子郵件附件、網頁、即時消息、聊天室以及其他的欺騙方法;而最常見的攻擊負載就是病毒,如特洛伊木馬、蠕蟲以及間諜軟件。

上面提到的攻擊向量是與整個攻擊過程相對的概念,它包括了漏洞。這里所指的攻擊向量是與漏洞相關的概念,實際上這時可以稱之為攻擊點或攻擊路徑。通常一個漏洞對應一個攻擊向量,但有時也可對應多個攻擊向量。微軟在2003年7月16日發布了MS03-26的公告和修補程序以修正Windows分布組件對象模型(DCOM)遠程過程調用(RPC)接口中的安全漏洞[4]。RPC是Windows 操作系統使用的一種遠程過程調用協議,RPC提供進程間交互通信機制。由于Windows RPC DCOM接口對報文的長度缺乏檢查從而導致基于堆的溢出,遠程攻擊者成功利用此漏洞可以本地系統權限在系統上執行任意指令。攻擊者可以從多條路徑即多個攻擊向量利用此漏洞,攻擊者只要能夠將特制請求發送到遠程計算機上的端口135、139、445或任何其他專門配置的RPC端口,就可能成功利用此漏洞以本地系統權限執行任意指令。

溢出方法即漏洞利用方法,用于控制目標進程轉到指定位置。經過十多年的發展,出現了許多新的緩沖區溢出漏洞利用方法。根據漏洞利用產生的先后順序,通常可把緩沖區溢出分為三代[5]:a)第一代為棧溢出(stack smashing)。利用的是位于棧上的緩沖區。這種形式出現最早,存在最廣泛,利用也最簡單。由于各種檢測和防護技術的使用,棧形式的溢出漏洞越來越少、利用的難度越來越大。b)第二代主要包括堆溢出(heap smashing)、指針改寫(pointer subterfuge)和off-by-one錯誤利用。c)第三代主要是格式化串(format string)漏洞利用。這種漏洞很容易在源代碼級被檢測出來,因此使用相對較少。

溢出負載是溢出之后執行的一段機器指令,也稱為shellcode。Shellcode的概念[6]最早出現于1996年。文獻[6]詳細描述了Linux系統中棧的結構和如何利用基于棧的緩沖區溢出。Aleph One還給出了如何寫打開一個shell(命令解釋器)的payload的方法,并給這段代碼賦予shellcode的名稱。由于被廣泛應用于攻擊代碼中,shellcode已經成為了payload的代名詞。

攻擊向量和溢出方法的多樣化,只是從一方面反應了攻擊技術的發展。從上面的分析可以看出,它們只解決了如何注入和如何截取目標進程控制權的問題。在CERT/CC、BugTrap等的漏洞公告中,通常會有漏洞測試代碼(proof-of-concept exploit)的鏈接。這些測試代碼就是最簡單的攻擊代碼。它們一般只是在溢出后打開一個綁定端口的shell(bind shell)。然而由于各種防護措施的阻礙,這些測試代碼往往不能奏效。從最早的payload如添加用戶或修改配置文件發展到shellcode,避免了修改系統文件從而減少了被管理員發現的可能,是一個很大的進步。但隨著網絡攻擊事件越來越多,造成的損失越來越大,個人、企業的安全意識大大加強。個人工作站上往往裝有個人防火墻、殺毒軟件等;企業在網絡邊界上也安裝有防火墻和入侵檢測系統(IDS)。如今僅打開shell的payload已不能滿足攻擊者的需要。比如目標主機有防火墻的保護,攻擊者就不能連接到綁定端口的shell上,從而導致攻擊失敗。因此攻擊者對shellcode的編寫進行了不斷地改進以繞過各式各樣的防護措施,使得這些防護措施失效,不能對目標系統進行保護。基于緩沖區溢出的攻擊要想獲得成功,必須考慮的防護措施包括防火墻、基于網絡的入侵檢測系統(NIDS)、應用過濾、堆棧保護和基于主機的入侵檢測系統(HIDS)[7]。下面分別就shellcode對抗防火墻、IDS和堆棧保護三種最常見的安全措施進行詳細的介紹和分析。

2Shellcode滲透防火墻

Shellcode按發生地點可分為本地shellcode和遠程shellcode。在攻擊者與目標之間建立連接是遠程shellcode的基本要求。可用下面幾種方式實現[8]:

a)監聽端口。

可細分為監聽新端口即綁定端口,它打開一個新端口進行監聽;重新使用原端口,包括端口復用和重新綁定原端口。

b)反向連接。

由攻擊者打開一個端口等待目標主機連接。

c)復用當前連接套接字(socket)。

使用getpeername或字串匹配查找socket。

綁定端口的shellcode被廣泛使用于漏洞測試代碼中。它新建一個socket,把它綁定在一個指定端口并在上面監聽。一旦有連接接入這個端口,shellcode就創建一個輸入/輸出句柄為新建socket的shell,從而使攻擊者能夠與目標主機實現最簡單的交互。而真實環境中由于受到防火墻的阻礙,攻擊者不能連接到新建的端口上。除非這些端口是防火墻允許的如21、53、80等端口,但它們通常已經綁定了服務程序。反向連接的shellcode不打開新的端口,而是主動連接到由攻擊者事先打開的端口,但如果目標主機在非軍事化區(DMZ)內,并且通常防火墻規則設置了阻止DMZ中主機主動向外的任何連接,這時反向連接仍不能成功。事實上,由于邊界防火墻的隔離,攻擊者通常不能直接接觸到企業或組織的內網主機,而只能直接訪問DMZ中放置的公開服務器設施如Web服務器、FTP服務器等。因此對于處在DMZ的服務器,防火墻規則設置得最嚴格,不但阻止除訪問企業提供的基本服務以外的所有外來連接,而且阻止服務器主動向外的所有連接。面對這樣的防火墻規則,傳統的綁定端口和反向連接的方法都將失效。為此攻擊者提出了各種方法來突破防火墻。例如針對Web服務器在溢出后創建PHP/ASP/CGI后門、紅色代碼2蠕蟲病毒使用的針對微軟Internet信息服務器(IIS)創建的后門等,但這些方法針對特定服務不具有通用性。為了達到通用性,shellcode只能使用漏洞服務程序的端口進行通信,稱此類shellcode為one-way shellcode[9]。實現方法包括上面提到的端口復用、重新綁定原端口以及復用當前連接socket。

通常,socket不能綁定在一個已經被服務程序使用的端口上。但是如果服務程序創建的socket沒有設置SO_EXCLUSIVEADDRUSE(獨占模式使用端口),并且服務程序由于方便的原因在綁定時(通過bind系統調用)只指定端口而不指定IP地址(使用INADDR_ANY即指定地址為0.0.0.0,該地址實際上表示不確定地址或任意地址)時,則可以在服務進程監聽的端口上綁定多個的socket。當然每個socket綁定的IP地址不同。此時,shellcode中設置socket的選項SO_REUSEADDR(通過setsockopt系統調用)并且指定目標主機的具體IP,然后把它綁定在服務端口上即可實現端口復用。當服務程序的soc ̄ket設置了SO_EXCLUSIVEADDRUSE選項,則多個socket不能綁定在同一個端口上,端口復用不能實現。這時可以使用重新綁定原端口的辦法把端口暴力搶奪過來。首先在服務進程中fork一個新進程,并在分配的內存地址中寫入指令;然后讓新進程獲得執行;最后結束服務進程。新進程執行寫入的指令中會循環綁定服務端口,一旦服務進程結束,新進程就把端口搶奪過來了。之后發送到這個端口的數據將會被shellcode處理。如果重新綁定的是Web服務端口,目標主機就不能向外提供Web服務。

復用當前連接socket方法的關鍵在于要找到這個socket,可以使用getpeername或字串匹配的方法查找socket。Getpeername查找socket方法最早由LSD使用。攻擊程序首先與服務進程建立連接,然后用getsockname獲得這個連接中本地所使用的端口并把它寫到shellcode中;shellcode在服務端得到運行后從第1號描述符開始遞增查找socket,并用getpeername獲得socket(對應為連接)中遠程使用的端口。如果與預先寫入的端口相同,就認為找到了當前連接的socket。之后就可以使用這條連接來進行通信交互。這種方法有一個限制在于攻擊者不能處在NAT網絡環境中。因為連接時是由NAT網關代表攻擊者主機進行的,在攻擊者主機取得的端口號與連接使用的端口號一般不同。字串匹配方法[10]可以解除這個限制。字串匹配方法在發送完攻擊包后,還要繼續發送一些約定字節(通常四個)。Shellcode查找時只對接收到數據的socket進行處理,如果接收到數據的字節數為4且與約定字節匹配一致,就認為是所要的socket。

3Shellcode繞過NIDS

基于網絡的入侵檢測系統通過在計算機網絡中的某些點被動地監聽網絡上傳輸的原始流量,對獲取的網絡數據進行處理,從中獲取有用的信息,再與已知攻擊特征相匹配或與正常網絡行為原型相比較來識別攻擊事件。由于誤報率高,基于攻擊特征匹配的IDS使用得不多,廣泛使用的是基于特征碼檢測。而基于特征碼的檢測方法有很大的局限性。可以使用多態shellcode使特征串“消失”從而繞過NIDS。

多態shellcode出現之前,shellcode通常包括兩個部分:

a)NOP sled。當shellcode不能準確定位時,為了使執行路徑“滑行”到shellcode而填充的一串無意義的指令串,通常為一串連續的NOP指令。

b)Shellcode payload。這一部分進行打開shell并綁定到端口等實際工作。 

這種shellcode非常容易被基于特征碼檢測的IDS檢測到。對于以一串NOP指令為內容的NOP sled,IDS只要搜索到大于設定閾值個數的NOP指令就觸發shellcode警報;shellcode payload部分可能包含有的“shell”或“cmd”等字符串或一串指令也可作為IDS的特征碼而被用來檢測shellcode。

為了使shellcode繞過基于網絡的入侵檢測系統,2001年Shane Macaulay在CanSecWest安全會議上提出了多態(polymorphism)及代碼混淆(code obfuscation)的概念。多態shellcode的設計思想來源于病毒逃避(virus evasion)技術。使用這種技術構造的shellcode更為危險,對付基于特征碼的檢測系統非常有效。多態shellcode結構如圖1所示。

NOP sleddecoderencrypted shellcode payload

多態shellcode的shellcode payload部分是經過編碼(常用的編碼機制為xor或double xor)后得到的,當中的特征字符串經過編碼就被“消除”了。進程流程轉到shellcode時,decoder部分對編碼過的shellcode payload進行解碼后payload才能正常執行。NOP sled部分也不再是簡單的NOP指令串了,它可以任意組合指令,只要不對后面部分的運行產生影響即可。

現在已經有很多編解碼算法以及專門的程序對shellcode進行處理。Macaulay發布的AMDmutate程序就可以很方便地把原始shellcode處理為多態shellcode。多態shellcode可以逃過大部分基于特征碼檢測的NIDS。如果NIDS依靠提取溢出程序的shellcode代碼中的解碼器的特征碼,因為解碼器不是固定的,并且會有一些無用的垃圾指令填充,有很大的難度;至于用NOP匹配的辦法也有難度,可以替換NOP的指令有很多,而且長度不同;用匹配shellcode的辦法更不可行,因為每次編碼后的shellcode都是不同的。

4Shellcode突破堆棧保護

攻擊代碼的工作過程一般主要包括兩個部分:

a)在被攻擊程序的地址空間注入代碼。

b)通過覆蓋指針(返回地址、函數指針等)讓程序跳轉到注入的代碼上執行。

堆棧保護機制針對上述兩點通常在系統底層通過改變程序編譯方式和修改程序運行環境等辦法來防御緩沖區溢出攻擊。現在存在許多可用的堆棧保護方法,一些常用的方法可分為[11]:

a)編譯器擴展方法。包括StackGuard(由Immunix所使用)、Propolice(由OpenBSD所使用)和Microsoft的/GS編譯選項。

b)不可執行棧方法。如Solar Designer’s non-exec stack補丁(由OpenWall所使用)、Exec Shield(由Red Hat/Fedora所使用)、OpenBSD’s W^X、XP SP2 NX。

c)其他方法。包括 libsafe(由Mandrake所使用)和堆棧分割方法。

StackGuard修改C編譯器(gcc)將一個canary值插入到返回地址的前面。當函數返回時,如果檢查發現這個canary的值被改變了,就證明可能有人試圖進行緩沖區溢出攻擊,程序會立刻響應,發送一條入侵警告消息給syslogd,然后終止進程。這種方法只對返回地址進行了保護,因此無法防御通過改寫返回地址附近其他值如幀指針(EBP)和局部變量對系統的攻擊。Propolice(已更名為SSP)對StackGuard進行了極大的增強,與StackGuard一樣通過修改過的編譯器在函數調用中插入一個canary值,但這個值放在幀指針前,從而使返回地址和幀指針均受到保護;此外,它對存儲局部變量的位置進行重新排序,確保指針變量在數組之前。這樣增強了propolice的保護能力,它意味著緩沖區溢出后不會修改到指針值,即減少了通過改變局部變量進行攻擊的可能。通過組合插入canary值和調整局部變量位置方法,propolice可以防御大部分緩沖區溢出攻擊,但在一些情況下攻擊仍可以成功。在一定的編碼情況下,通過溢出直至覆蓋到函數參數可以使緩沖區溢出轉換為write-anything-anywhere錯誤。盡管修改了canary值,但精心構造的參數在函數中先被使用而保護措施發生在函數調用后(確切地說在函數的epilogue中),這里留下了一個窗口(code window)給攻擊者利用,從而使保護措施失效[12]。Microsoft的/GS編譯選項結合了xor canary和propolice方法,由于Windows操作系統的特有性質存在許多方法,如利用異常處理函數(SEH)等突破Windows的堆棧保護機制[13]。

不可執行棧方法通過去掉堆棧的執行權限來禁止堆棧段執行,使得注入到堆棧空間(緩沖區變量或環境變量中)的shellcode不能執行。操作系統為了實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼。設定堆棧數據段不可執行,在最大限度地保證程序兼容性的同時增加了溢出攻擊的難度。但是為了保持程序的兼容性不可能使所有程序的數據段不可執行,所以如果把shellcode注入到這些數據段中攻擊也能成功。更有甚者,可以不需要注入任何代碼和數據,而使進程調轉到某個現有的子例程即return-into-libc[14],如跳轉到C庫中的某個子例程system,這足以滿足本地權限提升的要求。

Libsafe由Lucent Technologies 開發,對像strcpy()這樣對stack-smashing攻擊很脆弱的標準C庫函數進行了包裝。這些函數的libsafe版本執行相關的檢查,確保數組改寫不會超出堆棧楨。然而這種方法僅保護那些特定的函數,而不是從總體上防止堆棧溢出缺陷,并且它僅保護了堆棧,而不保護堆棧中的局部變量。

5結束語

在不可能要求程序員消除所有編碼錯誤的情況下,防護措施必不可少。本文從攻擊者的角度對溢出后shellcode突破各種防護措施的技術進行了詳細介紹和分析。從上面的分析可以看出,盡管防護措施的存在一定程度上增加了溢出攻擊利用的難度,但這些措施方法都有弱點,攻擊者可以利用各種技術突破它們。而只有認識到每種防護措施的弱點以及攻擊者使用的最新技術,才可以對已有的防護措施進行綜合和改進,從而進一步增加緩沖區溢出攻擊利用的難度,進一步減少溢出攻擊成功的可能。

參考文獻:

[1]COWAN C,WAGLE F, BEATTIE C P,et al.Buffer overflows: attacks and defenses for the vulnerability of the decade[EB/OL].(2000).http://www.immunix.com/pdfs/discex00.pdf.

[2]CERT advisory CA-1990-02 Internet intruder warning[EB/OL].(1990).http://www.cert.org/advisories/CA-1990-02.html.

[3]ARCE I. The shellcode generation[J].IEEE Security Privacy,2004,2(5):72-76.

[4]Buffer overrun in RPC interface could allow code execution, Microsoft Security Bulletin MS03-0262003[EB/OL].(2003).http://www.microsoft.com/technet/security/bulletin/MS03-026.mspx.

[5]CHIEN E, SZOR P.Blended attacks:exploits,vulnerabilities, and buffer-overflow techniques in computer viruses[EB/OL].(2002).http:// www.symantec.com/avcenter/reference/blended.attacks.pdf.

[6]ALEPH O.Smashing the stack for fun and profit[EB/OL].(1996). http://www.phrack.org/show.php?p=49a=14.

[7]Plan9,高級shellcode設計技巧[EB/OL].(2004).http:// www.forcus.net/projects/Xcon/2004/Xcon2004_plan9.pdf.

[8]San.滲透防火墻的shellcode技術[EB/OL].(2004).http://www.forccus.net/ projects/Xcon/2004/Xcon2004_san.pdf.

[9]sk.history and advances in Windows shellcode[EB/OL]. (2004).http://www.phrack.org/show.php?p=62a=7.

[10]許治坤,王偉,郭添森,等.網絡滲透技術[M].北京:電子工業出版社,2005:175-176.

[11]WHEELER D A.Secure programmer:countering buffer overflows[EB/OL].(2004).http://www-128.ibm.com/developerwork-s/library/l-sp4.html.

[12]RICHARTE G.Four different tricks to bypass stackshield and stackguard protection[EB/OL].(2002).http://www.coresecurity.com/files/files/11/StackguardPaper.pdf.

[13]LITCHFIELD D.Defeating the stack buffer overflow prevention mechanism of microsoft Windows 2003 server[EB /OL].(2003).http://www.nextgenss.com/papers/defeating-w2k3-stack-prote-ction.pdf.

[14]NERGAL.The advanced return-into-lib(c) exploits[EB/OL].(2001).http://www.phrack.org/show.php? p=58a=4.

“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”

主站蜘蛛池模板: 国产成人久久综合777777麻豆| 老司机精品一区在线视频| 亚洲国产精品一区二区第一页免| 久久青草免费91线频观看不卡| 亚洲最猛黑人xxxx黑人猛交| 最新日韩AV网址在线观看| 欧美性色综合网| 美女黄网十八禁免费看| 国产精品无码一二三视频| 伊人国产无码高清视频| 亚洲综合色区在线播放2019| 日韩精品一区二区三区视频免费看| 沈阳少妇高潮在线| 亚洲国产精品美女| 国内熟女少妇一线天| 五月激情婷婷综合| 好紧太爽了视频免费无码| 五月激情婷婷综合| 国产丝袜啪啪| 国内嫩模私拍精品视频| 国产91线观看| 国产精品亚洲va在线观看| 精品视频免费在线| 亚洲二三区| 国产乱子伦精品视频| 美女视频黄频a免费高清不卡| 爆乳熟妇一区二区三区| 99国产在线视频| 欧美成人看片一区二区三区| 免费在线色| 亚洲欧洲综合| WWW丫丫国产成人精品| 欧美成人午夜视频| 日本精品视频一区二区| 国产女人水多毛片18| 视频一区亚洲| 亚洲六月丁香六月婷婷蜜芽| 日韩国产另类| 日本91在线| 全部免费特黄特色大片视频| 国产在线97| 日韩黄色在线| 亚洲色大成网站www国产| av在线5g无码天天| 成年人免费国产视频| 国产精品久久久久久影院| 国产精品夜夜嗨视频免费视频| 噜噜噜综合亚洲| 一级毛片在线播放免费| 欧美性天天| 成人中文字幕在线| 午夜视频www| 伊在人亞洲香蕉精品區| 另类综合视频| 欧美伦理一区| 国产无码网站在线观看| AV不卡国产在线观看| 2021国产在线视频| 老色鬼欧美精品| 亚洲视频二| 国产91高跟丝袜| 亚洲人视频在线观看| 亚洲另类第一页| 自慰网址在线观看| 欧美专区日韩专区| 久久a毛片| 少妇精品网站| 在线观看欧美精品二区| 色综合热无码热国产| 18禁不卡免费网站| 国产女人18毛片水真多1| 亚洲欧美一区在线| 亚洲一级毛片| 国产成人区在线观看视频| 国产福利不卡视频| 日本午夜精品一本在线观看| 丁香亚洲综合五月天婷婷| 毛片最新网址| 最新亚洲人成无码网站欣赏网| 亚洲国产天堂久久综合| 日本在线视频免费| 国产成人久视频免费|