歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix教程

Unix系統病毒概述

 

ELK CLONER:第一個計算機病毒

  它將會得到你磁盤上所有的東東,它甚至將滲透到芯片內部,這就是Cloner!

  它會象膠水一樣粘住你,它還會修改內存!

  計算機病毒是一種在大量的電子破壞技術手段中最著名的成員.他們實際上就是一些非常危險的惡意程序,他們是丑陋的,不過在我看來他們很可愛,原於我對Internet的駕馭和對計算機程序的探索.他們會復制自己並且可以傳染其它文件,直至現在,這些被傳染的文件甚至包括了那些很清白的文檔文件. 而且他們很容易獲得.他們可以隨處傳播,任何時間,任何地點.實際上,沒有一個OS可以完全抵御病毒的.一個病毒可以完全依靠系統本身進行復制,比如利用 Windows系列操作系統的pe格式的可執行文件和利用類unix操作系統的elf格式.所以,任何計算機病毒都依附於OS的體系結構,各種OS的病毒的寫法都不一樣,但任何OS也逃避不了病毒,包括Linux.

  正如以上所說,Linux也可以被感染.就象WindowsNT或者MacOS這樣的操作系統.不論是PC機上的DOS或Windows,或者是Amiga,都可以創造出病毒代碼.那麼,我們為什麼不來看看在Windos NT或Linux系統上的一些病毒呢?

  你也許會奇怪,事實上第一個計算機病毒是Unix病毒(有可能第一個就是ElkCloner,好象是編寫於1980到1982年之間). FredCohen在4BSD的VAX系統上編寫了一些非常早的Unix病毒,一年以後ElkCloner就誕生了.由於Unix系統具有內存保護機制, 所以人們不太相信Unix系統上的病毒的危害性會超過Windows和DOS系統,但他們錯了.

  一些公共的誤區

  一個最大的誤區就是很多高性能的安全系統對病毒蔓延的預防.因為我們是利用DOS系統和它本身並不存在任何內存保護機制和數據保護機制,我們認為病毒可以完全控制計算機的所有資源.是的,他們會很輕易的稱為DOS和簡單的Windows操作系統的完全控制用戶.沒有內存保護機制和數據保護機制, 計算機病毒可以奪取所有的計算機控制權.相對來說,WindowsNT和Unix系統是非常高級的保護機制的系統.這可以預防大多數的病毒的傳染,但不是所有的.當一個用戶以root或administrator的身份來操作的時候,這些系統的保護機制實際上是停止了的.一個設計的很巧妙的病毒可以利用自己的方法來找到文件系統上的每個文件;NT ownership或者ACL機制都沒有很好的重視這個問題.

  另一個誤區就是認為Linux系統尤其可以防止病毒的感染,因為Linux的程序都來自於源代碼,不是二進制格式.這才應該值得重視,因為畢竟只有極少數的人(甚至管理員)才有足夠的能力來從源代碼中發現病毒代碼,而且這是一個相當耗費時間和精力的工作.一般的用戶習慣於用二進制格式的文件來交流,因為他們不想在使用這些程序的時候還要很繁瑣的執行諸如make config;make之類的命令,他們喜歡很簡單的運行程序.所有的這些原因就給了Unix系統上的病毒有足夠的空間來訪問和操控系統.

