熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows優化 >> 正文

高級Windows 2000 Rootkit檢測技術

2022-06-13   來源: Windows優化 

  
  摘要本文描述了一種檢測內核與用戶級rootkit的新技術此技術利用處理器的單步執行模式來測定系統內核與DLL中執行指令的數量從而達到檢測rootkit和後門的目的同時還討論了其在Wink下的代碼實現
  
  背景知識
  一個在計算機安全領域中重要的問題是如何判斷給定的主機是否已被入侵由於以下兩點這項工作變的非常困難
  攻擊者可以利用未知漏洞進入系統
  當進入系統後入侵者可通過安裝rootkit和後門來隱藏自身(例如隱藏進程通訊渠道文件等)本文將集中討論在WinK系統下rootkit的檢測問題
  
  傳統rootkit檢測技術中的一些問題
  傳統的rootkit檢測程序(那些我們經常在UNIX系統中見到的)只能檢測一些已知的rootkit(這點使它變的像反病毒程序)或進行一些內核存儲的掃描例如Linux中就有一些工具掃描內核中的syscall table這顯然不夠好因為已經有了很多並不更改syscall table的rootkit而Wink下也可開發出類似的rootkit
  那檢測程序是不是還應該掃描內核代碼空間?這樣我們就有了一個運行在內核模式中的Tripwire但這還不夠好因為在大多數的操作系統中我們可以寫出即不更改SST(syscall table)也不更改代碼的內核級rootkit在系統中有很多可以勾連的函數指針(例見[])
  以我看存儲掃描技術決不會成為rootkit檢測的終結這主要是因為我們不能確定具體的監測存儲區域
  那到底怎樣檢測出我們系統中的入侵者呢?
  首先我們以rootkit中所使用的技術將其分為兩類
  *通過更改系統結構來隱藏某對象的(如運行的進程)和
  *更改內核執行路徑(例勾連那些負責枚舉活動進程的內核函數)來達到同樣目的的
  
  更改系統數據結構的rootkit
  這類的rootkit不太多有意思的例子包括fu rootkit(見[])通過刪除內核中PsActiveProcessList鏈上的進程對象來隱藏進程ZwQuerySystemInformation等函數是不能發現這些隱藏進程的但同時因為Windows的線程分派器(dispatcher scheduler)使用另外的數據結構這些隱藏進程仍可運行(被分配到CPU使用時間)Windows的線程分派器使用以下三個(注)數據結構
  
  *pKiDispatcherReadyListHead
  *pKiWaitInListHead
  *pKiWaitOutListHead
  
  後兩個是處於等待狀態的線程鏈頭他們之間稍有不同但對我們來說並不重要
  從上面的信息我們可以找到一種檢測隱藏進程的方法及讀取線程分派器使用的數據結構而不是PsActiveProcessList
  當檢測rootkit時我們應該盡可能的觸及更底層的內核數據結構
  有一點應該注意直接從線程分派器使用的鏈中刪除要隱藏的進程是不可能的因為隱藏的進程將分配不到CPU使用時間
  
  更改執行路徑的rootkit
  這類的rootkit較為普及他們通過修改或增加內核或系統DLL中的指令來達到目的檢測這類rootkit的問題是我們不知道rootkit在什麼地方做了那些修改它可以勾連DLL中的函數系統服務列表(System Service Table)改變內核函數的內容或修改內核中一些奇怪的函數指針
  
  執行路徑分析(Execution Path Analysis)
  EPA關注這樣一個事實如果入侵者通過修改執行路徑隱藏了一些對象那麼當調用一些典型的系統和庫的函數時系統將運行一些多余的指令
  舉個例子如果入侵者為了隱藏文件和進程而修改了ZwQueryDirectoryFile()和ZwQuerySysteminformation()那樣和干淨的系統相比這些系統函數就會執行更多的指令不管入侵者采用勾連或在代碼中加入jmp指令或其他任何方法指令增加的原因是rootkit必須進行它的任務(在這個例子中是隱藏文件和進程)
  但是Windows 的內核是一個非常復雜的程序即使在干淨的系統中某些系統函數每次運行的指令個數也是不同的然而我們可以用統計學來解決這個問題但首先我們需要一種測定指令個數的方法
  
  指令計數器的實現
  單步執行模式是Intel處理器的一個好的特性我們可以用它來實現指令計數當處理器處在這個模式時每執行完一條指令系統將產生一個除錯異常(debug exception #DB)要進入這個模式需要設置EFLAGS寄存器中的TF位(詳見[])
  當執行int指令時處理器會自動清TF位並進行權限切換這意味著如果要進行內核模式下的指令計數則必須在中斷處理程序開頭設置TF位因為我們將要測定一些系統服務中的指令個數勾連中斷向量xe也就是Windows 下的系統服務調用門會變得很有效
  但是因為存在用戶模式的rootkit也應該測定在ring級運行的指令個數只要在用戶模式下設置TF位一次就可以了從內核返回時處理器會自動恢復這一位
  以上的計數方法通過內核驅動器實現如圖所示驅動加載後勾連IDT xxe為和用戶級程序交互驅動勾連一個系統調用用戶級程序通過這個特定的系統調用來開關計數器
  
  一些測試
  我們可以使用上一段中描述的方法來測定任意系統服務中執行的指令個數
  例如來檢查是否有人試圖隱藏任意文件我們可以開始一個簡單的測試
  
  pfStart();
  FindFirstFile(C\\WINNT\\system\\drivers &FindFileData);
  int res = pfStop();
  
  如果有rootkit隱藏任意文件則執行的指令數要比干淨的系統多
  如果運行這個測試上百次並計算執行指令數的平均值我們會發現這個值是非常不確定的考慮Wink的復雜性這一點也不讓人吃驚但對於我們的檢測目的來說這種現象是不能接受的但如果我們將得到的那些值的頻率分布用條形圖表示出來會發現圖中有一個明顯的頻率高點如圖中所表示那樣的即使是在系統負載很大時頻率高點所對應的數值保持不變很難解釋這個令人吃驚的現象可能是因為在循環中同一個系統服務被調用幾百次後與這個系統服務相關的緩沖最後會被填入固定的值
  假想現在有人安裝了隱藏文件的rootkit如果我們重復測試並繪制相應的條形圖就會發現頻率高點向右移了這是因為rootkit需要進行隱藏文件的工作
  在現在的代碼實現中只進行了少量的測試包括典型的服務如文件系統讀取枚舉進程枚舉注冊表項以及Socket讀取
  這些測試將有效地檢測出著名的NTRootkit(見[])或最近比較流行的Hacker Defender(見[])包括它自帶的網絡後門當然還包括很多其他的後門但要檢測出一些更好的後門還要加入一些新的測試
  
  誤報和執行路徑跟蹤
  雖然對頻率高點的檢測有助於我們處理系統的不確定因素但有時會發現測試得到的值有小的差值一般來說不大於
  有時這會是一個很嚴重的問題因為我們不能確定那些多出來的指令意味著被入侵或只是正常的誤差
  為解決這個問題我們使用了執行路徑記錄模式和單一的EPA模式比較系統增加了對執行路徑的記錄(包括地址和運行的指令)首先系統記錄下正常情況下的執行路徑以後的每一次運行將產生diff文件(正常系統和現行系統之間的比較)
  我們應該使用好的反編譯器來分析那些不一樣的地方以此判定他們是否可疑是一個diff文件的例子
  現階段的diff文件只記錄下指令的地址以後可能將兩次測試的不同結果存為PE格式文件並可用IDA等工具分析
  
  檢測 offsetinthecode 的變化
  想象有這樣一個rootkit它基本和上面提到的 fu rootkit (見[]) 一樣但不從PsActiveProcessList中而是從分派器使用的數據結構中移除進程我說過那不可能因為隱藏的進程將分配不到運行時間
  然而rootkit可以同時更改分派器代碼中所使用數據結構的地址(offset)換句話說就是使其使用不同的鏈表但只有分派器使用這個新的 鏈表而系統其他地方還是使用舊的鏈表 (見圖)
  雖然這種技術不會改變執行指令的個數我們還是能檢測到它但需要進一步的完善現有的工具這項功能現在還沒有實現但應該不是很難
  
  針對EPA的攻防
  我們可以想到一些能騙過EPA類檢測工具的方法先把它們分為兩類
  針對特定工具的欺騙
  對EPA類技術的通用攻擊
  
  首先我們考慮一下通用的攻擊方法和怎樣防止這類攻擊接著討論針對特定工具的攻擊以及怎樣通過多態來預防
  
  對EPA類技術的通用攻擊
  首先惡意程序可以勾連包含除錯處理程序(debug handler)地址的IDT入口這樣將暫停記錄運行的指令數當它完成工作時再恢復 IDT入口這樣rootkit中所執行的指令數不會被記錄
  我們可以使用intel的除錯寄存器來防止這類的攻擊可以使用DR和DR寄存器對IDT入口進行寫保護並且為防止rootkit向除錯處理程序的開始處寫入Jmp指令還需對其進行讀保護換句話說我們不想讓rootkit發現除錯處理程序的地址但單純對IDT入口進行讀保護是不行的系統會藍屏但有一簡單的解決方法就是增加額外的一層見圖
  還有一種攻擊的方法在rootkit運行時其將TF位清零並在惡意操作完成時恢復TF位這樣檢測工具也只能發現運行的指令數和正常的系統有細微差別
  另外rootkit還能檢查TF位 如發現被跟蹤則不進行惡意操作這種行為並不會影響rootkit的正常工作因為只有被檢測的進程才被設置TF位
  我們可以防止這種攻擊應該注意到的是運行每一個系統指令前都會運行我們的除錯處理程序以下是簡單的防預方法
  如果除錯處理程序發現上一個運行指令是pushf(將EFLAGS寄存器壓入堆棧)則運行
From:http://tw.wingwit.com/Article/os/youhua/201401/30194.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.