应用Foxit Reader的PDF Printer完成提权 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用Foxit Reader的PDF Printer完成提权

申博_安全预警 申博 129次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

客岁年中,我在一篇文章中报告了在Foxit Reader中发掘UAF破绽的历程,和怎样应用该破绽发送长途代码实行进击。以后,我又在一篇文章中引见了Foxit Reader SDK ActiveX中的一个敕令注入破绽。本着不摒弃不扬弃的精力,在同年晚些时候我又对Foxit Reader的一个新组件举行了深切的研讨。令我惊奇的是,在这个组件中又发明了几个许可有限提拔权限的破绽,个中一个破绽特别严峻,以是,本文就诞生了。

择要

我们将经由过程发送一个经心组织的proxyDoAction要求,来细致考核CVE-2018-20310(它是位于PDF Printer中的一个基于客栈的缓冲区溢出破绽)的进击向量、破绽剖析和应用要领。

软件版本

文中形貌的要领已经在9.3.0.912版本的Foxit Reader软件举行了测试,个中FoxitProxyServer_Socket_RD.exe二进制文件的SHA1值为:0e1554311ba8dc04c18e19ec144b02a22b118eb7。该版本是撰写本文时的最新版本。

进击向量

PDF Printer是Foxit Reader中的一个功用,主要用于处置惩罚来自应用顺序的PDF文件打印要求。装置Foxit Reader后,Foxit PDF Printer就会成为处置惩罚打印功课的默许打印机。

 

应用Foxit Reader的PDF Printer完成提权

从Chrome打印文档

这现实上意味着FoxitProxyServer_Socket_RD.exe二进制文件启动后,会在中等完整性级别运转少焉。

应用Foxit Reader的PDF Printer完成提权

从应用顺序打印文档时,FoxitProxyServer_Socket_RD.exe将在中等完整性级别运转

只在这个级别运转少焉的原因是服务器默许监听localhost端口50000而且只接收一个要求。一旦发出要求,它就会封闭端口并停止实行。当用户实验运用Foxit PDF Printer打印到PDF时,进击者就能够或许在衬着选项卡中实行代码。

在对该题目举行深切考核以后,发明能够从沙盒历程发出未公开的ALPC要求,以运用默许打印机启动打印功课。这意味着,进击者基础不须要向FoxitProxyServer_Socket_RD.exe二进制文件发送合作要求。

破绽剖析

在从浏览器打印页面时,我们截获了很多发送到端口50000的要求样本;今后,我们又发明了一个主要的函数,即sub_41DBA0。

应用Foxit Reader的PDF Printer完成提权

sub_41DBA0的代码流程

这个函数用于处置惩罚多种分歧范例的要求,个中,响应的处置惩罚顺序在上图顶用蓝色凸起加以显现,个中包孕:

· proxyDoAction

· proxyPreviewAction

· proxyPopupsAction

· proxyCPDFAction

· proxyUpdatePreview

· proxyFinishPreview

· proxyCollectSysFont

· proxyGetImageSize

· proxyCheckLicence

· proxyGetAppEdition

· proxyInitLocalization

· proxyCreateDirectoryCascade

· proxyIEMoveFileEx

· proxySendFileAsEmailAttachment

虽然个中一些处置惩罚顺序确实是高度可应用的,但其实不老是能够或许到达易受进击的API,这里,我们将以proxyIEMoveFileEx为例举行引见。该函数接收三个参数,它现实上就是一个MoveFileExW挪用,而且没有对参数举行任何搜检。不外,由于它没法准确剖析供应的数据包构造,因而,该函数现实上是没法应用的。一般情况下,软件开发人员在宣布软件之前会举行响应的测试,以确保它们能一般事变!以下是这个底层API地点的地位:

2019第四届SSC安全峰会|议题征集正式启动

SSC安全峰会于2016年创办于西安,每年举办一届,迄今为止已成功举办了三届,得到了行业充分认可和社会各届广泛关注,成为我国中西部最具盛名,影响力最大,知名度最高的网络安全峰会,进一步推动了陕西及整个西北地区的信息安全产业发展

.text:00420C85 loc_420C85:                             ; CODE XREF: sub_420930+331
.text:00420C85                 push    ebx             ; dwFlags
.text:00420C86                 push    edi             ; lpNewFileName
.text:00420C87                 push    eax             ; lpExistingFileName
.text:00420C88                 call    ds:MoveFileExW

