最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

漏洞類(lèi)型及檢測(cè)

2022-01-07 17:13 作者:rkvir逆向工程學(xué)院  | 我要投稿

作者?| 榴蓮

編輯?| 楌橪

I.通用漏洞類(lèi)型
?1.棧溢出?棧溢出是緩沖區(qū)溢出的一種,往往由于對(duì)緩沖區(qū)的長(zhǎng)度沒(méi)有判斷,導(dǎo)致緩沖區(qū)的大小超過(guò)了預(yù)定的大小,導(dǎo)致在棧內(nèi)的保存的返回地址被覆蓋,這時(shí)候返回地址將指向未知的位置.造成訪問(wèn)異常的錯(cuò)誤.?而當(dāng)我們精心構(gòu)造一段shellcode保存在某個(gè)位置,并且通過(guò)滑板指令以及其他特定的方法跳轉(zhuǎn)至shellcode的位置上執(zhí)行shellcode,此時(shí)就可以通過(guò)shellcode獲取到系統(tǒng)的管理員權(quán)限.執(zhí)行任意代碼,?windows XP之前的系統(tǒng)可以直接利用,在windows7以后的系統(tǒng)需要構(gòu)造ROP鏈突破保護(hù)權(quán)限,突破方法見(jiàn)附錄1.??2.堆溢出?堆溢出與棧溢出一樣,也是緩沖區(qū)溢出的一種,堆棧溢出的產(chǎn)生往往是由于過(guò)多的函數(shù)調(diào)用,導(dǎo)致調(diào)用堆棧無(wú)法容納這些調(diào)用的返回地址,一般在遞歸中產(chǎn)生。堆棧溢出很可能由無(wú)限遞歸產(chǎn)生,但也可能僅僅是過(guò)多的堆棧層級(jí)?在 windows XP SP2上可以利用調(diào)整鏈表指針的方式,向固定的地址寫(xiě)入可控的數(shù)據(jù),比如講shellcode的地址寫(xiě)到返回地址,或者覆蓋PEB函數(shù)指針.SEH結(jié)構(gòu)等方法,但是隨著后續(xù)系統(tǒng)的更新,在windows 7系統(tǒng)中多了許多保護(hù)機(jī)制,因此需要構(gòu)造ROP在繞過(guò)相關(guān)的保護(hù)機(jī)制后再利用漏洞獲取管理員權(quán)限,執(zhí)行任意代碼.??3.整數(shù)溢出?整數(shù)分為有符號(hào)和無(wú)符號(hào)兩種類(lèi)型,有符號(hào)數(shù)以最高位作為其符號(hào)位,即正整數(shù)最高位為1,負(fù)整數(shù)最高位為0,而無(wú)符號(hào)數(shù)沒(méi)有這種情況,它的取值范圍是非負(fù)數(shù),在平時(shí)編程的時(shí)候常用的整型變量有 8位(單字節(jié)字符、布爾類(lèi)型)、16位(短整型)、32位(長(zhǎng)整型)等 ,每種整數(shù)類(lèi)型在內(nèi)存中有不同的固定取值范圍,比如unsigned short的存儲(chǔ)范圍是0-65535,但是當(dāng)存儲(chǔ)的值超過(guò)65535的時(shí)候,數(shù)據(jù)就會(huì)截?cái)?例如輸入65536,系統(tǒng)就會(huì)識(shí)別為0.?如果利用整數(shù)溢出后的值做為內(nèi)存拷貝的參數(shù),那么就會(huì)造成緩沖區(qū)溢出(堆/棧),利用方法就是緩沖區(qū)溢出的利用方法.??4.格式化字符串?格式化字符串漏洞的產(chǎn)生主要源于對(duì)用戶輸入內(nèi)容未進(jìn)行過(guò)濾,這些輸入數(shù)據(jù)都是作為參數(shù)傳遞給某些執(zhí)行格式化操作的函數(shù),如printf.fprintf.bprintf.sprintf等等.惡意用戶可以使用”%s”和”%x”等格式符,從堆棧或其他位置輸出數(shù)據(jù),也可以使用格式符”%n”向任意位置寫(xiě)入任意數(shù)據(jù),配合printf()函數(shù)和其他功能類(lèi)似的函數(shù)就可以向任意地址寫(xiě)入被格式化的字節(jié)數(shù),可能導(dǎo)致任意代碼執(zhí)行,或者讀取敏感信息,比如用戶名以及密碼等等.?因?yàn)榭梢詧?zhí)行任意代碼,所以可以通過(guò)shellcode獲取系統(tǒng)管理員的權(quán)限,也有可能通過(guò)一些技術(shù),直接在內(nèi)存中將系統(tǒng)密碼直接讀出.
?5.雙重釋放?雙重釋放漏洞主要是由對(duì)同一塊內(nèi)存進(jìn)行二次重復(fù)釋放導(dǎo)致的,利用漏洞可以執(zhí)行任意代碼.?在釋放過(guò)程中,臨近的已釋放堆塊的合并動(dòng)作,這回改變?cè)械亩杨^信息以及前后向指針,之后在對(duì)其中的地址進(jìn)行引用,就會(huì)導(dǎo)致訪問(wèn)異常,最后程序崩潰,正式因?yàn)槌绦蛞玫搅艘厌尫诺膬?nèi)存,所以說(shuō)雙重釋放漏洞就是Use After Free漏洞的子集.如果程序不存在堆塊合并動(dòng)作,那么雙重釋放后可能不會(huì)馬上崩潰,但會(huì)在程序中遺留隱患,導(dǎo)致在后續(xù)執(zhí)行過(guò)程中的某一刻爆發(fā).?對(duì)于堆內(nèi)存的利用,最常用也最簡(jiǎn)單的方法就是使用堆噴射技術(shù)(Heap Spraying),也就是申請(qǐng)大量?jī)?nèi)存塊,將shellcode放在內(nèi)存塊的最后,前面放上利用地址以及滑板指令,用大量?jī)?nèi)存來(lái)碰撞,直到最后執(zhí)行到shellcode.?Shellcode可以執(zhí)行任意代碼,也就可以利用此來(lái)進(jìn)行提權(quán)操作.??6.釋放重引用?UAF漏洞的成因一般都是因?yàn)樵诰幊踢^(guò)程中對(duì)引用計(jì)數(shù)的處理不當(dāng)導(dǎo)致對(duì)象被釋放后重用的。利用UAF漏洞實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行,首先需要Bypass ASLR,獲得模塊基址及 shellcode的地址(也可以通過(guò)堆噴射在指定內(nèi)存空間布置shellcode),然后硬編碼、動(dòng)態(tài)構(gòu)造ROP來(lái)Bypass DEP,最終實(shí)現(xiàn)任意代碼的執(zhí)行。??7.數(shù)組訪問(wèn)越界?數(shù)組訪問(wèn)越界類(lèi)似于溢出漏洞,但是又不完全是溢出漏洞?A)數(shù)組訪問(wèn)越界包含讀寫(xiě)類(lèi)型,而溢出屬于數(shù)據(jù)寫(xiě)入?通常數(shù)組越界訪問(wèn)是由于數(shù)組下標(biāo)數(shù)值超出了數(shù)組元素個(gè)數(shù)導(dǎo)致的,數(shù)組的讀寫(xiě)操作有時(shí)是同時(shí)并存的,程序越界索引棧上分配的數(shù)組,同時(shí)又向其寫(xiě)入數(shù)據(jù).最終造成溢出.?B)部分溢出漏洞的本質(zhì)就是數(shù)組越界?導(dǎo)致溢出的原因有多種,有些正是由于針對(duì)數(shù)組下表標(biāo)范圍未做有效限制,導(dǎo)致允許越界訪問(wèn)數(shù)組并對(duì)其寫(xiě)入數(shù)據(jù),造成溢出??8.內(nèi)核級(jí)漏洞?在Ring3的溢出漏洞,格式化字符串漏洞,釋放重引用漏洞,雙重釋放漏洞,數(shù)組越界漏洞都可以在內(nèi)核中復(fù)現(xiàn),但是利用方法差異比較大.?內(nèi)核漏洞不易挖掘,也不易分析利用.但是如果可以利用成功,那么直接可以使用Ring0權(quán)限.
?9.類(lèi)型混淆?類(lèi)型混淆漏洞主要是講數(shù)據(jù)類(lèi)型A當(dāng)做數(shù)據(jù)類(lèi)型B解析引用,可能導(dǎo)致非法訪問(wèn)數(shù)據(jù),進(jìn)而執(zhí)行任意代碼,但這里的數(shù)據(jù)類(lèi)型并非是單純的編程概念上的數(shù)據(jù)類(lèi)型,比如Uint被轉(zhuǎn)換成String,Flash漏洞:CVE-2014-0590,也包括類(lèi)對(duì)象或者數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換,比如以下兩個(gè)類(lèi),A類(lèi)被混淆成B類(lèi),就可能導(dǎo)致私有域被外部訪問(wèn)到.??
10.沙盒逃逸?A)Broker接口漏洞:IE借助Broker進(jìn)程完成一些需要高權(quán)限的操作,若其服務(wù)端口本身就存在漏洞,就可以直接被攻擊者用于執(zhí)行任意代碼.?B)策略檢查繞過(guò):Broker進(jìn)程在檢查Elevation Policies時(shí)若被繞過(guò)也可能導(dǎo)致沙盒逃逸,比如CVE-2013-4015用Tab帶起空格從而繞過(guò)對(duì)程序名的檢查.?C)策略設(shè)置不當(dāng):對(duì)于沙箱可操作的程序,如果其Elevation Policies設(shè)置不當(dāng),允許靜默以Medium權(quán)限執(zhí)行,就可能創(chuàng)建高權(quán)限的進(jìn)程再借助該程序的一些接口完成任意代碼執(zhí)行.?D)IPC通信問(wèn)題:當(dāng)IPC通信過(guò)程中使用的共享內(nèi)存包含過(guò)多的IE的未注冊(cè)信息,可能導(dǎo)致沙盒的進(jìn)程篡改其中主進(jìn)程中的敏感信息,比如EPM沙盒的開(kāi)關(guān)標(biāo)準(zhǔn),被篡改后就可以直接關(guān)閉沙盒?E)沙盒權(quán)限限制不嚴(yán):在沙盒中的進(jìn)程如果權(quán)限限制的不夠嚴(yán)謹(jǐn),使得本不改訪問(wèn)的安全對(duì)象被訪問(wèn),就可能導(dǎo)致沙盒逃逸.?F)內(nèi)核提取:利用系統(tǒng)內(nèi)核漏洞獲取比沙盒本更更高的權(quán)限,就可以直接關(guān)閉沙盒本身,從而實(shí)現(xiàn)沙盒逃逸.??11.RPC漏洞?RPC是一種遠(yuǎn)程過(guò)程調(diào)用協(xié)議,RPC提供進(jìn)程間的交互通信機(jī)制,允許在某臺(tái)計(jì)算機(jī)上運(yùn)行的程序無(wú)縫的在遠(yuǎn)程系統(tǒng)上執(zhí)行.?因?yàn)門(mén)CP/IP處理交換等問(wèn)題,導(dǎo)致惡意代碼可以利用漏洞以本地系統(tǒng)權(quán)限在系統(tǒng)上執(zhí)行任意指令.


