摘要:本文討論了Linux環境下攻擊者入侵成功以後常常使用的一些後門技術,並且對最著名的rootkit工具之一—knark進行了詳細的分析,並且指出了在發現系統被入侵以後如何發現是否是kark及如何恢復。
注意:本文是用於管理員學習之用,不可用於進行網絡攻擊否則帶來的任何法律後果自行負責。本文作者不對由於本文導致的任何後果負任何責任。
一、什麼是"rootkit"?
入侵者入侵後往往會進行清理腳印和留後門等工作,最常使用的後門創建工具就是rootkit。不要被名字所迷惑,這個所謂的“rootkit”可不是給超級用戶root用的,它是入侵者在入侵了一太主機後,用來做創建後門並加以偽裝用的程序包。這個程序包裡通常包括了日志清理器,後門等程序。同時,程序包裡通常還帶有一些偽造的ps、ls、who、w、netstat等原本屬於系統本身的程序,這樣的話,程序員在試圖通過這些命令查詢系統狀況的時候,就無法通過這些假的系統程序發覺入侵者的行蹤。
在一些黑客組織中,rootkit (或者backdoor) 是一個非常感興趣的話題。各種不同的rootkit被開發並發布在internet上。在這些rootkit之中, LKM尤其被人關注, 因為它是利用現代操作系統的模塊技術。作為內核的一部分運行,這種rootkit將會越來越比傳統技術更加強大更加不易被發覺。一旦被安裝運行到目標機器上, 系統就會完全被控制在hacker手中了。甚至系統管理員根本找不到安全隱患的痕跡, 因為他們不能再信任它們的操作系統了。後門程序的目的就是甚至系統管理員企圖彌補系統漏洞的時候也可以給hacker系統的訪問權限。
入侵者通過:設置uid程序, 系統木馬程序, cron後門等方法來實現入侵者以後從非特權用戶使用root權限。
*設置uid程序。 黑客在一些文件系統理放一些設置uid腳本程序。無論何時它們只要執行這個程序它們就會成為root。
*系統木馬程序。黑客替換一些系統程序,如"login"程序。因此, 只要滿足一定的條件,那些程序就會給黑客最高權限。
*Cron後門。黑客在cron增加或修改一些任務,在某個特定的時間程序運行,他們就可以獲得最高權限。
具體可能通過以下方法給予遠程用戶以最高訪問權限: ".rhost" 文件, ssh認證密鑰, bind shell, 木馬服務程序。
*".rhosts" 文件。一旦 "+ +"被加入某個用戶的.rhosts文件裡, 任何人在任何地方都可以用這個賬號來登陸進來而不需要密碼。
*ssh認證密鑰。黑客把他自己的公共密鑰放到目標機器的ssh配置文件"authorized_keys"裡, 他可以用該賬號來訪問機器而不需要密碼。
*Bind shell。黑客綁定一個shell到一個特定的tcp端口。任何人telnet這個端口都可以獲得交互的shell。更多精巧的這種方式的後門可以基於udp,或者未連接的tcp, 甚至icmp協議。
*Trojaned服務程序。任何打開的服務都可以成為木馬來為遠程用戶提供訪問權限。例如, 利用inetd服務在一個特定的端口來創建一個bind shell,或者通過ssh守護進程提供訪問途徑。
在入侵者植入和運行後門程序之後, 他會設法隱藏自己存在的證據,這主要涉及到兩個方面問題: 如何來隱藏他的文件且如何來隱藏他的進程。
為了隱藏文件, 入侵者需要做如下事情: 替換一些系統常用命令如"ls", "du", "fsck"。在底層方面, 他們通過把硬盤裡的一些區域標記為壞塊並把它的文件放在那裡。或者如果他足夠瘋狂,他會把一些文件放入引導塊裡。
為了隱藏進程, 他可以替換 "ps"程序, 或者通過修改argv[]來使程序看起來象一個合法的服務程序。有趣的是把一個程序改成中斷驅動的話,它就不會出現在進程表裡了。
RootKit-Knark的歷史
Knark是第二代的新型rootkit工具-其基於LJM(loadable kernel module)技術,使用這種技術可以有效地隱藏系統的信息。作者在代碼和README文件中都標注有不承擔責任的聲明,聲明該代碼不可以被用作非法活動。然而該軟件可以容易地被用於這種目的。
Knark是由[email protected]編寫的,主要基於http://www.dataguard.no/bugtraq/1997_4/0059.Html中Runar Jensen編寫的代碼heroin.c,設計思想主要來自於Phrack 52中plaguez發表的文章Weakening the Linux Kernel"。在重新編寫了heroin.c的大部分代碼以後,Creed決定重新命名為"Knark",在瑞典語中是指吸毒者。Creed編寫的其他軟件可以在www.sekure.net/~happy-h/得到,但是由於該站點只有瑞典語版本,因此應用並不廣泛。
Knark的第一個公開版本是0.41,發布於June, 1999。可以在B4B0 #9中索引到它:http://packetstorm.securify.com/mag/b4b0/b4b0-09.txt。隨後0.50和0.59被發布,當前版本是0.59。可以從這裡下載0.59版。
Knark特性
Knark0.59具有以下特性:
*隱藏或顯示文件或目錄
*隱藏TCP或UDP連接
*程序執行重定向
*非授權地用戶權限增加("rootme")
*改變一個運行進程的UID/GID的工具
*非授權地、特權程序遠程執行守護進程
*Kill –31來隱藏運行的進程
聯合使用程序執行重新定向和文件隱藏,入侵者能提供各種後門程序執行。由於執行重定向是在內核級別進行的,因此文件檢測工具不會發現程序文件被修改-原始的執行程序並沒有被修改,因此配置檢測工具在路徑環境中也不會發現任何異常。
如果Knark結合另外一個用來隱藏系統當前加載的模塊的LKM工具modhide,就可能實現甚至通過lsmod命令也不能發現knark的存在。
Knark軟件包的安裝和使用
該軟件包的核心軟件是knark,c,它是一個Linux LKM(loadable kernel-module)。運行命令"make"來編譯knark軟件包,通過"insmod knark"命令來加載該模塊。當knark被加載,隱藏目錄/proc/knark被創建,該目錄下將包含以下文件:
author 作者自我介紹
files 系統中隱藏文件列表
nethides 在/proc/net/[tcpudp]隱藏的字符串
pids 被隱藏的pids列表,格式類似於ps命令輸出
redirects 被重定向的可執行程序入口列表
該軟件包編譯以後將有下面這些工具軟件(它們都依賴於被加載的模塊knark.o。除了taskhack.c,其用於直接修改/dev/kmem)
hidef 用於在系統中隱藏文件
在/usr/lib目錄下創建子目錄hax0r,然後運行命令"./hidef /usr/lib/.hax0r",則該目錄會被隱藏,"ls"或"du"等命令都不能顯示該目錄及其子目錄。
unhidef 用來恢復被隱藏的文件
你可以通過訪問"cat /proc/knark/files"來察看你隱藏了哪些文件。通過"./unhidef /usr/lib/.hax0r"命令來解除對隱藏文件的隱藏。但是這裡有個小小的bug,使得被隱藏的目錄在/proc/knark/files中顯示的是其加載開始的路徑,也就是說如果系統有一個文件系統加載在/mnt,你隱藏了/mnt/secret,則在/proc/knark/files中顯示的被隱藏的目錄為/secret。因此不會影響根文件被隱藏的目錄。
ered 用來配置重定向程序的執行
拷貝特洛伊木馬版本的sshd為/usr/lib/.hax0r/sshd_trojan,然後運行"./ered /usr/local/sbin/sshd /usr/lib/.hax0r/sshd_trojan",這樣當/usr/local/sbin/sshd被運行時,實際上運行的特洛伊木馬版本的sshd。可以通過命令./ered -c來清楚所有的可執行程序重定向。
nethide 用來隱藏/proc/net/tcp和/proc/net/udp中的某些字符串
netstat命令就不會得到指定的鏈接信息。通過命令/nethide ":ABCD "可以隱藏和端口號ABCD(十六進制)相關的連接(43981 dec)。也就是對/proc/net/[tcpudp]讀取時進行"grep -v"操作。
你必需理解使用該程序從/proc/net/[tcpudp]得到的輸出的意義。假設系統運行有sshd,那麼連接到本地22端口以後,運行"netstat -at",則輸出可能包含:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ssh localhost:1023 ESTABLISHED
現在我們來檢測文件/proc/net/tcp:
cat /proc/net/tcp
則輸出可能包含入下內容:
local_address rem_address blablabla...
0:0100007F:0016 0100007F:03FF 01 00000000:00000000 00:00000000 00000000
若我們希望隱藏和地址127.0.0.1相關的任何信息,我們必須使用如上面所示的十六進制的格式。因此如果希望隱藏地址127.0.0.1的22號端口相關的內容就要使用0100007F:0016來標識該鏈接。因此
./nethide "0100007F:0016"
將隱藏to/from localhost:22相關的鏈接信息。
./nethide ":ABCD "
來去除隱藏。
rootme 用來實現非特權用戶獲得root訪問權限
./rootme /bin/sh
就可以實現以root身份運行/bin/sh。
./rootme /bin/ls -l /root
則是僅僅以root身份運行單個命令。
taskhack 用來改變某個運行著的進程的uid和gid
./taskhack -alluid=0 pid
該命令將進程pid的所有*uid's (uid, euid, suid, fsuid)為0 (root).
ps aux grep bash
creed 91 0.0 1.3 1424 824 1 S 15:31 0:00 -bash
現在來改變該進程的euid為0:
./taskhack -euid=0 91
ps aux grep bash
root (!) 91 0.0 1.3 1424 824 1