在举行了越发深切的逆向剖析以后,我们发明proxyDoAction也是一个非常让人感兴趣的函数,由于进击者能够应用它的操纵码到达5条分歧的代码途径。以下是搜检要求数据包中的proxyDoAction字符串的相干代码:

应用Foxit Reader的PDF Printer完成提权

 sub_41DBA0函数会搜检proxyDoAction要求

也就是说,只需能够或许供应准确花样的要求,我们终究能够到达该处置惩罚顺序:

应用Foxit Reader的PDF Printer完成提权

用于到达处置惩罚顺序的proxyDoAction要求

在处置惩罚顺序内部,我们能够看到它具有3个参数:

 

应用Foxit Reader的PDF Printer完成提权

sub_41E190函数会对3个参数举行搜检

经由过程深切考核该函数,处置惩罚第三个参数的代码以下所示:

.text:0041E407                 mov     esi, [eax]               ; eax is a ptr to our buffer
.text:0041E409                 jmp     short loc_41E421         ; take jump
.text:0041E40B ; ---------------------------------------------------------------------------
.text:0041E40B
.text:0041E40B loc_41E40B:                                      ; CODE XREF: sub_41E190+275
.text:0041E40B                 xor     esi, esi
.text:0041E40D                 test    eax, eax
.text:0041E40F                 jnz     short loc_41E421
.text:0041E411                 call    sub_64BE4A
.text:0041E416                 mov     dword ptr [eax], 16h
.text:0041E41C                 call    sub_65015F
.text:0041E421
.text:0041E421 loc_41E421:                                      ; CODE XREF: sub_41E190+279
.text:0041E421                                                  ; sub_41E190+27F
.text:0041E421                 lea     eax, [edi+4]             ; calculate offset to src ptr
.text:0041E424                 mov     [ebp+var_80_opcode], 0   ; initialize dst buffer
.text:0041E42B                 add     eax, ebx                 ; recalculate offset to src ptr
.text:0041E42D                 lea     ecx, [ebp+var_80_opcode] ; fixed buffer of size 0x4
.text:0041E430                 push    esi                      ; size, controlled from our buffer
.text:0041E431                 push    eax                      ; src ptr to copy from
.text:0041E432                 mov     edx, esi
.text:0041E434                 call    sub_41CB30               ; call sub_41CB30
.text:0041E439                 add     esp, 8
.text:0041E43C                 push    [ebp+var_80_opcode]      ; opcode
.text:0041E43F                 push    [ebp+var_84]             ; int
.text:0041E445                 push    [ebp+lpFileName]         ; lpFileName
.text:0041E44B                 call    sub_4244C0               ; proxyDoAction second handler

对sub_41CB30的挪用看起来非常可疑,由于它运用长度值和源缓冲区作为参数。别的,我们能够看到,目的缓冲区是存储在ecx中的。当我们考核sub_41CB30函数时,能够看到它实行了哪些操纵:

.text:0041CB30 sub_41CB30      proc near                        ; CODE XREF: sub_41D500+185
.text:0041CB30                                                  ; sub_41D740+11A
.text:0041CB30
.text:0041CB30 arg_0_src       = dword ptr  8
.text:0041CB30 arg_4_size      = dword ptr  0Ch
.text:0041CB30
.text:0041CB30                 push    ebp
.text:0041CB31                 mov     ebp, esp
.text:0041CB33                 push    esi
.text:0041CB34                 mov     esi, [ebp+arg_4_size]    ; store controlled size in esi

如上所示,sub_41CB30将经由过程参数源缓冲区、目的缓冲区和长度来挪用sub_645BD0函数。个中,源缓冲区和长度这两个参数完整处于进击者的掌握之下,而目的缓冲区则是sub_41E190函数的当地客栈变量。

.text:0041CB61 loc_41CB61:                                      ; CODE XREF: sub_41CB30+16
.text:0041CB61                 push    ebx
.text:0041CB62                 mov     ebx, [ebp+arg_0_src]     ; set the src in ebx
.text:0041CB65                 test    ebx, ebx
.text:0041CB67                 jz      short loc_41CB7F
.text:0041CB69                 cmp     edi, esi
.text:0041CB6B                 jb      short loc_41CB7F
.text:0041CB6D                 push    esi                      ; size
.text:0041CB6E                 push    ebx                      ; src
.text:0041CB6F                 push    ecx                      ; dst
.text:0041CB70                 call    sub_645BD0               ; call sub_645BD0

从某种程度上说,sub_645BD0函数就是memcpy函数的一种内联的自定义完成,终究,我们将实行以下代码块:

