https://www.informationsecurity.com.tw/seminar/2021twcert/
https://www.informationsecurity.com.tw/seminar/2021twcert/

觀點

找出rootkit

2004 / 10 / 26
林玉峰
找出rootkit

現今的網路安全問題普遍圍繞在駭客、攻擊者與入侵者之間。作業系統與軟體上相繼發現的許多安全弱點,使駭客更容易入侵電腦。一般而言,當駭客破解密碼或透過某個已知弱點成功入侵系統後,下一步即要隱藏自己的蹤跡並保留下一次使用 root 帳號的權限。駭客成功取得使用者權限後,即可利用相關工具 (例如rootkit),來蒐集使用者 ID 與密碼,以取得 root 的使用權限。目前已經出現各種作業系統 (windows、unix…) 版本的 rootkit,利用它來進行的入侵動作很難被偵測。本文從使用者的角度探討,如何找出作業系統是否有被安裝 rootkit,讓使用者在享受電腦的便利之餘,又能兼顧到資料的安全性。
何謂 rootkit ?
rootkit這個名詞,來自root與kit兩個字的結合。root是unix系統中管理者的名稱,代表unix系統裡的最高權限;kit則是工具套件的意思。因此我們可以了解rootkit是一套要讓攻擊者可以獲得受攻擊電腦最高權限的工具,為了維持以後與該部電腦之聯繫,利用root權限隱藏與電腦的溝通,不讓管理者發現。

實際上rootkit所做的就是隱藏攻擊者的蹤跡並植入一些工具,這些工具可以蒐集使用者的密碼與帳號。在unix環境中,攻擊者進入電腦之後,首要工作就是安裝rootkit,但通常必須是root帳號才能夠安裝rootkit,所以攻擊者就會利用已知的遠端遙控弱點或其他破解方式來取得root的帳號與密碼。

rootkit工具能偽裝成正常的程式,事實上卻偷偷地把正常的程式換掉,並留下一些特殊的後門,以方便往後控制主機運作,或進行資料竊取。rootkit 也稱為後門程式 (backdoor) 或木馬程式 (trojan)。 駭客利用各種方法(遠端攻擊、密碼猜測、暴力破解等)來取得系統的root權限後,即可在目標主機上面安裝rootkit來隱藏入侵的蹤跡,並且保留下次root的權限,所以說rootkit 是讓攻擊者再一次進入您電腦的工具。

某些複雜的rootkit還可以提供攻擊者 telnet、shell和finger等服務,包含用來清理 /var/log和 /var/adm目錄與其他檔案。

rootkit 的類型
我們可以將 rootkit 分為兩大類:
1.Application rootkit – 建立於應用層級 Application rootkit是我們最常看得到的 rootkit ,也是最廣泛被拿來利用的工具。使用方法是以 rootkit 中的 trojaned 來替換系統中正常的應用程式與系統檔案。trojaned 系統檔案會提供後門給攻擊者進行攻擊,隱藏攻擊者的蹤跡,攻擊者做的任何活動都不會儲存在紀錄檔中。下面列舉了一些攻擊者可能取代的檔案:

*隱藏攻擊者蹤跡的程式—

1.ls, find, du —trojaned 可以隱藏攻擊者檔案、欺騙系統,讓系統的檔案及目錄洩露訊息。

2.ps, top, pidof —這些程式都是程序監看程式,它們可以讓攻擊者在進行攻擊的過程中,隱藏攻擊者本身的程序。

3.netstat —netstat是用來檢查網路活動的連結與監聽,如開放的 port等。Trojaned netstat 可以隱藏攻擊者的網路活動,例如ssh daemon 或其他服務。

4.killall —Trojaned killall 讓管理者無法停止程序。

5.ifconfig —當監聽軟體正在執行時,Trojaned ifconfig不會顯示PROMISC flag,這樣可以隱藏攻擊者,不被監聽軟體察覺。

6.crontab —Trojaned crontab可以隱藏攻擊者的 crontab 進入情況。

7.tcpd, syslogd —Trojanised tcpd與 “syslog”不會對攻擊者作出紀錄檔。“tcpd”的能力可以繞過 tcp。

*後門程式
1.chfn —提升使用者的權限。執行 chfn 時,輸入全新的使用者名稱,只要輸入 rootkit 的密碼,就可以獲得 root 的權限。
2.chsh —提升使用者的權限。執行 chsh 時,輸入新的 shell 時,輸入 rootkit 密碼,就可以獲得root的權限。
3.passwd —提升使用者的權限。執行 passwd 時,輸入新的密碼時,只要輸入rootkit 的密碼,就可以獲得 root 的權限。
4.login —能夠紀錄任何使用者名稱,包含 root 進入的密碼。
5.bd2 —Trojaned rpcbind允許攻擊者在受害的主機上面執行任意的程式碼。

