欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]一次不完美的0day,使用全新的方式利用btis服务com组件漏洞,成功提权至system

[原创]一次不完美的0day,使用全新的方式利用btis服务com组件漏洞,成功提权至system

我的poc能实现功能:需要管理员身份运行,在打满所有补丁的server2008或win7操作系统,能在bits服务上运行shellcode,最终获得一个system权限的cmd
我的poc实现原理:在windows下有个以system权限运行的Background Intelligent Transfer Service服务(简称bits),调用bits服务的公开api中的IBackgroundCopyJob->SetNotifyInterface接口,bits服务最终会调用loadregtypelib这个ole32下函数加载一个指定com组件的typelib(具体原理可参考CVE-2017-0213,这里省略),并且可以指定任意typlelib,loadregtypelib函数接着调用LoadTypeLibEx,具体可看我的逆向代码.

`HRESULT __stdcall LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind, ITypeLib **pptlib)

{

  wchar_t *szFileNameRef; // edi

  int hr; // esi

  int v5; // esi

  int v6; // eax

  OLECHAR *v8; // edi

  HRESULT stat; // esi

  void *v10; // [esp+Ch] [ebp-898h]

  ITypeLib **ptlibRef; // [esp+10h] [ebp-894h]

  ULONG pchEaten; // [esp+14h] [ebp-890h]

  LPMONIKER ppmk; // [esp+18h] [ebp-88Ch]

  LPBC ppbc; // [esp+1Ch] [ebp-888h]

  struct ILockBytes *v15; // [esp+20h] [ebp-884h]

  ITypeLib *ptlib; // [esp+24h] [ebp-880h]

  LPCOLESTR szFullPath; // [esp+28h] [ebp-87Ch]

  HFILE hFile; // [esp+2Ch] [ebp-878h]

  int v19; // [esp+30h] [ebp-874h]

  int v20; // [esp+38h] [ebp-86Ch]

  int v21; // [esp+3Ch] [ebp-868h]

  int v22; // [esp+40h] [ebp-864h]

  struct _IMAGE_DOS_HEADER v23; // [esp+48h] [ebp-85Ch]

  enum tagSYSKIND syskind; // [esp+88h] [ebp-81Ch]

  int v25; // [esp+8Ch] [ebp-818h]

  wchar_t Filename; // [esp+90h] [ebp-814h]

  wchar_t Dir; // [esp+290h] [ebp-614h]

  wchar_t PathResult; // [esp+490h] [ebp-414h]

  wchar_t Ext; // [esp+698h] [ebp-20Ch]

  wchar_t Drive; // [esp+898h] [ebp-Ch]

  szFileNameRef = szFile;

  ptlibRef = pptlib;

  ppmk = 0;

  if ( (regkind & 0x60) == 96 )

  {

    syskind = -1;

  }

  else if ( regkind & 0x20 )

  {

    syskind = 1;

  }

  else

  {

    syskind = (regkind & 0x40 | 0x20u) >> 5;

  }

  if ( regkind & 0xFFFFFF9F )

  {

    if ( (regkind & 0xFFFFFF9F) == 1 )

    {

      regkind = 1;

    }

    else if ( (regkind & 0xFFFFFF9F) == 2 )

    {

      regkind = 2;

    }

  }

  else

  {

    regkind = 0;

  }

  if ( !szFile || !pptlib || regkind > 2 )

    return -2147024809;

  *pptlib = 0;

  while ( 1 )

  {

    v15 = 0;

    ptlib = 0;

    InitLoadInfo(&szFullPath);

    hr = InitAppData();

    if ( hr < 0 )

      goto LABEL_60;

    if ( !*szFileNameRef )

    {

      hr = -2147287038;

      goto LABEL_60;

    }

    v5 = sub_6FC41A75();

    if ( v5 )

    {

      ptlib = OLE_TYPEMGR::LookupTypeLib(g_poletmgr, szFileNameRef, syskind);

      if ( ptlib )

        goto LABEL_31;

    }

    if ( FindTypeLib(szFileNameRef, &szFullPath, v5) )

    {

      if ( CreateBindCtx(1u, &ppbc) )

        goto LABEL_67;

      v8 = SysAllocString(szFileNameRef);

      if ( v8 )

      {

       //先根据它的DisplayName创建filemoniker

        stat = MkParseDisplayName(ppbc, v8, &pchEaten, &ppmk);

        SysFreeString(v8);

        if ( !stat )

        {

         //BindToObject调用来获取typelib

          stat = ppmk->lpVtbl->BindToObject(ppmk, ppbc, 0, &IID_ITypeLib, &ptlib);

          ppmk->lpVtbl->Release(ppmk);

        }

      }

      else

      {

        stat = -2147024882;

      }

      ppbc->lpVtbl->Release(ppbc);

      if ( stat )

      {

LABEL_67:

        hr = -2147312566;

        goto LABEL_60;

      }

      goto LABEL_28;

    }

    ptlib = OLE_TYPEMGR::LookupTypeLib(g_poletmgr, szFullPath, syskind);

    if ( ptlib )

    {

      UninitLoadInfo(&szFullPath);

LABEL_31:

      *ptlibRef = ptlib;

      return 0;

    }

    pchEaten = 0;

    ppbc = 0;

    if ( v22 )

    {

      hr = GetOffsetOfResource(hFile, "typelib", v21, &v23, &pchEaten, &ppbc);

      if ( hr < 0 )

        goto LABEL_60;

    }

    hr = CreateFileLockBytesOnHFILE(hFile, 0, pchEaten, ppbc, &v10, &v15);

    if ( hr < 0 )

      goto LABEL_60;

    hFile = -1;

    if ( v20 || v22 )

    {

      v6 = LoadTypeLib2LockBytes(v15, szFullPath, v25, v10, &ptlib, syskind);

      hr = v6;

      if ( v6 >= 0 )

      {

        if ( v15 )

        {

          v15->lpVtbl->Release(v15);

          v15 = 0;

        }

        goto LABEL_24;

      }

      if ( v6 != -2147319783 )

        goto LABEL_60;

    }

    if ( syskind != 3 )

      break;

    if ( ppmk

      || (_wsplitpath_s(szFileNameRef, &Drive, 3u, &Dir, 0x100u, &Filename, 0x100u, &Ext, 0x100u),

          _wcsicmp(&Filename, L"stdole32"))

      || _wcsicmp(&Ext, L".tlb") )

    {

      hr = -2147319783;

      goto LABEL_60;

    }

    _wmakepath_s(&PathResult, 0x104u, &Drive, &Dir, L"stdole2", &Ext);

    if ( v15 )

      v15->lpVtbl->Release(v15);

    UninitLoadInfo(&szFullPath);

    szFileNameRef = &PathResult;

    ppmk = 1;

  }

  hr = LoadTypeLib1LockBytes(&v15, szFullPath, v25, &ptlib);

  if ( hr >= 0 )

  {

LABEL_24:

    hr = OLE_TYPEMGR::TypeLibLoaded(g_poletmgr, szFullPath, v25, ptlib, syskind);

    if ( hr < 0 )

      goto LABEL_60;

    if ( regkind == REGKIND_DEFAULT && v19 || regkind == 1 )

      RegisterTypeLib(ptlib, szFullPath, 0);

LABEL_28:

    UninitLoadInfo(&szFullPath);

    *ptlibRef = ptlib;

    return 0;

  }

LABEL_60:

  if ( ptlib )

    ptlib->lpVtbl->Release(ptlib);

  if ( v15 )

    v15->lpVtbl->Release(v15);

  UninitLoadInfo(&szFullPath);

  return hr;

}`;

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功