.text:00645C14 loc_645C14:                                      ; CODE XREF: sub_645BD0+2F
.text:00645C14                 bt      dword_932940, 1
.text:00645C1C                 jnb     short loc_645C27
.text:00645C1E                 rep movsb                        ; stack buffer overflow!
.text:00645C20                 mov     eax, [esp+8+arg_0]
.text:00645C24                 pop     esi
.text:00645C25                 pop     edi
.text:00645C26                 retn

触发破绽

由于我们能够在沙箱以外运转可实行文件,因而,运用以下敕令来调试应用顺序的话,会更轻易一些:

C:\>cdb -c "g;g" "C:\Program Files (x86)\Foxit Software\Foxit Reader\Plugins\Creator\FoxitProxyServer_Socket_RD.exe" 50000

默许情况下,该应用顺序将运用端口50000,不外,我们也能够经由过程敕令指定端口。

应用Foxit Reader的PDF Printer完成提权

在沙箱外触发SRC-2019-0025/CVE-2018-20310破绽

简朴来讲,这里须要发送一个经心组织的、作为操纵码的要求,其缓冲区巨细为0x1000字节,从而触发基于客栈的缓冲区溢出。

破绽应用

我们没法直接应用SEH处置惩罚顺序:

应用Foxit Reader的PDF Printer完成提权

运用SafeSEH选项编译FoxitProxyServer_Socket_RD.exe

别的,若是我们再次深切考核proxyDoAction处置惩罚顺序,我们会发明,该函数末端有一个对sub_43AE57的挪用。

.text:0041E510 loc_41E510:                                      ; CODE XREF: sub_41E190+8E
.text:0041E510                                                  ; sub_41E190+9E
.text:0041E510                 mov     ecx, [ebp+var_C]
.text:0041E513                 mov     large fs:0, ecx
.text:0041E51A                 pop     ecx
.text:0041E51B                 pop     edi
.text:0041E51C                 pop     esi
.text:0041E51D                 pop     ebx
.text:0041E51E                 mov     ecx, [ebp+var_14]
.text:0041E521                 xor     ecx, ebp                 ; xor cookie with frame pointer
.text:0041E523                 call    sub_43AE57
.text:0041E528                 mov     esp, ebp
.text:0041E52A                 pop     ebp
.text:0041E52B                 retn    4
.text:0041E52E ; -----------------------

正如您所预测的那样,它会举行cookie搜检:

.text:0043AE57 sub_43AE57      proc near                        ; CODE XREF: sub_413FA0+5D
.text:0043AE57                                                  ; sub_413FA0+7B
.text:0043AE57                 cmp     ecx, ___security_cookie  ; bummer
.text:0043AE5D                 repne jnz short loc_43AE62
.text:0043AE60                 repne retn
.text:0043AE62 ; ---------------------------------------------------------------------------
.text:0043AE62
.text:0043AE62 loc_43AE62:                                      ; CODE XREF: sub_43AE57+6
.text:0043AE62                 repne jmp sub_43B739
.text:0043AE62 sub_43AE57      endp

然则,若是我们细致研讨这个易受进击的函数,就会发明一些风趣的器械:

.text:0041E4A2 loc_41E4A2:                                      ; CODE XREF: sub_41E190+2F0
.text:0041E4A2                 mov     byte ptr [ebp+var_4], 8
.text:0041E4A6                 cmp     [ebp+var_24], 0
.text:0041E4AA                 jnz     short loc_41E4B8
.text:0041E4AC                 mov     ecx, [ebp+var_28]        ; code execution primitive 1
.text:0041E4AF                 test    ecx, ecx
.text:0041E4B1                 jz      short loc_41E52E
.text:0041E4B3                 mov     eax, [ecx]
.text:0041E4B5                 call    dword ptr [eax+8]        ; eop
.text:0041E4B8
.text:0041E4B8 loc_41E4B8:                                      ; CODE XREF: sub_41E190+31A
.text:0041E4B8                 mov     byte ptr [ebp+var_4], 9
.text:0041E4BC                 mov     ecx, [ebp+var_28]        ; code execution primitive 2
.text:0041E4BF                 test    ecx, ecx
.text:0041E4C1                 jz      short loc_41E4DB
.text:0041E4C3                 mov     edx, [ecx]
.text:0041E4C5                 lea     eax, [ebp+var_4C]
.text:0041E4C8                 cmp     ecx, eax
.text:0041E4CA                 setnz   al
.text:0041E4CD                 movzx   eax, al
.text:0041E4D0                 push    eax
.text:0041E4D1                 call    dword ptr [edx+10h]      ; eop

