본문 바로가기
보안/해킹 기법

[MS08-067] 공격 코드

by ITPro 2010. 8. 11.

[MS08-067] Server Service 취약점으로 인한 원격코드실행 문제

□ 영향
  o 공격자가 영향 받는 시스템에 대해 완전한 권한 획득
 
□ 설명
  o Server Service에 원격코드실행이 가능한 취약점이 존재
    ※ Server Service :Windows 운영체제에서 파일, 폴더 및 주변장치 등을 공유하기 위해
       지원하는 기능으로 네트워크의 다른 사용자들이 해당 리소스를 액세스할 수 있음
  o 공격자는 Server Service에 조작된 RPC 요청을 전달하여 공격함. 공격이 성공하면
    공격자는 영향 받는 시스템에 대해 완전한 권한 획득 가능
    ※ RPC(Remote Procedure Call) : 분산 환경에 컴퓨터간 서비스 요청에 사용되는 프로토콜
  o 관련취약점 : Server Service Vulnerability - CVE-2008-4250
  o 영향 : 원격 코드 실행
  o 중요도 : 긴급

□ 해당시스템 
  o 영향 받는 소프트웨어
    - Microsoft Windows 2000 SP4
    - Microsoft Windows XP SP2, SP3
    - Microsoft Windows XP Professional x64 Edition, SP2
    - Microsoft Windows Server 2003 SP1, SP2
    - Microsoft Windows Server 2003 SP1, SP2 for Itanium-based Systems
    - Microsoft Windows Server 2003 x64 Edition, SP2
    - Windows Vista, SP1
    - Windows Vista x64 Edition
    - Windows Server 2008, x64 Edition, Itanium-based Systems
 
□ 해결책 
  o 해당 시스템에 대한 마이크로소프트사의 취약점 패치 적용
  o TCP 139, 445 통신 포트가 반드시 필요한 경우가 아니면 방화벽에서 차단

□ 참조사이트
  o 영문 : http://www.microsoft.com/technet/security/bulletin/MS08-067.mspx




#include <wchar.h>

// This is the decompiled function sub_5B86A51B in netapi32.dll on XP SP3

int ms08_067(wchar_t* path)
{
  wchar_t* p;
  wchar_t* q;
  wchar_t* previous_slash = NULL;
  wchar_t* current_slash  = NULL;
  wchar_t  ch;

  // If the path starts with a server name, skip it

  if ((path[0] == L'\\' || path[0] == L'/') &&
      (path[1] == L'\\' || path[1] == L'/'))
  {
      p = path+2;

      while (*p != L'\\' || *p != L'/') {
          if (*p == L'\0')
              return 0;
          p++;
      }

      p++;

      // make path point after the server name

      path = p;

      // make sure the server name is followed by a single slash

      if (path[0] == L'\\' || path[0] == L'/')
          return 0;
  }

  if (path[0] == L'\0')   // return if the path is empty
      return 1;

  // Iterate through the path and canonicalize ..\ and .\

  p = path;

  while (1) {
      if (*p == L'\\') {
          // we have a slash

          if (current_slash == p-1)   // don't allow consequtive slashes
              return 0;

          // store the Locations of the current and previous slashes

          previous_slash = current_slash;
          current_slash = p;
      }
      else if (*p == L'.' && (current_slash == p-1 || p == path)) {
          // we have \. or ^.

          if (p[1] == L'.' && (p[2] == L'\\' || p[2] == L'\0')) {
              // we have a \..\, \..$, ^..\ or ^..$ sequence

              if (previous_slash == NULL)
                  return 0;

              // example: aaa\bbb\..\ccc
              //             ^   ^  ^
              //             |   |  &p[2]
              //             |   |
              //             |   current_slash
              //             |
              //             previous_slash

              ch = p[2];

              wcscpy(previous_slash, &p[2]);

              if (ch == L'\0')
                  return 1;

              current_slash = previous_slash;
              p = previous_slash;

              // find the slash before p

              // BUG: if previous_slash points to the beginning of the
              // string, we'll go beyond the start of the buffer
              //
              // example string: \a\..\

              q = p-1;

              while (*q != L'\\' && q != path)
                  q--;

              if (*p == L'\\')
                  previous_slash = q;
              else
                  previous_slash = NULL;
          }
          else if (p[1] == L'\\') {
              // we have \.\ or ^.\

              if (current_slash != NULL) {
                  wcscpy(current_slash, &p[1]);
                  goto end_of_loop;
              }
              else { // current_slash == NULL
                  wcscpy(p, p+2);
                  goto end_of_loop;
              }
          }
          else if (p[1] != L'\0') {
              // we have \. or ^. followed by some other char

              if (current_slash != NULL) {
                  p = current_slash;
              }
              *p = L'\0';
              return 1;
          }
      }

      p++;

end_of_loop:
      if (*p == L'\0')
          return 1;
  }
}

// Run this program to simulate the MS08-067 vulnerability

int main()
{
  return ms08_067(L"\\a\\..\\");
}

반응형

'보안 > 해킹 기법' 카테고리의 다른 글

Apache 다중 확장자 업로드 취약점  (0) 2012.05.01
Triple DES  (0) 2010.08.11
웹해킹 - 패킷 변조  (0) 2010.08.11
DrDOS  (0) 2010.08.11
Cookie 변조  (0) 2010.08.11

바로가기