安全漏洞--基於NDAY和0DAY漏洞免殺技巧
一 概念簡介
0day中的0表示zero,早期的0day表示在軟體發行後的24小時內就出現破解版本,現在我們已經
引申了這個含義,只要是在軟體或者其他東西釋出後,在最短時間內出現相關破解的,都可以叫
0day。 0day是一個統稱,所有的破解都可以叫0day。簡而言之,0day就是代表還沒有公開的漏
洞,nday就是代表已經公開了的漏洞。漏洞開發者在利用0day和Nday時,除了在逃過windos的
自身安全機制的基礎上,不可避免的要接觸到與殺軟對抗的工作,就一般情況來看,如果針對特
定的目標殺軟還是有很大可能可以繞過,難點是通用所有的殺軟。
另外值得注意的一點,現今主流殺軟很多,在通用的前提下,免殺工作往往佔用很多時間。
二 構造POC
2.1 構造POC
要想利用一個漏洞,首先得構造一個POC樣本,構造好的POC,會遭遇殺軟的第一層防護,
也就是經常說的靜態查殺。
2.2 必要工具
MYCCL,VirTest。
2.3 0day構造
殺軟容易檢測的地方,比如:會被檢測的堆噴程式碼或者0322中類似判斷檔案
存在的這類程式碼,漏洞觸發的經典位元組碼。
重災區:PE結構的嵌入。
殺軟認為危險的函式名或者一些二進位制中能看到的字串。
2.4 Nday的構造
漏洞爆出來時所用的程式碼已經被“黑名單”。
一些殺軟對二進位制檔案漏洞觸發點檢測很深入。
2.5 0day 過靜態
宗旨:儘量讓程式碼和二進位制檔案靠近“正常”或者“隨機”。
方法:加密,混淆,隨機資料,壓縮。
2.6 Nday過靜態
最理想:通過另外一種方法或者類似方法去重新構造一個樣本。
一般時候:可通過前面提到的那些方法使殺軟不認識這些檔案或程式碼。
三 漏洞觸發
3.1 檢測
構造好POC後,執行起來的POC樣本能不能過掉殺軟正確的觸發漏洞走到攻擊者的程式碼,
就是攻擊者面臨的殺軟第二層保護。代表:EMET
3.2 涉及點
堆噴,GS棧保護,ROP,DEP,ASLR,HOOK
3.3 堆噴技術
有些時候攻擊者不能預先知道自己的東西出現在什麼地方的時候,就需要用到堆噴技術使
惡意程式碼出現在一定的地址範圍內,比如CALL EAX。現在殺軟對堆噴都有一定的檢測,
所以在堆噴時必須注意一些地方。這裡大概總結出了三個方面。
3.4 堆噴地址
殺軟中的堆噴地址 。0x0c0c0c0c
堆噴內容的檢測。0x41414141
堆噴方法的權衡。
GS棧的保護機制->棧溢位
原理圖
效能影響很大,需要編譯時設定,只針對一些開發者認為比較重要的模組。
3.5 系統流程
_security_init_cookie
save in _security_cookie
_security_check_cookie
3.6 Bypass GS棧保護
利用未被保護的記憶體突破GS 。
基於改寫函式指標的攻擊,如C++虛擬函式攻擊。
針對異常處理機制的攻擊。
堆溢位沒有保護。
3.7 DEP
DEP(Data Execution Prevention),分為硬體DEP和軟體DEP,這裡主要討論軟體DEP,DEP
維基百科的解釋:資料執行保護,簡稱“DEP”,英文全稱為“Data Execution Prevention”,是
一組在儲存器上執行額外檢查的硬體和軟體技術,有助於防止惡意程式碼在系統上執行。”
對攻擊者來說,自己的程式碼必然是通過外部的手段傳進去的,所以經常用來放程式碼的方法,
比如string,陣列,在記憶體中是不可執行的記憶體頁,也就是資料頁,必然的,我們在漏洞觸發
後緊接著需要改變該記憶體的屬性,這都是可以通過呼叫函式來實現的。
利用函式:
VirtualProtect,
VirtualAlloc,
NtSetInformationProcess。
殺軟中的DEP
殺軟在漏洞觸發點對DEP的加固一般是通過hook相關函式來實現的,要繞過殺軟保護一般情況下
可以直接跳過hook程式碼或者呼叫更加底層的函式來實現。
無殺軟環境下:
諾頓360環境下:
3.8 ASLR
ASLR的定義:“位址空間配置隨機載入(英語:Address space layout randomization (ASLR)),
又稱為位址空間佈局隨機化,是指利用隨機方式配置資料位址。一般現代作業系統中都加設這一
機制,以防範惡意程式對已知位址進行攻擊。”
ASLR通俗的講就是偽隨機化模組載入地址,這項安全技術主要針對的是ROP,因為ROP是通
過人為的構造,如果要用到的程式碼在記憶體中的地址是隨機的,那麼ROP的部署將不再是那麼容易的。
在殺軟中的ASLR在win7中的ASLR在每次重啟後,載入地址會有一定隨機的變化,但是在殺軟中加
載地址的隨機性更高一些。
3.9 ROP
這裡有必要對ROP進行簡單介紹,ROP全稱是返回導向程式設計,其字面概念比較晦澀,下面給
出一個圖解釋一下簡單的ROP:
所以ROP是為了突破DEP+ASLR環境。
四 shellcode
4.1 殺軟
對於主流殺軟來說,當漏洞已經成功觸發走到攻擊者的程式碼,也就是shellcode時,也許真正的
免殺工作才剛剛開始。
核心點
4.2 舉例
現今殺軟對於漏洞觸發後的行為檢測有一些參差不齊的水平。行為檢測的比較好的殺軟代表:
卡巴斯基(卡巴),位元梵德(bit)。卡巴和bit檢測都是在驅動級上,如果想深入瞭解其行為檢測
的細節,需要逆向其驅動。
4.3 行為查殺
這個是一項很籠統的概念,並沒有明確規定孰是孰非,而且不同殺軟行為查殺的能力也不同,但
是核心思想是擾亂行為和拆分行為,這裡舉一些例子來說明。
4.4 例1
文件類漏洞中查詢檔案handle,虛擬碼如下
add HANDLE,4
…push 0x2014
…CALL SetFilePointer//設定對應控制代碼讀取位置為特定位置
…CALL ReadFile //讀取我們設定好的標誌。
正常程式碼中不會存在挨個開啟handle去讀其中內容的操作。
解決辦法:拆分行為
4.5 例2
漏洞的一般流程:釋放檔案,執行檔案
拆分行為,比如:省去其中一步;分開這些步驟(沒有驗證)
擾亂行為,比如:偽裝呼叫失敗;進入函式的方式;dll載入時…
五 返回空間
5.1 EMET
返回程序空間是漏洞的最後一步,也就是經常所說的完美退出,一般情況下如果完美恢復堆疊
和暫存器,這步操作是不會受到殺軟的阻擋的,但也有例外,比如覆蓋異常。覆蓋異常會碰到
一些針對該攻擊的安全手段,SEHOP,SAFESEH。這個情況主要是針對EMET來說。
5.2 SAFESEH
SAFESEH由於需要編譯支援,而且殺軟上一般是沒有相關設定,要想逃過這個機制只需要有可執行的
堆上的程式碼就可以繞過,就不闡述了。
5.3 SEHOP特點
SHE handler必須指向non-SafeSEH module
記憶體頁必須可執行
SHE連結串列不應被篡改,並且位於連結串列末端的SHE結構必 須為特定值
(next SHE指標值為0xFFFFFFFF, SHE handler也必須為一特定值)
所有的SHE結構必須為4-byte對齊
最後一個SHE結構的handler必須正確指向ntdll中的ntdll!FinalExceptionHandler例程
所有SHE指標必須指向棧中。
5.4 Bypass SEHOP
如果遇到SEHOP,而又要必須用到覆蓋異常攻擊時,只有一條路可走,就是構造一個偽造的SHE異
常處理連結串列。