?V.檢測(cè)方法?1.shellcode模糊檢測(cè)A)利用特定的編碼方式檢測(cè)1)/x**:類(lèi)C語(yǔ)言的shellcode編碼形式2)/u****:類(lèi)javascript的shellcode編碼形式?3)%u****:類(lèi)JavaScript的shellcode編碼形式4)%**:多種腳本使用的shellcode編碼形式??B)利用GetPC的特征來(lái)匹配shellcode1)E80000000058方式GetPC2)E8FFFFFFFFC258方式GetPC3)D9EED97424F45B方式GetPC
?C)利用動(dòng)態(tài)函數(shù)獲取編碼來(lái)匹配shellcode1)利用shellcode必須動(dòng)態(tài)獲取函數(shù)地址,以擺脫對(duì)宿主的環(huán)境要求的特點(diǎn),針對(duì)動(dòng)態(tài)獲取函數(shù)地址的編碼來(lái)進(jìn)行檢測(cè)??D)利用滑板指令來(lái)匹配shellcode1)可以利用大量出現(xiàn)的滑板指令來(lái)匹配shellcode,例如0C0C0C0C,90909090,FFFFFFFF等經(jīng)典滑板指令?
2.惡意行為模糊檢測(cè)A)針對(duì)不應(yīng)該出現(xiàn)的敏感庫(kù)進(jìn)行檢測(cè),如文檔中如果出現(xiàn)ws2_32.dll就屬于不正常的情況,可以針對(duì)性檢測(cè)B)針對(duì)不應(yīng)該出現(xiàn)的敏感函數(shù)進(jìn)行檢測(cè),如文檔中如果出現(xiàn)申請(qǐng)內(nèi)存,download等敏感操作,可以針對(duì)性進(jìn)程檢測(cè)C)針對(duì)敏感對(duì)象以及字段進(jìn)行檢測(cè),如果出現(xiàn)updata,autoopen一類(lèi)敏感對(duì)象或字段,可以針對(duì)性進(jìn)行檢測(cè)D)針對(duì)未知網(wǎng)址的檢測(cè),如果文檔中出現(xiàn)非官方網(wǎng)址的未知網(wǎng)址,那么可以針對(duì)其進(jìn)行針對(duì)性檢測(cè)??3.漏洞特征檢測(cè)A)利用逆向分析出的漏洞觸發(fā)特征,進(jìn)行漏洞精確檢測(cè)?附錄1(windows保護(hù)機(jī)制):GS:在所有函數(shù)調(diào)用發(fā)生時(shí),向棧楨里面壓入一個(gè)隨機(jī)的DWORD,這個(gè)數(shù)被稱(chēng)為canary,canary位于EBP之前,系統(tǒng)還在數(shù)據(jù)段的內(nèi)存區(qū)域中存儲(chǔ)一個(gè)canary的副本,當(dāng)棧中發(fā)生溢出的時(shí)候,canary將被首先淹沒(méi),之后才是EBP和返回地址在函數(shù)返回之前,系統(tǒng)做一個(gè)額外的安全驗(yàn)證,確認(rèn)棧楨中的canary與數(shù)據(jù)段中的副本是否一致,如果兩者不一致,說(shuō)明棧楨中的canary已經(jīng)被破壞,也就是棧中發(fā)生了溢出。??突破GS:1.利用不受保護(hù)的內(nèi)存突破,例如某函數(shù)中不包括4字節(jié)以上的緩沖區(qū),即使開(kāi)啟GS,也并沒(méi)有保護(hù)2.利用虛函數(shù)突破,將虛表指針指向我們說(shuō)需要的位置3.利用異常處理突破,GS機(jī)制并沒(méi)對(duì)SEHJ進(jìn)行保護(hù),我們可以通過(guò)超長(zhǎng)字符串覆蓋掉異常處理函數(shù)指針,然后觸發(fā)一個(gè)異常,這時(shí)候就會(huì)轉(zhuǎn)入異常處理,但是異常處理函數(shù)指針被覆蓋了,那么就可以劫持SEH來(lái)控制程序流程了4.利用GS自身驗(yàn)證突破,同時(shí)替換棧中和數(shù)據(jù)段中的canary?SafeSEH:編譯器:在編譯的時(shí)候產(chǎn)生一張安全SEH表,并且將這張表放在程序的映像里,當(dāng)程序調(diào)用異常處理函數(shù)的時(shí)候,首先檢查調(diào)用的異常處理函數(shù)是否在安全SEH表里。操作系統(tǒng):1.檢查異常處理鏈?zhǔn)欠裉幱诋?dāng)前棧中,如果不在,程序終止異常處理的調(diào)用2.檢查異常處理函數(shù)指針是否指向當(dāng)前程序的棧中,如果指向,終止異常處理函數(shù)的調(diào)用3.調(diào)用RtllsValidhandler()來(lái)進(jìn)行有效驗(yàn)證???? 1)檢查程序上是否設(shè)置了IMAGE_DLLCHARACTERISTICS_NO_SEH標(biāo)記。如果設(shè)置了這個(gè)標(biāo)識(shí),這個(gè)程序內(nèi)的異常將會(huì)被胡烈,所以這個(gè)標(biāo)志被設(shè)置時(shí),函數(shù)直接返回效驗(yàn)失敗???? 2)檢測(cè)程序是否包含安全SEH表,如果程序中包含安全SEH表,則將當(dāng)前的異常處理函數(shù)地址和該表進(jìn)行匹配,匹配成功則返回校驗(yàn)成功。匹配失敗則返回校驗(yàn)失敗。???? 3)判斷程序是否設(shè)置ILonly標(biāo)識(shí),如果設(shè)置了這個(gè)標(biāo)識(shí),說(shuō)明該程序 只包含.NET編譯人中間語(yǔ)言,哈數(shù)直接返回校驗(yàn)失敗???? 4)判斷異常處理函數(shù)是否位于不可執(zhí)行頁(yè)上,當(dāng)異常處理函數(shù)地址位于不可執(zhí)行頁(yè)上,校驗(yàn)函數(shù)會(huì)檢測(cè)DEP是否開(kāi)啟,如果系統(tǒng)未開(kāi)啟DEP則返回校驗(yàn)成功,否則程序拋出訪問(wèn)異常。突破SafeSEH:1.攻擊返回地址,如果啟用了safeSEH而沒(méi)有啟用GS,或者剛好這個(gè)函數(shù)沒(méi)有GS保護(hù),那么就可以直接攻擊函數(shù)返回地址?2.利用虛函數(shù)表來(lái)劫持程序流程,這個(gè)過(guò)程中不涉及任何異常處理。SafeSEH也就沒(méi)有機(jī)會(huì)生效了3.利用未啟用SafeSEH的模塊繞過(guò)SafeSEH?DEP:DEP的基本原理就是將數(shù)據(jù)所在的內(nèi)存頁(yè)標(biāo)識(shí)為不可執(zhí)行,當(dāng)程序溢出后執(zhí)行shellcode的時(shí)候,就會(huì)嘗試在數(shù)據(jù)面上執(zhí)行指令,此時(shí)CPU就會(huì)拋出異常,而不是去執(zhí)行惡意的指令根據(jù)機(jī)制的不同可以分為軟件DEP和硬件DEP軟件DEP就是SafeSEH硬件DEP才是真正意義上的DEP,需要CPU的支持,通過(guò)設(shè)置內(nèi)存也的NX屬性標(biāo)記,來(lái)表明不能從該內(nèi)存執(zhí)行代碼。當(dāng)NX標(biāo)記為0的時(shí)候表示這個(gè)頁(yè)面可以執(zhí)行指令,當(dāng)NX標(biāo)記為1的時(shí)候表示不能執(zhí)行指令?突破DEP:1.利用ret2libc???? 1)通過(guò)跳轉(zhuǎn)到ZwSetInfromationProcess函數(shù)將DEP關(guān)閉再轉(zhuǎn) Shellcode執(zhí)行。???? 2)通過(guò)跳轉(zhuǎn)到Virtualprotect函數(shù)來(lái)將shellcode所在的內(nèi)存也設(shè)置為可執(zhí)行狀態(tài),然后轉(zhuǎn)入shellcode執(zhí)行???? 3)通過(guò)跳轉(zhuǎn)到VirualAlloc函數(shù)開(kāi)辟一段具有執(zhí)行權(quán)限的內(nèi)存空間,然后將shellcode復(fù)制到這段內(nèi)存中執(zhí)行2.利用可執(zhí)行內(nèi)存???? 如果進(jìn)程空間里存在一段可讀可寫(xiě)可執(zhí)行的內(nèi)存,那么如果我們可以將shellcode復(fù)制到這段內(nèi)存中,并且劫持程序執(zhí)行流程,那么我們的shellcode就有執(zhí)行的機(jī)會(huì)3.利用java applet???? 它可以被加載到IE客戶端中,而且加載到IE進(jìn)程的內(nèi)存空間后,這些空間與空間都具有可執(zhí)行屬性?ASLR:1.基址隨機(jī)化?2.堆棧隨機(jī)化3.PRB和TEB的隨機(jī)化突破ASLR:1.利用沒(méi)有開(kāi)啟ASLR的模塊進(jìn)行繞過(guò),比如Flash插件2.利用部分覆蓋進(jìn)行定位,基址隨機(jī)化只隨機(jī)了前2個(gè)字節(jié),這樣就可以利用這個(gè)地址的后兩個(gè)字來(lái)在一定程度上控制這個(gè)程序。3.利用堆噴射進(jìn)行內(nèi)存定位。??? 1.Heap spary:堆噴射就是申請(qǐng)大量?jī)?nèi)存,占領(lǐng)內(nèi)存中的0x0c0c0c0c,并且在這些內(nèi)存中放置0x90(nop)和shellcode,最后控制程序轉(zhuǎn)入0x0c0c0c0c執(zhí)行,只要不是0x0c0c0c0c整好處于shellcode當(dāng)中,那么shellcode就可以成功執(zhí)行。???? 思路:申請(qǐng)200個(gè)1MB的內(nèi)存塊來(lái)堆噴,每個(gè)內(nèi)存塊中包含0x90和shellcode,堆噴結(jié)束后我們就會(huì)占領(lǐng)0x0c0c0c0c附近的內(nèi)存,只要控制程序轉(zhuǎn)到0x0c0c0c0c執(zhí)行,通過(guò)0x90就滑板,最終執(zhí)行shellcode???? 在程序中找到溢出點(diǎn),覆蓋其返回地址,將返回地址覆蓋為0x0c0c0c0c,這樣函數(shù)返回執(zhí)行的時(shí)候就會(huì)跳到我們申請(qǐng)的內(nèi)存中?SEHOP:SEHOP的核心任務(wù)是檢查SEH鏈的完整性,在程序轉(zhuǎn)入異常處理前SEHOP會(huì)檢查SEH鏈上的最后一個(gè)異常處理函數(shù)是不是系統(tǒng)的異常處理函數(shù),如果是,那么說(shuō)明異常處理鏈沒(méi)有被破壞,如果不是,那么說(shuō)明SEH鏈已經(jīng)被破壞,可能發(fā)生了覆蓋攻擊,程序不會(huì)執(zhí)行當(dāng)前的異常處理程序。突破SEHOP:1.偽造SEH鏈結(jié)構(gòu)2.利用未開(kāi)啟SEHOP的模塊進(jìn)行突破。

