2018年5月17日星期四

CVE-2018-8120 Analysis and Exploit

5月15日ESET发文其在3月份捕获了一个 pdf远程代码执行(cve-2018-4990)+windows本地权限提升(cve-2018-8120)的样本。ESET发文后,我从vt上下载了这样一份样本(https://www.virustotal.com/#/file/6cfbebe9c562d9cdfc540ce45d09c8a00d227421349b12847c421ba6f71f4284/detection)。初步逆向,大致明确如外界所传,该漏洞处于开发测试阶段,不慎被上传到了公网样本检测的网上,由ESET捕获并提交微软和adobe修补。测试特征字符串如下

定位样本中关键的代码并调试分析

可以知道漏洞产生于系统调用号为0x1226的内核函数NtUserSetImeInfoEx中,该函数调用SetImeInfoEx,在SetImeInfoEx内对参数1校验疏忽,产生了空指针解引用漏洞,相关触发代码逻辑如下:



相较于目前较为主流的gdi提权技术,该样本利用了安装系统调用门来实现内核权限提升。
首先,通过指令sgdt指令获取全局描述符表

申请0x400 bytes内存,构造调用门描述符

调用门描述符结构如下

调用门及mapping null page构造完毕后,开始触发漏洞安装调用门

此时寄存器数据如下

源数据如下

目的地址数据如下

可以看到安装了自身callgate及Ring0Function。安装完毕后(支持3环调用的CallGate),ring3程序调用调用门

找到对应的GDT表项

按照GDT表项的结构,分析样本安装的调用门描述符:
段选择子cs的值为0x1a8;
对应的Ring0Function的offset低地址为0x51b4;
对应的Ring0Function的offset高地址为0x80b9;
DPL为3  &  Gate Valid位为1
段选择子cs对应的结构如下,RPL级别为0,特权级别

根据上述结构定位gdt段描述符项

段描述符结构如下

3,4,5,8个字节得到段基址为0x0,结合上面的Ring0Func,得到Ring0Func的物理地址
Ring0Function很简单,直接ret,但此时ring3代码已具有ring0权限,因为这里没有恢复cs:

整个Far Pointer to Call Gate流程如下图:

中断在call far pointer,此时cs的值为0x1b

单步进入后,cs变为0x1a8(此时中断在我双机调试的windbg上)

如此替换本进程的token为system的token后,完成权限提升,最后恢复cs,并平衡堆栈后,再执行更多的ring3代码,否则容易BSOD。

分析过程中,我近95%的按照样本的思路还原了提权代码。



Source code

https://github.com/bigric3/cve-2018-8120



Thanks:

https://www.f-secure.com/weblog/archives/kasslin_AVAR2006_KernelMalware_paper.pdf
http://vexillium.org/dl.php?call_gate_exploitation.pdf


阅读更多博文 »

2018年5月14日星期一

CAJViewer Local Privilege Escape Exploit

源码面前,了无秘密:

https://github.com/bigric3/CAJViewer-LPE-Exploit.git


Key Point:



  1. PagedPool Overflow ;
  2. Heap Spray Private Namespace Object .




阅读更多博文 »

CVE-2017-11885 Analysis

早上看到cve-2017-11885公开了exploit(https://www.exploit-db.com/exploits/44616/),遂跟进分析下。

通过修改如下位置,触发RRAS服务崩溃
stub += "\xff\xff\xff\xff" 
#dwVarID ECX (CALL off_64389048[ECX*4]) -> p2p JMP EAX 
#dwVarID (_MIB_OPAQUE_QUERY)


也正如exp中注释"#0x1d MIBEntryGetFirst (other RPC calls are also affected)",定位崩溃点即iprtemgr.dll!RtrMgrMIBEntryGetFirst :
(通过xref可以验证作者所述,其他rpc调用同样存在类似漏洞)

在+6C位置下断,重新运行exp,通过wireshark抓取RRAS的数据包如下:

 同时od中断,下图的包括ECX在内的数据和原始exp有些差异,是我修改exp后的值

看到,eax指向的数据中,除了exp里的buf数据外,开头还包含了部分stub数据。回到作者的exp来看
stub += "\xad\x0b\x2d\x06" #dwVarID ECX (CALL off_64389048[ECX*4]) -> p2p JMP EAX #dwVarID (_MIB_OPAQUE_QUERY)
i think he want to call address,the address contains 'jmp eax' .

Here have a question,you should to search modules(e.g shell32.dll)for 'jmp eax' address,we call it address1,and then search an address contains the address1,because of ' call dword ptr ds:[] ',and we should consider that after 'jmp eax', there are some garbage code before shellcode execute,we should ensure these code can not cause DoS;

Besides,I think windows2003 sp2 have opened DEP,and eax contains data don't have execute privilege.

Last, I closed DEP, and find esp+0x8 contains value equal eax,just 4 test,Get one Shell

阅读更多博文 »