若是我们应用客栈溢出掩盖var_28但不掩盖返回地点或非常处置惩罚顺序,那末我们就能够或许捏造一个工具,并经由过程vtable挪用来重定向代码实行流程。

这类要领是切实有效的,由于VAR_28在客栈中的地位较低:

-00000080 var_80_opcode   dd ?                    ; pwned
-0000007C var_7C          db 36 dup(?)               |
-00000058 var_58          dd ?                       |   overflow direction
-00000054 var_54          db 8 dup(?)                |
-0000004C var_4C          db 36 dup(?)               v
-00000028 var_28          dd ?                    ; pwned also!
-00000024 var_24          db 8 dup(?)
-0000001C var_1C          dq ?
-00000014 var_14          dd 2 dup(?)
-0000000C var_C           dd 2 dup(?)
-00000004 var_4           dd ?

变量var_80_opcode的客栈巨细为0x80 – 0x7c = 0x4字节。如许的话,事变就变得更轻易了!下面,让我们看一下溢出之前的代码:

.text:0041E34D loc_41E34D:                                                  ; CODE XREF: sub_41E190+1A2
.text:0041E34D                                                              ; sub_41E190+1AB
.text:0041E34D                 lea     eax, [esi+1]
.text:0041E350                 add     ebx, 4
.text:0041E353                 push    eax
.text:0041E354                 call    sub_43AEAB
.text:0041E359                 mov     [ebp+var_84], eax
.text:0041E35F                 add     esp, 4
.text:0041E362                 lea     eax, [ebp+var_84]
.text:0041E368                 mov     [ebp+var_E4], offset off_8F3140
.text:0041E372                 mov     [ebp+var_E0], eax
.text:0041E378                 lea     eax, [ebp+var_E4]
.text:0041E37E                 mov     [ebp+var_C0], eax
.text:0041E384                 lea     eax, [ebp+var_4C]                    ; overflowed pointer loaded
.text:0041E387                 mov     [ebp+var_28], 0
.text:0041E38E                 mov     [ebp+var_90], eax
.text:0041E394                 push    eax
.text:0041E395                 lea     ecx, [ebp+var_E4]
.text:0041E39B                 mov     byte ptr [ebp+var_4], 5
.text:0041E39F                 call    sub_421D60
.text:0041E3A4                 mov     [ebp+var_28], eax                    ; bingo! We can fake an object!!
.text:0041E3A7                 mov     [ebp+var_24], 0
.text:0041E3AB                 mov     byte ptr [ebp+var_4], 6
.text:0041E3AF                 mov     ecx, [ebp+var_C0]
.text:0041E3B5                 test    ecx, ecx
.text:0041E3B7                 jz      short loc_41E3DA

因而,我们能够应用var_4C(它将发作溢出)来捏造一个工具,由于指向该工具的指针稍后将存储到var_28中。这就意味着我们只需溢出0x80- 0x4cC=0x34字节便可!如今,若是我们更新poc,就能够或许损坏客栈上的变量偏重定向实行流程:

应用Foxit Reader的PDF Printer完成提权

掌握eip

固然,我们还必须面临ASLR所带来的题目,不外,这里我们不盘算对其穷究,由于该破绽的影响无论怎样都是有限的。不外,这倒是一个很好的例子,申明纵然才去了恰当的安全措施,仍然会涌现安全题目。

别的,我们还运用@zeroSteiner供应的修改版mayhem库将poc注入到了沙盒历程(和python)中,以向Foxit开发人员展现该破绽的现实影响。

若是要对其举行测试,能够下载poc触发器。

小结

这不仅仅是Foxit Reader中的一个破绽的题目,而是第三方应用顺序应该在多大程度上信托装置的打印服务器的题目。别的,我们发明,研讨新的或未经探究的组件一般能发掘到高度可应用的安全破绽,然则关于研讨人员来讲,猎取关于接口的接见权限多是这里最难的应战。

2019第四届SSC安全峰会|议题征集正式启动

SSC安全峰会于2016年创办于西安,每年举办一届,迄今为止已成功举办了三届,得到了行业充分认可和社会各届广泛关注,成为我国中西部最具盛名,影响力最大,知名度最高的网络安全峰会,进一步推动了陕西及整个西北地区的信息安全产业发展


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用Foxit Reader的PDF Printer完成提权
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址