直播預(yù)告:

直播主題:8日HOOK專(zhuān)題? ? ? 9日l(shuí)nject專(zhuān)題

直播時(shí)間:20:00-21:30? ? ?

直播平臺(tái):B站/騰訊課堂/微信視頻號(hào)


關(guān)于作者

作者:rkvir(榴蓮老師)

簡(jiǎn)介:曾任某安全企業(yè)技術(shù)總監(jiān);看雪講師;曾任職國(guó)內(nèi)多家大型安全公司;參與*2國(guó)家級(jí)安全項(xiàng)目

擅長(zhǎng):C/C++/Python/x86/x64匯編/系統(tǒng)原理&

研究方向:二進(jìn)制漏洞/FUZZ/Windows內(nèi)核安全/內(nèi)網(wǎng)攻防

漏洞類(lèi)型及檢測(cè)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
长汀县| 额尔古纳市| 巴马| 乌兰浩特市| 内黄县| 凤凰县| 丘北县| 大足县| 平定县| 屏东市| 新化县| 新郑市| 墨脱县| 绥滨县| 永丰县| 偃师市| 富裕县| 泰顺县| 潼南县| 江源县| 尉犁县| 嘉鱼县| 仁化县| 青神县| 昭通市| 宜川县| 离岛区| 安乡县| 长沙县| 永嘉县| 新乡县| 木兰县| 平山县| 康乐县| 衡阳县| 稷山县| 兴山县| 罗甸县| 西青区| 梁山县| 壤塘县|