Linux環境下的高級隱藏技術
隱藏技術在計算機係統安全中應用十分廣泛,尤其是在網絡攻擊中,當攻擊者成功侵入一個係統後,有效隱藏攻擊者的文件、進程及其加載的模塊變得尤為重要。本文將討論Linux係統中文件、進程及模塊的高級隱藏技術,這些技術有的已經被廣泛應用到各種後門或安全檢測程序之中,而有一些則剛剛起步,仍然處在討論階段,應用很少。[b]1、隱藏技術[/b]
1.1.Linux下的中斷控制及係統調用
Intelx86係列微機支持256種中斷,為了使處理器比較容易地識別每種中斷源,把它們從0~256編號,即賦予一個中斷類型碼n,Intel把它稱作中斷向量。
Linux用一個中斷向量(128或者0x80)來實現係統調用,所有的係統調用都通過唯一的入口system_call來進入內核,當用戶動態進程執行一條int0x80匯編指令時,CPU就切換到內核態,並開始執行system_call函數,system_call函數再通過係統調用表 sys_call_table來取得相應係統調用的地址進行執行。係統調用表sys_call_table中存放所有係統調用函數的地址,每個地址可以用係統調用號來進行索引,例如sys_call_table[NR_fork]索引到的就是係統調用sys_fork()的地址。
Linux用中斷描述符(8字節)來表示每個中斷的相關信息,其格式如下: [color=#f5fafe]中國[/color]
偏移量31….16一些標志、類型碼及保留位
段選擇符偏移量15….0
所有的中斷描述符存放在一片連續的地址空間中,這個連續的地址空間稱作中斷描述符表(IDT),其起始地址存放在中斷描述符表寄存器(IDTR)中,其格式如下:
[b]32位基址值界限[/b] 中國
其中各個結構的相應聯係可以如下表示:
通過上面的說明可以得出通過IDTR寄存器來找到system_call函數地址的方法:根據IDTR寄存器找到中斷描述符表,中斷描述符表的第0x80項即是system_call函數的地址,這個地址將在後面的討論中應用到。
1.2.Linux的LKM(可裝載內核模塊)技術 [color=#f5fafe][/color]
為了使內核保持較小的體積並能夠方便的進行功能擴展,Linux係統提供了模塊機制。模塊是內核的一部分,但並沒有被編譯進內核,它們被編譯成目標文件,在運行過程中根據需要動態的插入內核或者從內核中移除。由於模塊在插入後是作為Linux內核的一部分來運行的,所以模塊編程實際上就是內核編程,因此可以在模塊中使用一些由內核導出的資源,例如Linux2.4.18版以前的內核導出係統調用表(sys_call_table)的地址,這樣就可以根據該地址直接修改係統調用的入口,從而改變係統調用。在模塊編程中必須存在初始化函數及清除函數,一般情況下,這兩個函數默認為init_module ()以及clearup_module(),從2.3.13內核版本開始,用戶也可以給這兩個函數重新命名,初始化函數在模塊被插入係統時調用,在其中可以進行一些函數及符號的注冊工作,清除函數則在模塊移除係統時進行調用,一些恢復工作通常在該函數中完成。 [color=#f5fafe][/color]
1.3.Linux下的內存映像
/dev/kmem是一個字符設備,是計算機主存的映像,通過它可以測試甚至修改係統,當內核不導出sys_call_table地址或者不允許插入模塊時可以通過該映像修改係統調用,從而實現隱藏文件、進程或者模塊的目的。 [color=#f5fafe][/color]
1.4.proc文件係統
proc文件係統是一個虛擬的文件係統,它通過文件係統的接口實現,用於輸出係統運行狀態。它以文件係統的形式,為操作係統本身和應用進程之間的通信提供了一個界面,使應用程序能夠安全、方便地獲得係統當前的運行狀況何內核的內部數據信息,並可以修改某些係統的配置信息。由於proc以文件係統的接口實現,因此可以象訪問普通文件一樣訪問它,但它只存在於內存之中。
[b]2、技術分析[/b]
2.1隱藏文件
Linux係統中用來查詢文件信息的係統調用是sys_getdents,這一點可以通過strace來觀察到,例如stracels將列出命令 ls用到的係統調用,從中可以發現ls是通過sys_getedents來執行操作的。當查詢文件或者目錄的相關信息時,Linux係統用 sys_getedents來執行相應的查詢操作,並把得到的信息傳遞給用戶空間運行的程序,所以如果修改該係統調用,去掉結果中與某些特定文件的相關信息,那么所有利用該係統調用的程序將看不見該文件,從而達到了隱藏的目的。首先介紹一下原來的係統調用,其原型為:
intsys_getdents(unsignedintfd,structdirent*dirp,unsignedintcount)
Www.
其中fd為指向目錄文件的文件描述符,該函數根據fd所指向的目錄文件讀取相應dirent結構,並放入dirp中,其中count為dirp中返回的數據量,正確時該函數返回值為填充到dirp的字節數。 [color=#f5fafe][/color]
hacked_getdents函數實際上就是先調用原來的係統調用,然後從得到的dirent結構中去除與特定文件名相關的文件信息,從而應用程序從該係統調用返回後將看不到該文件的存在。
應該注意的是,一些較新的版本中是通過sys_getdents64來查詢文件信息的,但其實現原理與sys_getdents基本相同,所以在這些版本中仍然可以用與上面類似的方法來修改該係統調用,隱藏文件。
頁:
[1]