1. 程式人生 > >安全漏洞--基於NDAY和0DAY漏洞免殺技巧

安全漏洞--基於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異

常處理連結串列。
      

六 資料參考