第三個誤區就是認為Unix系統是絕對安全的,因為它具有很多不同的平台,而且每個版本的Unix系統有很大的不一樣.但是現在不能這樣看了.現在的病毒都用標准C來編寫以適應任何類Unix操作系統, 並且他們可以用make程序來跨平台編譯.想想那個Morris寫的internet的蠕蟲病毒利用的就是這項技術.並且擁有標准的ELF二進制格式和庫文件.

  Shell腳本

  我們面臨的第一個問題就是如何傳播的問題,這是天生具有的問題,至少在Unix系統上是如此,我們需要想辦法使各個平台兼容.所以我們首先想到的是:shell腳本語言.shell在不同的Unix系統上面的差別很小.所以FredCohen在他的書:入侵者,蠕蟲和病毒(發表於1990年)寫到:"在unix的命令解釋語言中,病毒代碼可以被寫到200個字節之內".也許我們可以根據他的話來寫 一個man page的病毒腳本,可以用來操作文件和可執行程序.這和宏病毒非常相像.man page的病毒不會蔓延到別的系統上,除非你有為別的用戶改變man page的格式的習慣.無論如何,這種病毒都是一個公共的跨系統的病毒.同樣,也可以寫另個一個腳本病毒來控制mail的閱讀者.

  書寫shell腳本病毒是一個很簡單的制造Unix病毒的方法.我知道肯定會有很多同行會說,腳本病毒怎麼會是真正的病毒呢?它只是用腳本語言來書寫的而不是用匯編.但是實際上,我們評定一個病毒是病毒本身可以在系統上任意感染傳播,而不是這個病毒的大小或者用什麼語言來寫的.在 USENIX1989 卷2上你可以看到Tom Duff和M. Douglas McIlroy的腳本病毒代碼.shell腳本病毒的危害性不會很大並且它本身極易被破壞,因為它是以明文方式編寫並執行的,任何用戶和管理員都可以發覺它的代碼.但是,我想大多數的用戶都不會理解一下代碼的吧:

for %%f in (*.bat) do copy %%f + bfv.bat

  通常一個用戶會深信不疑的去執行任何腳本,而且不會過問該腳本的由來.這樣,這些用戶都成為病毒的目標了;這些都是用戶的意識問題,這樣是沒辦法避免病毒的入侵的,所以我們的用戶需要大大加強對這些病毒的防范意識.

  蠕蟲

  另外的一個影響廣泛的技術就是蠕蟲,想象一下Morris蠕蟲:利用攻擊程序--一般這些攻擊程序都是已經存在的技術.這個蠕蟲利用一個 sendmail程序已存在的一個漏洞來獲取其它機器的控制權.病毒一般會利用rexec,fingerd或者口令猜解來嘗試連接.在成功入侵之後,它會編譯在目標機器上編譯源代碼並且執行它.而且會有一個程序來專門負責隱藏自己的腳印.Internet的蠕蟲病毒一般都是利用已知的攻擊程序去獲得目標機的管理員權限.但是蠕蟲的生命也是很短暫的,當該病毒所利用的漏洞被修補的話,那麼該蠕蟲也就失去它的作用了,因為他們需要利用exploit這個媒介來進行自身的復制.而exploit又是只針對特定版本的特定程序才會有效的,所以蠕蟲的跨平台能力很差,時效性也很弱.

欺騙庫函數

  我們可以愚弄那些比較傻的用戶.如果你利用LD_PRELOAD環境變量來捉弄他,你可以讓他執行你自己的代碼,你已經利用 LD_PRELOAD環境變量把標准的庫函數替換成了你自己的程序.挺有意思吧?LD_PRELOAD並不是linux系統特有的並且它一般用在一些應用程序(比如老版本的StarOffice需要運行在較新版本的Redhat系統上)必須用他們自己的(或者比較老的版本,或者修改過的)庫函數,因為在安裝的時候沒有滿足他們的需求.Quantum(Staog病毒的作者)在Unix病毒的郵件列表裡面提供了這些代碼,我做了修改,也是為了便於大家理解:

------------------------tryld.c------------------------------------
extern int __open(char *, int, int);
extern int execv(char *, char *[], char *envp[]);

int open(char *path, int flags,
int mode){
printf("open: %s\n", path);
return __open(path, flags, mode);
}

/* 注意這裡,原來它放棄了envp參數,這樣會...:(?!
呵呵,所以我修改了一下,影響不大:)*/
int execve(char *path, char *args[],
char *envp[]){
printf("execve: %s\n", path);
return execv(path, args, envp);
}
-------------------------------------------------------------------

------------------------main.c-------------------------------------
/*test only,by e4gle*/
#include
#include
#include
#include

main()
{
int fd;
execve("/bin/date","",NULL);
if(fd=open("/etc/inittab",O_RDONLY)!=-1)
{
fprintf(stdout,"open file succeed!\n");
}
else
fprintf(stderr,"open error!\n");
close(fd);
return 0;
}
-------------------------------------------------------------------
這段代碼獲取open和execv並且改變了它們的輸出,好,我們測試一下:

