OK! This morning at the class! I had mention about a word:『rootkit』!here is it!
當入侵者成功侵入機器之後,首要的目標就是抹掉入侵系統的相關記錄以及隱藏自己的行蹤,一旦忽略了這些事情,入侵者很容易被系統管理者逮到,而一般入侵者最常使用的方法就是使用 rootkits。許多人會以為 rootkits 是用來取得系統中 root 權限的神奇程式,然而事實上,rootkits 是一堆能竊取密碼,監聽網路流量,留下後門等的程式集,如果入侵者在系統中成功植入 rootkits ,一般人將很難發現已經被入侵,或是只是覺得系統“怪怪的”,卻不知道哪邊出了問題,而對於入侵者來說,將能輕易控制系統,而且通行無阻。
底下將介紹 rootkits 如何達成這些目的,以及如何預防偵測 rootkits 。
Rootkits 是一些工具集, trojaned 程式,竄改過的系統程式的集合,工具集中的程式通常用來抹掉系統中相關的紀錄, plastlog/utmp/wtmp 這些會記錄使用者登入狀況的系統記錄檔, trojaned 程式會留下後門,讓入侵者能再次輕易地進入系統之中,而被竄改過的系統程式會隱藏入侵者的檔案、行程、連線等等,管理者通常信任這些程式的輸出,而讓管理者難以發現入侵者的蹤跡。
目前最常見的 rootkit 是 Linux Rootkit(lrk),以lrk 為例,底下列出這些程式及其功用,工作集包含有:
1. fix — 改變檔案的 timestamp 和 checksum,用來把竄改過的程式的 timestamp和checksum ,更動為和原先的系統中的程式相同。
2. linsniffer — 竊取特定網路訊息(ftp / telnet / imap..)的 sniffer 。
3. sniffchk — 檢查 linsniffer 是否在運作。
4. wted — 查閱或移除 wtmp 中指定的欄位。
5. z2 — 移除某個使用者最後的 utmp/wtmp/lastlog 紀錄
包含的 trojaned 程式有:
1. inetd — 會 listen 在某個port(預設是5002),任何人只要利用這個 port 進入系統就擁有 root 權限。
2. bindshell — 將 root shell bind 在某個 port。
3. chfn / chsh / login / passwd / su—輸入特定密碼就能擁有 root shell。
4. rshd — 讓入侵者以特定帳號登入就能以 root 權限執行程式。
5. sshd — 入侵者以特定帳號密碼登入就能擁有 root shell。
竄改過的系統程式有:
1. crontab — 執行特定的 crontab 檔案,並且隱藏這些欄位。
2. du / find / ls — 隱藏特定的檔案,通常是與 rootkit 相關的檔案。
3. ifconfig — 當啟動 PROMISC 時(sniffing),不顯示 PROMISC flag。
4. netstat — 隱藏指定 address / uid / port 的連線。
5. killall — 無法刪除指定的行程。
6. pidof / ps / top — 輸出結果時濾掉指定的行程,例如以 root 執行的行程,或行程名稱內有特定字串的行程。
7. syslogd — 移除系統紀錄檔中包含特定字串的訊息。
8. tcpd — 不會紀錄以及允許特定連線。
此外,還有一些 rootkits 會以 kernel module 的方式載入系統之中,置換掉某些 system calls,或是取代掉某些 kernel 的功能,另外,也有的 rootkits 會取代系統中的 library,使得使用到這些 library 的程式相當於都有潛在的問題。那我們要如何預防這些 rootkit 安裝到系統內部呢?在此提供幾點建議:
1. 將放置系統程式的檔案系統設定為唯讀或是使用 chattr 將重要檔案設定為唯讀。
2. 不要啟用 kernel module 的功能。
3. 重要的程式使用 static-link 的方式避免連結到被竄改過的 library。
4. 使用 md5 或是 pgp 等嚴密的驗證演算法確認檔案的正確性。
若要偵測 rootkits 竄改系統檔案,一般使用 tripwire,提供許多演算法如MD5 / Snefu / SHA 等,可以驗證檔案是否被竄改,如果與原先的檔案不符,將提醒管理者。可參閱 http://www.tripwire.org/得到更多詳細訊息。
如果懷疑自己可能已經被植入rootkits,可以使用 chkrootkit 來檢查,chkrootkit 提供許多工具檢查是否被植入 rootkits,例如 chkrootkit 會檢查幾個可能被竄改過的系統程式,以及檢查是否有 rootkits 常使用的工具,此外ifpromisc 用來檢查 PROMISC flag 是否開啟, chkwtmp / chklastlog 可用來確認lastlog / wtmp 的正確性,另外如果系統擁有 process file system,就可以使用chkproc 來比對 ps 的輸出和 process file system 的差異。可參閱http://www.chkrootkit.org/得到更多詳細訊息。
我們也可以利用一些簡單的方式來檢查是否被植入 rootkits,例如使用 echo的輸出和 ls 的輸出比對,或著是檢查 /dev/底下有沒有任何“正常”(regular)的檔案,通常/dev/ 底下都是 block special file 或是 character special file,像 lrk的設定檔預設值就是放在 /dev/ 底下,或著使用 nmap 等類似的 port scanner 來檢查系統是否有對外開出任何不正常的 port,另外也建議使用沒有被'污染'的系統程式來檢查系統,並更動PATH使用正常的程式來一一檢查可能被入侵的系統。
以上大略介紹過 lrk,其他 NIX 平台的 rootkits 大致上相同,而對於Windows平台的NT Rootkits,除了隱藏檔案目錄之外,也隱藏 registry,甚至擁有自己的TCP/IP Stack,一但被植入非常難發現。
隨著 rootkits 不斷的發展,入侵者的匿蹤技巧越來越高超,要發現入侵者越來越困難,只能依賴系統管理者平時做好完善的安全政策,不讓入侵者有可趁之機,如此才能確保系統安全的長久之道。