作業系統是通過訊息傳遞驅動各種事件動作的,要想監控系統內的動態,發現黑客的入侵行為,需要對非常多的「重要操作」進行監控,比如:許可權的變更、程序的建立與被殺、網路連線的變化、檔案的讀寫、登錄檔的變化、驅動程式的載入、遠端執行緒注入等等。
如何實現這些系統行為的監控呢?就是在這些動作程式被執行前,插入自己的一段程式**,檢查驅動程式的訊息是從**來的,若跟自己無關,就交給原來的程式去執行,若關乎自己,則越俎代庖,先執行自己的動作,再看情況是否交給原來的程式,還是直接返回。這個過程就是我們常說的hook。
hook
的中文翻譯是「鉤子」,
其技術品種算起來很多,如
iat hook
,eat hook
,ssdt hook
,shadow ssdt hook
,idt hook
,irp hook
,spi hook
,tdi hook
,ndis hook
、inline hook
等。hook
監控功能很強大,比如木馬記錄你的鍵盤輸入,就可盜取你的賬戶與密碼。
作業系統為了安全起見分為不同的許可權級別,常見的區分為使用者模式與核心模式(如
windows)
,兩者之間通過系統服務描述表
(ssdt)
進行通訊,能進入系統核心模式,就意味著使用系統高階許可權,所以
ssdt hook
是很多防毒與監控軟體的選擇。
ssdt
就是一張驅動程式的記錄表,表中記錄著要執行驅動程式所在位置的指標,
hook
就是把這些指標先保留起來,再在表中填寫上自己驅動程式的位址,從而獲得優先執行許可權。
如何掛鉤子不是本文的重點,本文討論的是某乙個點上掛了很多鉤子的情況下,會產生的一些安全問題。
問題提出:
下圖是使用者實現操作的呼叫過程:使用者程式需要建立程序時,通過ssdt某位置的函式指標,找到系統驅動程式的物理位置。
當我們要監控這個建立動作時,就在函式呼叫表中掛上乙個鉤子。若還有其他的應用程式也想要監控這個動作時,又在這裡掛上鉤子。注意此時的鉤子是掛在前乙個鉤子上的,由於掛鉤子的時候,看到的位址指標,不知道是原始驅動程式的位址,還是別人的鉤子位址,一般就直接掛上。如此下去…最終形成乙個如圖的「鉤子鏈」。
顯然這個鉤子鏈是倒序的,也就是說後來的監控者佔據了呼叫表的位址空間。這就意味著後掛的鉤子程式會先得到執行的權利,從安全的角度來講,這顯然是有問題的。
1、
後掛鉤者的優先:
a)
後掛鉤者先得到執行權,則可以遮蔽對自己的不利訊息,讓先掛鉤的監控者得不到這個訊息;
b)
後掛鉤者可以在掛鉤時,不管此處原來是否有鉤子,直接替換為自己的驅動程式位址,並完全包含原有驅動程式的功能,不再呼叫原來的程式,達到類似rootkit入侵的效果;
2、
先掛鉤者的反擊:先掛鉤子者意味著先啟動自己,建立好監控程序,當發現後來者摘掉自己的鉤子時,可以採取下面動作:
a)
立即報警,自己的監控可能要失效,通知管理員「有人在搞破壞」;
b)
重啟自己的掛鉤子程式,把自己的鉤子重新掛上,保證自己才是鉤子鏈的起始點;
c)
摘掉破壞者的鉤子,保持自己的監控「壟斷地位」;
當系統中有兩個程式都有上述機制時,系統就「崩潰」了。比如我們同時安裝兩個病毒查殺軟體,就有可能出現了「衝突而宕機」的現象。
安全思考:
鉤子是系統監控最常用的手段,我們能監控到系統內的動態變化時,會有安全感;而我們能確定沒有人能偷偷監控我時,我們才不會有恐懼感。因此,能把鉤子鏈視覺化地展現出來,是安全上的需求。對於開源的linux,可以修改核心驅動;但對於不開源windows,就只能利用微軟提供的介面函式,對核心的操作是很有限的。
要解決的問題很多,我這裡列出了一些,希望能有好的解決辦法:
1、
掛鉤子時,如何確認我的前邊是否為原始的系統驅動程式?
看到的只是程式的記憶體位址。有乙個方法是,因為我知道這個點具體驅動是什麼,可以查詢對應dll的記憶體基位址,從而計算出正確的函式位址,與這裡進行比較是否正確。如果還要確定這個被調入記憶體的dll是否被篡改過,還需要對其磁碟上的檔案進行校驗,如md5碼校驗
2、
如果前面已經是別人的鉤子,我想確定它是誰引入的,dll是誰,主程式是誰?
希望有好的辦法
3、
當我前邊不只有乙個鉤子時,我想畫出這個鉤子鏈每個節點的屬主圖?
希望有好的辦法
4、
當後邊來的進行掛鉤子時,或來摘我的鉤子時,我是否可以直接拒絕它的動作?
重新啟動掛鉤程序是沒有辦法的辦法,希望有更好的辦法
5、
可以用來掛鉤子的技術方法究竟有多少種?
希望有好的辦法
6、
需要監控的掛鉤子點究竟有多少個,多少個是對系統安全造成威脅的?
需要經驗值,希望有好的辦法
鉤子是驅動程式開發發展來的技術,成為安全常用手段。本文只是從需求的角度起個頭,歡迎愛好的同學一起探
談談小白理解的js中的原型鏈問題
原型中的問題主要是理清楚建構函式,例項和原型物件之間的關係,每乙個建構函式都會有乙個原型物件,原型物件都包含乙個指向建構函式的指標 在屬性constructor中 每個例項也都有乙個指向原型物件的指標。如果我們進一步設想,把原型物件作為另乙個型別的例項又會怎麼樣呢?按照之前的理論,這個例項也會有乙個...
zabbix監控託管主機遇到問題
昨天監控公司的託管主機時發現監控不上,回想起來其實就是個小問題,分分鐘能解決的事,排錯的過程才是真正耗心費神的。a zabbix server 192.168.17.110 server端設在公司內部 b zabbix agent 10.200.66.90 被動模式 這台伺服器為託管機 a 192....
nagios 監控 linux主機的資訊
監控linux主機的程序數量資訊 有需要監控linux centos 主機上某個程序的數量,比如 監控 mysql mmm monitor主機上的 usr lib mysql mmm monitor checker 程序數量。如果正常的話,monitor 應該啟動5個程序。相關資訊如下 root 1...