[e4gle@redhat62 elf]$ gcc -o main main.c 
[e4gle@redhat62 elf]$ ./main 
open file succeed! <--證明我們打開文件成功了,open調用正常工作 
[e4gle@redhat62 elf]$ ldd -v -r ./main 
libc.so.6 => /lib/libc.so.6 (0x4001c000) 
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 

Version information: 
./main: 
libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 
/lib/libc.so.6: 
ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2 
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 
ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2 
/*跟蹤一下庫函數的利用,都是glibc的標准庫函數,solaris裡面是sotruss,我個人認為sotruss 
比較好用:)*/ 
[e4gle@redhat62 elf]$ gcc -shared -o tryld tryld.c 
[e4gle@redhat62 elf]$ export LD_PRELOAD=./tryld <--用我們自己的lib 
[e4gle@redhat62 elf]$ ./main 
execve: /bin/date 
open: /etc/inittab 
open file succeed! 
/*注意!不一樣了吧?已經在用我們自己的open和execve了,呵呵:)*/


  以上僅僅是個測試代碼並且沒有任何危害性,但是它足以說明我們利用欺騙函數庫來攻擊程序的原理.

內核級的傳播

  這裡我們稱作"內核級別的病毒",病毒可以傳染內核映像,這樣病毒可以控制系統的方方面面.但是這種病毒技術目前尚處於理論階段,並沒有真正實現,但並不代表以後都不會出現.

  與平台兼容的病毒

  如果我們用標准C來書寫病毒代碼的話,各種不同體系的Unix系統對於我們來說變化不大.我們只需要對方計算機有一個C編譯器.這樣的病毒可以很輕易的擴散,利用普通用戶的.rhosts文件這種小技倆就可以做到.假如沒有exploits(是有可能的,因為病毒是跨平台的,因而它可以不借助 Exploit來四處擴散),這種可以跨平台的病毒的傳染面是非常廣的,而且似乎根本沒有結束的時候.

  當然,很多病毒都還是用匯編來編寫的.有很多著名的病毒,但不是第一個Linux病毒Bliss,第一次發表於1997年.Bliss傳染 ELF格式的二進制文件,但是並沒有太多的傷害.它甚至可以利用被感染文件的--bliss-disinfect-files-please參數來卸載. 假如你需要在你的文件裡查找Bliss,注意以下字段:

E8ABD8FFFFC200003634 65643134373130363532

  最早的Linux病毒是Staog,比Bliss早半年.它用匯編書寫並且利用三個/dev/kmem的exploits來獲得的特權,它可以感染任何文件並且可以傳播. 它的關鍵字段:

215B31C966B9FF0131C0 884309884314B00FCD80

  當我們利用ELF格式的二進制文件來做病毒:這種病毒被譽為計算機病毒中的標准模式--他們用匯編編寫並且它們通過可執行程序感染,很象典型的 DOS下的病毒.可以通過往elf文件的文本段之後的填充區增加代碼來感染ELF文件,搜索目錄樹中文件的ET_EXEC和ET_DYN標記看看是否被隱藏(這些依靠管理員自身的經驗).

  當然,在Linux系統下實現這種病毒並不太容易.一個病毒感染的文件屬於是普通用戶權限的話,那麼病毒所得到的權限當然也就只有普通用戶權限 (並且病毒不會利用Exploit來提升權限),只能對該用戶權限級別的文件和數據造成危害.但是當一個病毒感染了一個root權限的文件的話,那麼它就可以控制系統的一切了.

  我們安全麼?

  一個很實際的問題.現在我們的Linux系統還可能比較安全.但以後不代表一致這樣.Linux系統越來越流行,這將引來一大批的病毒制造者的目光.很多用戶都有可能是潛在的病毒制造者,而且如果把Unix的很多用戶對Unix本身的了解正在減少算在內的話,我們就麻煩了.現在已經有了一些 Linux系統上的反病毒程序.現在甚至包括我還有很多Unix的系統管理員在內都對制造反病毒程序非常感興趣.在一個蠕蟲出現之後,我們可以查閱各種文檔,甚至書籍.所以我們都一直也在努力著.

  最後一個很具諷刺的玩笑:我們具有真正有效的Linux反病毒程序,那麼微軟的outlook/exchange等也和Linux聯合了,我們也就真正安全了,可能麼?呵呵.

Copyright © Linux教程網 All Rights Reserved