入侵工具Knark的分析及防范
本文討論了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是由creed@sekure.net編寫的,主要基于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/[tcp udp]隱藏的字符串
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/[tcp udp]讀取時進行"grep -v"操作。
你必需理解使用該程序從/proc/net/[tcp udp]得到的輸出的意義。假設系統運行有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 S 15:31 0:00 -bash
rexec 用來遠程執行knark-server的命令:
./rexec www.microsoft.com haxored.server.nu /bin/touch /LUDER
這命令將從www.microsoft.com:53發送一個偽裝的udp數據包到 haxored.server.nu:53,來運行haxored.server.nu的命令"/bin/touch /LUDER"
入侵者入侵以后往往將knark的各種工具存放在/dev/某個子目錄下創建的隱藏子目錄,如/dev/.ida/.knard等等。
檢測系統是否被安裝了Knark
Knark的作者Creed,發布了一個工具:knarkfinder.c來發現Knark隱藏的進程。
檢查系統是否安裝有Knark的 直接有效的方法是以非特權用戶身份來運行Knark的一個軟件包如:rootme,看該用戶是否能獲得root權限。由于目前Knark目前沒有認證機制,因此入股系統被安裝了Knark任何一個本地用戶運行這個程序都能獲得root權限。
還有一個 有效的發現系統是否被knark或者類似的rootkit所感染的方法就是使用kstat來檢測,具體參考本站的Nexeon寫的解決方案文章:檢測LKM rootkit。
Knark防范
防止knark 有效的方法是阻止入侵者獲得root權限。但是在使用一切常規的方法進行安全防范以后,防止knark之類的基于LKM技術的rootkit的方法是:
*創建和使用不支持可加載模塊的內核,也就是使用單塊內核。這樣knark就不能插入到內核中去了。
*使用lcap (http://pweb.netcom.com/~spoon/lcap/)實現系統啟動結束以后移除內核LKM功能,這樣可以防止入侵者加載模塊。然而這種方法存在一定的問題,入侵者可以在獲得root權限以后修改啟動腳本,在lcap啟動之前來加載knark模塊從而逃避lcap的限制。

![]() ![]() |
![]() |