木馬程式程式—inetd —Trojaned inetd 可以替攻擊者打開遠端登入的 port,只要輸入密碼就可以獲得 root 的權限。
1.rshd —替攻擊者提供遠端的 shell。(範例:rsh [hostname] - l [rootkit password])
2.rsh —透過rsh可以獲得 root 的密碼。(範例:rsh [hostname] - l [rootkit password)
3.sshd —攻擊者以特定帳號密碼登入就能擁有 root shell的權限。
*監聽程式
1.linsniffer —linux小型的監聽程式。
2.sniffchk —這個程式可以檢驗與確認網路監聽程式是否正在執行。
3.le —Solaris Ethernet 封包的監聽程式。
4.snif —linux其他封包的監聽程式。
5.sniff-10mb —這是一個設計來監聽10mbps Ethernet的監聽程式。
6.sniff-100mb —這是一個設計來監聽100mbps Ethernet的監聽程式。
*其他種類
1.fix —安裝 trojaned程式的時候(例如ls)更改的時間戳記與檢驗封包值的訊息。
2.wted — wtmp的編輯程式。可以讓攻擊者修改wtmp。
3.z2 —移除 wtmp/utmp/lastlog。
4.bindshell —把 rootshell與某個port結合在一起。(預設的 port為31337)
5.zap3—攻擊者會從wtmp,utmp,lastlog,wtmpx 和utmpx移除他們的蹤跡。zap3通常根據下列的目錄來找尋紀錄檔的位置,例如/var/log, /var/adm, /usr/adm, 與 /var/run
*2.Kernel rootkit — 建立於kernal的層級 Kernel rootkit是一種強而有力的 rootkit,這類的工具比 Application rootkit更有能力。Kernel rootkit 透過操作與利用kernel,已經成為最難以發現 rootkit,因為它能夠在應用層檢查中,建立一條繞過檢驗的通道。雖然這種軟體的釋出主要是針對 linux 所製作的,但它可能被修改來針對某個port或者是其他的作業系統來做攻擊,一旦被安裝在目標主機上面,系統就可以說是完全的被駭客所控制,甚至系統管理員根本找不到駭客隱藏的蹤跡。
Kernel rootkit 如何運作的呢?Kernel rootkit 基本上是利用 LKM『Loadable Kernel Module』的功用可讓攻擊者做出不合法的動作。 LKM 在 linux 或是其他系統中都是一個非常有用的工具,支援 LKM 的系統包含 FreeBSD 與 Solaris 都在其中。我們都知道作業系統裡面有一些函數是用來建構kernel,這些函數是被系統拿來執行的,當這些函數遭到假冒與竄改,主機就不能再被信任了。

下面是針對 Kernel rootkit 的一些運作方式來做介紹:

1.隱藏程序—在unix的執行過程中,程序的紀錄訊息會存放於檔案系統中的 “/proc”,隱藏程序可以操作 sys_getdents() 系統去呼叫函數,那麼在程序的架構裡就看不見這些附加而且正在執行的程序。

2.隱藏網路連結—類似於隱藏程序,網路連結會紀錄在“/proc/net/tcp” 與 “/proc/net/udp” 這兩個檔案之中,執行Kernel rootkit,無論何時讀取這兩個檔案,都會隱藏攻擊者的蹤跡,不讓用戶知道。

3.隱藏 LKM 的信號—通常在LKM的預設值是可以被看見的,這樣是為了方便其他的使用者也可以使用。對攻擊者來說,隱藏這些信號是必須的,攻擊者可以使用"EXPORT_NO_SYMBOLS"的命令,這個命令可以防止任何信號被洩漏出去。

4.利用LKM傳遞訊息—LKM Kernel rootkit被安裝完成之後,攻擊者若要通知 kernel隱藏另一個文件,攻擊者可以透過 Kernel rootkit 來替換掉sys _ settimeofday()。之後只要透過一些特別的參數,就可以請求系統來完成攻擊者想要完成的事情。

5.改變檔案的執行—有時攻擊者可能想要替換掉某些檔案,例如"login",但是攻擊者並不想要更改檔案,這時候 Kernel rootkit 能夠替換replace sys_execve()。這樣的話,系統會持續執行"login"。這樣就會洩漏"login"程式的版本給攻擊者。

目前最流行的 Kernel rootkit,包含了 linux 上的 knark 與 Solaris 上的Loadable Kernel Module,其中 knark 還包含了其他的程式,如下:
1.hidef:用來隱藏檔案。
2.unhidef:用來設定執行檔重新導向,使攻擊者的木馬可以被執行。
3.nethide:可以隱藏 /proc/net/tcp與/proc/net/udp 的字串,這也是netstat 擷取資料的地方,攻擊者可以用這個工具將目標主機上把使用中的連線訊息隱藏起來。
4.taskhack:可以改變正在執行中的程序,因此攻擊者可以將 /bin/sh 的程序,更改成為root的使用者帳號。
5.rexec:可以從遠端再 knark 伺服器上執行命令,也可以用來支援 ip造假的功能。
6.rootme:可以將權限提升到 root。



rootkit之對策
一個在電腦安全領域中重要的問題是,如何判斷給定的主機是否已被入侵。由於以下兩點使得這項工作變得非常困難:
1.攻擊者可以利用未知漏洞進入系統。
2.當進入系統後,入侵者可透過安裝rootkit和後門來隱藏自己(例如:隱藏程序、通訊通道、檔案等)。
當入侵者植入rootkit之後,首先會隱藏其蹤跡,所以系統通常不會有太大的改變,就算系統管理員透過正常的指令來查看系統,也不會發現記憶體中有任何不正常的程序運作,因為這幾個指令都已經被rootkit的工具集置換掉了。
然而這類的程式畢竟不是正常的指令,它與系統中原始的程序還是存在著某種不同的差異,或許短時間內無法察覺,但是經過一段時間,這些經過置換的程式也會無法發揮原始程序的完全功能,更甚於會對系統造成莫大的損傷,於是終將使系統造成停擺。沒有人可以保證自己的系統不會被入侵者植入類似的程序,然而只要日常生活中注意到一些與系統安全有關的小細節,避免系統被不知名人士侵入,抑或即使系統被植入rootkit,也能夠即時的發覺,並且把rootkit造成的損害減到最小。

檔案編碼的檢查碼是對抗rootkit攻擊的利器,但是前提必須保持系統在未污染的原始狀態下,也就是說,這是一個預防性的防衛措施。像是MD5sum之類的免費軟體,這種軟體就可以對檔案拓取記號,一旦被竄改過,馬上就可以偵測出來。防止網路竊聽最好的還是老方法,就是傳輸的時候將資料加密,例如SSH、SSL、電子郵件的PGP等。

Kernel rootkit的破壞力驚人,卻也讓管理者難以偵測,當你的系統被攻擊者破解之後,系統上面所執行的程式碼與系統核心本身已經不能夠再相信了。即使是tripwire之類的檢查程式,也都不能相信。我們都希望自己都不會是攻擊者的下一個目標,但是沒有人可以保證下一個不會是你,所以預防重於治療,如LIDS就是一個不錯的程式,這個程式可以用來增強linux的防禦力,它的功能如下:

1.可以將你的系統核心封閉保存起來,避免被攻擊者竄改。
2.預防核心的載入與移除。
3.不能修改檔案的屬性。
4.鎖定共享記憶體。
5.防止程序被竄改。
6.掃描port。
7.保護/dev/的重要檔案。 LIDS是一個核心的修正,必須套用到你現有的核心原始碼,接著必須重新建立你的Kernel。除了LIDS之外,還有一個套件也可以用來阻止rootkit的入侵,St.Michael是一個LKM,它會試圖偵測並轉移正在執行中的linux系統上安裝kernek rootkit。

chkrootkit 目前chkrootkit 0.43可以偵測出以下的rootkits, worms 與LKMs已高達五十多種,其中包含lrk3, lrk4, lrk5, lrk6 (variants) ,t0rn (and variants), rh[67]-shaper等,相關詳細資料可以參考http://www.chkrootkit.org。 chkrootkit 0.43程式可以至下列網址下載:http://www.chkrootkit.org最新版為chkrootkit 0.43 (Release Date: Sat Dec 27 2003),chkrootkit 0.43模組包含了以下三種:
1.ifpromisc.c
2.chkproc.c
3.chkrootkit

結語
隨著網路的發達,各類資訊變得隨手可得,但其中也潛藏著各種犯罪機會。rootkit也由以往較簡單的破壞程序,例如替換作業系統中login或ifconfig等正常的二進位執行程式,進展到直接對系統核心(kernel)進行編譯,而隨著入侵者的隱藏技術日益高超,系統管理員要發現入侵者也更加困難。

當rootkit替換這些程序之後,看起來並無任何危機,管理員也絕對的信任系統,事實上 rootkit透過它們隱藏了入侵者的足跡,並將這些程序的時間郵戳(timestamp)設定成與這個目錄下其他程序相同,藉以抹去入侵者曾經進入系統的紀錄,經過這種偽裝,使系統管理者不易察覺已被入侵。

rootkit的發展愈來愈快速,若系統管理員無法訂定一套完善的安全政策,將有可能開啟一道無形的大門,使入侵者來去無阻,也更加深了資料外洩的危險性。

而為了不讓入侵者有可趁之機,在完善的安全政策之中,並須明確地建立不同層級安全的工作及責任,加強弱點防禦、擬定遭受破壞後的重建計畫,及失敗經驗的學習。當然在計畫制定後,也必須確實執行,如此才是確保系統安全的最佳防範之道。

本文作者林玉峰現任於台灣電腦網路危機處理暨協調中心(TWCERT/CC)